AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Baumstruktur mit fehlern :(

Ein Thema von glkgereon · begonnen am 26. Apr 2005 · letzter Beitrag vom 30. Apr 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Baumstruktur mit fehlern :(

  Alt 26. Apr 2005, 15:06
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:
type
  TNode = record
    Parent: Pointer;
    ChildCount: Byte;
    Childs: array [1..4] of Pointer;
    x,y: Integer;
  end;
und das ganze in eine TList geschmissen.

Delphi-Quellcode:
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;
nur leider kommen total bekloppte x/y-werte heraus....
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?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Baumstruktur mit fehlern :(

  Alt 27. Apr 2005, 13:26
Zitat von glkgereon:
Delphi-Quellcode:
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'));
    ...
Hi,

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
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#3

Re: Baumstruktur mit fehlern :(

  Alt 27. Apr 2005, 13:33
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.
asooo....
Zitat:
Versuche die Variable Temp auf dem Heap anzulegen.
wie geht das?
"heap", schon mal gehört, aber mehr auch nicht....

EDIT:

also globale variablen nehmen?
wie soll ich das am besten machen?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Baumstruktur mit fehlern :(

  Alt 27. Apr 2005, 14:11
Zitat von glkgereon:
wie soll ich das am besten machen?
Das ist eine philosophische Frage. Auf jeden Fall sollst du globale Variablen vermeiden, wo du kannst. Speicher auf dem Heap kannst du dir mit New() besorgen. Du solltest ihn dann später mit Dispose() wieder freigeben.

Delphi-Quellcode:
type
  PNode = ^TNode;
var
  node: PNode;
begin
  New(node);
  ...
  Dispose(node);
end;
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.
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
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#5

Re: Baumstruktur mit fehlern :(

  Alt 27. Apr 2005, 14:27
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:
    H  H  H  H
    |   |   |   |
H - C - C - C - C - H
    |   |   |   |
    H  H H-C-H H
            |
            H
diese Nodes ergibt:

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
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Baumstruktur mit fehlern :(

  Alt 28. Apr 2005, 18:47
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:
C - C - C - C - C - C
    |   |
    C  C
    |     
    C
CycloButan

Code:
C - C
|   |
C - C
Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#7

Re: Baumstruktur mit fehlern :(

  Alt 28. Apr 2005, 19:38
nein, es soll keine einschränkung in der isomerie geben.

Cyclo-Alkane sind ein sonder-fall den ich (zunächst) nicht aufnehmen will.

Zitat:
Die Liste als Speicherstruktur für dein Alkan-Molekül dürfte nicht ganz angemessen sein, da du ohne Bindungsparameter keine Isomere beschreiben kannst.
doch wie soll ich das jetzt organisieren?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Baumstruktur mit fehlern :(

  Alt 28. Apr 2005, 19:58
Zitat von glkgereon:
doch wie soll ich das jetzt organisieren?
Nachdem ich nun schon erraten habe, was du als Ausgabe produzieren möchtest, könntest du einmal verraten, wie die Eingabe aussehen soll. Mir schwebt da der Name des Alkans nach der Genfer Nomenklatur vor. Aber vielleicht hast du eigene Vorstellungen?

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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#9

Re: Baumstruktur mit fehlern :(

  Alt 28. Apr 2005, 20:07
Wenn du Strukturformeln beschreiben willst, da hab' ich mir hier schon Gedanken gemacht.

Wie das dann mit dem Zeichnen aussieht, kann ich dir aber nicht sagen ...
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#10

Re: Baumstruktur mit fehlern :(

  Alt 29. Apr 2005, 21:53
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...
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz