Autor Beitrag
Luke1410
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Di 05.07.05 18:45 
Ich migriere gerade ein altes Delphi Win32 Projekt in ein .Net Projekt und hänge irgendwie fest.

Das Problem ist eine einfach verkettete Liste:
ausblenden 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 user profile iconChristian S.: Delphi-Tags hinzugefügt.
Luke1410 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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.

ausblenden 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);
    //usw.
  public
    property Data : //dein DataRecord oder du machst alle Record einträge hier 
                    //als Property rein
    property Next : MyList read FNext write FNext;

    //deine Operationen
    //AddElement(AElement : MyList)
    //FindElement  
    //usw alles Rekursiv versteht sich
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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:
ausblenden 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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
MasterBB
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mi 06.07.05 16:24 
@Record wird nicht akzeptiert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
//Test_Pointer=^test;
test= record
    value1:longint;
    value2:longint;
    [...]
    value9:longint;
    //next:Test_Pointer;
    next:test;   // <- Compilerfehler
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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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?