Hallo
DP,
Ich beschäftige mich zur Zeit mit einem Funktionsplotter. (bzw. erstmal mit dessen Rechenwerk
)
Dazu habe ich mir überlegt, dass ich den Term zunächst als Binärbaum einlese, diesen mittels Postorder umstelle und dann ausrechne.
Alles bis auf das einlesen funktioniert soweit richtig
beim "postorder'n" kommt es immer zu einem Stack-Overflow, weshalb es wohl am einlesen liegen muss.
Delphi-Quellcode:
var Baum, tmp: TTree;
procedure TForm1.TermToTree(pTerm: String);
begin
Baum := TTree.create;
repeat
case pTerm[1] of
'+','-','*','/': begin
tmp := TTree.create;
tmp := Baum;
Baum.setLeftTree(tmp);
Baum.setContent(TObject(Char(pTerm[1])));
Baum.setRightTree(TTree.create);
Baum := Baum.getRightTree;
end;
'0'..'9': begin
Baum.setContent(TObject(String(Baum.getContent) + Char(pTerm[1])));
end;
end;
delete(pTerm,1,1);
until pTerm = '';
end;
Ich vermute, dass es an
tmp := Baum
liegt. Erstellt er damit keine neue Struktur, sondern setzt nur den zeiger von 'tmp' auf die Stelle wo 'Baum' liegt
Wenn dem so ist, kann man das umgehen ?
//Edit: meine Klasse TTree sieht folgendermaßen aus:
Delphi-Quellcode:
TTree = class
private
content: TObject;
Open: Boolean;
root: TTree;
leftTree: TTree;
rightTree: TTree;
public
constructor create();
procedure setContent(pContent: TObject);
procedure setOpen(pOpen: Boolean);
procedure setRoot(pRoot: TTree);
procedure setLeftTree(pTree: TTree);
procedure setRightTree(pTree: TTree);
function getContent: TObject;
function getRoot: TTree;
function getLeftTree: TTree;
function getRightTree: TTree;
function haveChilds: Boolean;
function isOpen: Boolean;
end;