Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - dynamische Objekte


Strophi - Di 17.02.04 16:36
Titel: dynamische Objekte
Hi Junx,

ich komme von C++ nach Delphi, und habe eine Sparse-Vektor-Klasse, und eine
VectorList Klasse. Statisch funktionierts.

Mein Beispiel-TestScript ist dies:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
     v1:=TVector.Create(p_vid_comp);
     v2:=TVector.Create(p_vid_comp);

     v1.InsertComp (1,1);
     v1.InsertComp (2,1);
     v1.Sort;

     v2.InsertComp (1,2);
     v2.InsertComp (2,2);
     v2.Sort;


     Memo1.Lines.Add ('v1');
     v1.WriteVector(Memo1);
     Memo1.Lines.Add ('v2');
     v2.WriteVector(Memo1);

     Memo1.Lines.Add ('Distanz v1,v2 : '+FloatToStr(v1.EuclDist(v2)));

     Vectors:=TVectorList.Create;

     VectorList.InsertVector(@v1);
     VectorList.InsertVector(@v2);
     VectorList.CalcMean;

     Memo1.Lines.Add ('Center-Vektor');
     VectorList.GetMeanVector.WriteVector(Memo1);


und alles läuft vom feinsten.

so, jetzt muß ich in der Anwendung, für die ich das Zeug brauche, die
Vektoren die ich in die Vektorliste einfügen will, dynamisch erzeugen:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
for i:=1 to unknown do
begin
       c:=TVector.Create(p_vid_comp);

            ---> in C++ würde ich jetzt sowas sagen wie c = new TVector(p_vid_comp) und c zeigt
            ---> auf einen neuen TVector, TVectorList kommt damit gut klar

       c.InsertComp (1, X); 
       c.InsertComp (2, Y);
       c.Sort;
       Core.InsertVector(@c); // Adresse der statischen Variable c
end;


Sobald ich mir die Vektoren in Core anschauen will kracht's ganz laut. Ich schätze auch in Delphi läßt sich durch Angabe der Adresse einer Variablen und Ändern des Werts keine dynamische Variable erzeugen ;-)
Aber wie macht man ?

Kann mir da jemand auf die Sprünge helfen?

mfg

Strophi


Delete - Di 17.02.04 16:42

Hm. Ich habe das jetztnicht so ganz verstanden, aber kuck dir mal in der Hilfe New, Dispose und GetMem und FreeMem an. Eventuell ist es ja das, was du suchst.


Delete - Di 17.02.04 16:55

Könntest du vielleicht mal schreiben, wie deine Klassen und Variablen deklariert sind.
Vorallem die Definition von InsertVector() würde mich mal interessieren.

Wenn InsertVector(@v1) funktioniert {was ich nicht verstehe}, dann müsste InsertVector(@c) eigentlich auch gehen, aber wozu das @ überhaupt verwendet wird, ist mir noch schleierhaft.

Nebenbei, was du mit Create erstellst, musst du auch mit Free wirder freigeben.


Strophi - Di 17.02.04 17:52
Titel: einfach verkette Liste
Die Vektoren sind als ein fach verkettete Liste implementiert, deren Knoten die Komponenten(des Vektors)-ID und den dazugehörigen Komponentenwert. Alle Operatione befassenn sich nur mit den Nicht-Null Elementen.
InsertVector der Vektorliste bekommt die Adresse eines Vektors übergeben, für den sie dann zuständig wird. Im Destructor werden alle Vektoren gefree'd. Wenn alle Vektoren in der Vektorliste eingetragenb sind, kann man mit CalcMean den Mittelwert-Vektor aller in der Vektorliste enthaltenen Vektoren berechnen per getMeanVector kann man mit ihm rechnen.

Ich brauche das, um dem k-means-algorithmus auf Vektoren anwenden zu können, deren Dimensionalität in die Hundertetausende geht, aber nur wenige Komponenten nicht Null sind (ca 2000 pro Vektor).

Ich schau mir mal GetMem an. Scheint ja sowas wie die alloc-Funktionen von C zu sein...

mfg

Jan


Delete - Di 17.02.04 21:11

Hättest du nicht einfach mal Teile der Typdeklaration posten können, denn jetzt weiß ich immernoch nicht, wie InsertVector definiert ist.

Also der @ Operator ist in jedem Falle hier total sinlos, da eine Klassenvariable (v1,v2,c) schon an sich ein Pointer ist. Mit dem @ holst du dir dann einen Pointer auf den Speicherort des Pointers zu der Klasse. Das ist es was mich stört, weshalb ich halt gerne die Deklaration von InsertVector gesehen hätte.

Prinzipiell denke ich, müsste es so aussehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
for i:=1 to unknown do 
begin 
       c:=TVector.Create(p_vid_comp); 
       c.InsertComp (1, X);  
       c.InsertComp (2, Y); 
       c.Sort; 
       Core.InsertVector(c); 
       c.Free;
end;


Da du c als Variable deklariert hast, brauchst du so Sachen wie GetMem, etc sicherlich nicht.
Die Aufrufe von Create und Free legen passenden Speicher an, und geben ihn frei. c ist zu jedem Zeitpunkt ein Pointer auf diesen Speicher.

Hoffe ich konnte dir etwas helfen.


Strophi - Do 19.02.04 12:42
Titel: OOP
Hi,

danke für Eure Antworten.

...da eine Klassenvariable (v1,v2,c) schon an sich ein Pointer ist. ...

Ich muß mich mal ein wenig tiefer mit Delphi-Klassen befassen.

mfg

Strophi


Delete - Do 19.02.04 12:56
Titel: Werbung
Werbung ;)
http://www.luckie-online.de/tutorials/klassen/


Strophi - So 22.02.04 22:54
Titel: Gelöst...
Hi Junx,

ich hab' jetzt eine Lösung: Ich hab' TVectorList mit dynamischen Arrays (Was sagt N.W. dazu??) neu geschrieben, und der Cluster-Algorithmus rennt feuerartig: Zum Beäugen und bestaunen gibts die Ergebnisse bald bei einer (deutsch-sprachigen) Suchmaschine....

mfg

Strophi


Strophi - So 22.02.04 23:01
Titel: Toter Link
Hi,

dieses Klassen-Tutorial gibts anscheinend garnicht:

<zitat>
Werbung
http://www.luckie-online.de/tutorials/klassen/
</zitat>

Hier die Antwort:

Not Found
The requested URL /tutorials/klassen/ was not found on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.


Delete - So 22.02.04 23:05

Doch gibt es, ich habe nur gerade umgebaut. Aber wer klver ist geht auch mal über die Hauptseite. ;) http://www.luckie-online.de/Tutorials


Strophi - Mo 23.02.04 00:49
Titel: dynamische arrays
Hi,

danke für eure Hinweise. Hab' meine VectorList-Klasse umgebaut, jetzt macht' sie es mit dynamischen Arrays. Nicht sehr effizient, aber es ist noch ein Prototyp. Aber er läuft für 3D-Vektoren schon sehr gut. Jetzt kommen die wirklich großen Vektoren dran...

mfg

Strophi


Strophi - Mo 23.02.04 01:12
Titel: Links
Luckie hat folgendes geschrieben:
Aber wer klver ist geht auch mal über die Hauptseite. ;) http://www.luckie-online.de/Tutorials


Wenn ich auf Deine Tutorials angewiesen wäre, hättest Du Recht.
UnKlvere klicken Links.


mfg

Strophi