![]() |
Baumstruktur mit fehlern :(
hi
ich will eine Baumstruktur aufbauen. jeder knoten soll 0-4 kinder haben. das ganze soll nachher auf eine paintbox gemalt werden. (konkret geht es um die darstellung von Alkanen (zb Methan, Butan, Propan)) dazu habe ich mir folgenden typ gemacht:
Delphi-Quellcode:
und das ganze in eine TList geschmissen.
type
TNode = record Parent: Pointer; ChildCount: Byte; Childs: array [1..4] of Pointer; x,y: Integer; end;
Delphi-Quellcode:
nur leider kommen total bekloppte x/y-werte heraus....
procedure AddNode(Parent: Pointer; PX, PY, Count: Integer);
var Temp: TNode; i:Integer; begin for i:=1 to Count do begin Temp.ChildCount:=StrToInt(InPutBox('Childs','ChildCount','1')); Temp.Parent:=Parent; {1: 0, 1 2: 1, 0 3: 0,-1 4:-1, 0} Temp.x:=PX - (i-2); Temp.y:=PY - (i-3); Form1.Nodes.Add(@Temp); AddNode(@Temp.Childs[i], Temp.x, Temp.y, Temp.ChildCount); end; end; procedure DrawAgain; //malen var i: Integer; begin with Form1 do for i:=0 to Nodes.Count-1 do with TNode(Nodes.Items[i]^) do PaintBox1.Canvas.Arc(x*10,y*10,x*10+8,y*10,x*10,y*10+8,x*10+8,y*10+8); end; procedure TForm1.Button1Click(Sender: TObject); //Neu eingeben var Temp: TNode; Parent: Pointer; begin AddNode(nil,0,0,1); DrawAgain; end; procedure TForm1.Button2Click(Sender: TObject); //Debug var i:Integer; begin for I:=0 to Nodes.Count-1 do with TNode(Nodes.Items[i]^) do ListBox1.Items.Add(IntToStr(x)+' '+IntToStr(y)); end; zb: //Button1Click eingabe: 2,0,0 //Button2Click 1242936, 4368756 1, 0 1, 0 und natürlich geht dann auch das malen schief... wo ist der fehler im code? |
Re: Baumstruktur mit fehlern :(
Zitat:
du kannst nicht einfach mit Zeigern auf lokale Variablen arbeiten. Die werden vom Laufzeit-Prolog deiner Prozedur auf dem Stack angelegt und verlieren ihre Gültigkeit in dem Augenblick, in dem deine Prozedur verlassen wird. Versuche die Variable Temp auf dem Heap anzulegen. Grüße vom marabu |
Re: Baumstruktur mit fehlern :(
Zitat:
Zitat:
"heap", schon mal gehört, aber mehr auch nicht.... EDIT: also globale variablen nehmen? wie soll ich das am besten machen? |
Re: Baumstruktur mit fehlern :(
Zitat:
Delphi-Quellcode:
Da du gefragt hast, wie du es am BESTEN machen kannst: Dein Code schubst Bits im Speicher hin und her. Wenn du chemische Strukturformeln zeichnen möchtest, dann wäre es schön, wenn man das am Vokabular erkennen könnte. Ich würde da Molecule, CH4, Bindung erwarten und nicht Baum, Knoten, etc.
type
PNode = ^TNode; var node: PNode; begin New(node); ... Dispose(node); end; Du solltest versuchen die Problemsphäre mehr von der Implementierung zu trennen. Am leichtesten geht das mit OOP-Sprachmitteln, aber ich möchte dich nicht zu sehr verwirren. Die Liste als Speicherstruktur für dein Alkan-Molekül dürfte nicht ganz angemessen sein, da du ohne Bindungsparameter keine Isomere beschreiben kannst. Grüße vom marabu |
Re: Baumstruktur mit fehlern :(
also, das ganze ist so gedacht:
jeder Node repräsentiert ein C-Atom. die Childs beschreiben weitere C-Atome, Parent den Ursprung. alle übrigen Childs sollen mit H-Atomen aufgefüllt werden beim zeichnen. so dass zb folgendes
Code:
diese Nodes ergibt:
H H H H
| | | | H - C - C - C - C - H | | | | H H H-C-H H | H
Code:
Pointer | Parent | Childs | ChildCount
1 | 0 | 2 | 1 2 | 1 | 3 | 1 3 | 2 | 4,5 | 2 4 | 3 | 0 | 0 5 | 3 | 0 | 0 |
Re: Baumstruktur mit fehlern :(
Hast du irgenwelche Einschränkungen im Hinblick auf die Isomerie gemacht? Ansonsten hier ein paar Testfälle für deinen Lösungsansatz. Ich habe die Wasserstoffbrücken weggelassen.
3,4-DiMethylHeptan
Code:
CycloButan
C - C - C - C - C - C
| | C C | C
Code:
Grüße vom marabu
C - C
| | C - C |
Re: Baumstruktur mit fehlern :(
nein, es soll keine einschränkung in der isomerie geben.
Cyclo-Alkane sind ein sonder-fall den ich (zunächst) nicht aufnehmen will. Zitat:
|
Re: Baumstruktur mit fehlern :(
Zitat:
Für wen möchtest du das Programm schreiben? Nur für dich oder sollen auch andere Benutzer damit umgehen können? Welche Kenntnisse kannst du bei den späteren Benutzern voraussetzen? Oder ist das eine gestellte Aufgabe mit vorgegebenem Schwerpunkt - z.B. unbedingt keine OOP Sprachmittel und nur statische Speicherstrukturen verwenden? Ich sollte darüber etwas mehr wissen, damit ich dich nicht aus Versehen in die Wüste schicke. Grüße vom marabu |
Re: Baumstruktur mit fehlern :(
Wenn du Strukturformeln beschreiben willst, da hab' ich mir
![]() Wie das dann mit dem Zeichnen aussieht, kann ich dir aber nicht sagen ... |
Re: Baumstruktur mit fehlern :(
also:
ich habe nichts gegen OOP, also gerne als Klasse verpackt. als eingabe hatte ich mir folgendes vorgestellt (weiss noch nicht ob und wie zu machen): eine TPaintBox mit PopUpMenu es wird ein ursprungs-C erstellt auf rechtsclick wird geprüft ob der mauszeiger auf nem C ist, wenn da dann wird ein Menü gezeigt "Neue Verbindung", "Löschen", etc. alles soll über dieses Menü gemacht werden (können) zur speicherstruktur habe ich wie gesagt keine gute idee, daher meine frage. den link werde ich mir ansehen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz