Entwickler-Ecke
Andere .NET-Sprachen - Migration von verketteten Listen
Luke1410 - Di 05.07.05 18:45
Titel: Migration von verketteten Listen
Ich migriere gerade ein altes Delphi Win32 Projekt in ein .Net Projekt und hänge irgendwie fest.
Das Problem ist eine einfach verkettete Liste:
Delphi-Quelltext
1: 2: 3: 4: 5:
| PTest = ^test; test = record [...] next : Ptest; end; |
Möglichkeit 1:
{$UNSAFECODE ON} setzen - geht, aber führt später zu Problemen (im Zusammenhang mit new und dispose-Aufrufen)
Möglichkeit 2: PTest entfernen und im record ersetzen. Aber durch was nur?
Moderiert von
Christian S.: Delphi-Tags hinzugefügt.
Luke1410 - Mi 06.07.05 15:14
Um die Sache andersrum anzugehen (vielleicht weiß da ja jemand Rat):
Bisher wurde im Code soetwas wie:
Pointer_Auf_Test := new(test);
.Net beschwert sich nun allerdings mit der Meldung: "[Error] blah: E2307 NEW standard function expects a dynamic array type identifier". Mir ist zwar klar, warum die Meldung kommt, aber nicht, wie ich das dann umschreiben soll, ohne die Pointer komplett rauszuschmeißen.
MasterBB - Mi 06.07.05 15:43
also da .NET eine objektorientierte Programmierspache ist von oben bis unten
würde ich mir die Liste per Objekte basteln.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type MyList = class strict procteted FNext : MyList; public constructor Create(Data : DeinDataTyp); public property Data : property Next : MyList read FNext write FNext;
end; |
schwupp hast du ne hochleistungs absolut objektorientierte Liste
mit der du objektorientiert arbeiten kannst.
vieleicht ist eine doppeltverkettete liste noch besser und benötigt
garnichtmla so viel speicher mehr als ne einfach verkettete,
würde dann einige operationen erleichtern
Luke1410 - Mi 06.07.05 15:51
Wollte zwar ungern das Record dermaßen ändern müssen, aber falls es die einzige Möglichkeit ist, wird's wohl ersetzt.
Wobei ich nicht ganz verstehe, warum sich der Compiler beschwert, wenn ich soetwas in einem record schreibe:
Delphi-Quelltext
1: 2: 3:
| type MyRecord = record pNext : MyRecord; end; |
Es in einer Klasse dann aber doch funktioniert.
Kannst du mir auch noch einen Tipp geben, wie das mit unsafed code funktionieren würde (wie der new-Aufruf in meinem 2. Post zu ersetzen wäre) ohne das Record anzupacken?
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
MasterBB - Mi 06.07.05 16:01
hm warum deine liste so mit dem record nicht
funktioniert weiß ich auch nicht, per objekt ist es aber auf alle fälle
besser auch wens ein kleines wenig mehr arbeit ist die sich jedoch lohnt.
würde ich mir an deiner stelle gleich eine neue unit schreiben da man sowas immermal
gebrauchen kann und somit die wiederverwendbarkeit garantiert.
du mußt ja jetzt auch nicht die liste mit extrem vielen routinen bepacken
erstmal nur das was du brauchst der rest kommt dann eh mit der zeit.
in .NET und in Delphi2005 wird an sich nicht mehr mit dem Typ Pointer gearbeitet.
Wenn du eine Variable vom Typ MyList nimmst ist das ja an sihc auhc ein pointer.
wenn du hast
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var NetList : MyList; Element2 : MyList; begin NetList := MyList.Create(nil); NetList.AddList(Element2); end; |
was meinst du mit dem new-Aufruf? was soll dort passieren?
-ahja ich glaub cih weiß jetzt, mit dem new machst du nen neuen
speicherplatz mit größe des records klar und gibst die adresse dem Pointer_zu_test.
hab nie viel mit pointern gearbeitet bisher.
naja wie gesagt brauchst du überhaupt nicht mehr wenn dus anständig oo mäßig aufziehst.
an sich brauchst du nur 1 Objekt MyList und dieses kann dann alles
wie neue Daten speichern indem du dem MyList einfach eine Routine mitgibst
Add(Data : MyDataTyp);
und schwupp legt MyList unter Next falls next nil ist ein neues MyList objekt mit
der Data an.
Luke1410 - Mi 06.07.05 16:24
@Record wird nicht akzeptiert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| test= record value1:longint; value2:longint; [...] value9:longint; next:test; end; |
Compilermeldung: [Error] blah: E2086 Type 'test' is not yet completely defined
Aber das nur am Rande.
Hier die weitaus wichtigere Frage:
@new-Aufruf:
Es war ja eine Win32-Anwendung die z.B. so einen Funktionsaufruf hat:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function foo(var para1:Test_Pointer) : boolean; begin [...] para1 := new(test); [...] end; |
Es wurde also Speicher für ein neues test-record angelegt und die Adresse an para1 übergeben.
Wenn ich alles als unsafe flagge, beschwert er sich halt weiterhin mit dem Fehler:
"[Error] blah: E2307 NEW standard function expects a dynamic array type identifier"
Luke1410 - Mi 06.07.05 17:05
Je mehr Code ich migriere desto mehr glaube ich, dass der Fehler ganz woanders steckt.
Ich habe in mehreren Dokumentationen gelesen, dass GetMem und FreeMem durch New- und Dispose-Aufrufe ersetzt werden sollen. Allerdings findet Delphi bei mir die Funktion Dispose() nicht: "[Error] blah: E2003 Undeclared identifier: 'Dispose'" - entsprechende Zeile: "Dispose(bar)";. Ist es möglich, dass ich an der komplett falschen Stelle nach dem Fehler gesucht habe?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!