Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 02, 2025 04:38

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: C++ > Delphi Convert Problem
BeitragVerfasst: Fr Nov 08, 2002 10:25 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hi, ich habe mir mal die Octree Tutorials von Gametutorials.com runtergeladen und mal versucht das ganze in Delphi nachzuprogrammieren.

Ich hänge aber am c++ syntax, da gibts einige sachen, die raff ich nicht:

Code:
  1.  
  2.  
  3.   Cvector3 ist einfach ne klasse
  4.  
  5.   mit operatoren +,-,*,/ und X,Y,Z Float
  6.  
  7.  
  8.  
  9.  // This is the vector list of all of our lines
  10.  
  11.  vector<CVector3> m_vLines; &nbsp;
  12.  
  13.  
  14.  
  15.  &nbsp;
  16.  
  17.  &nbsp;was ist das ???
  18.  
  19.  
  20.  
  21.  &nbsp;// Store the top front line of the box
  22.  
  23.  &nbsp;m_vLines.push_back(vTopLeftFront);  
  24.  
  25.  
  26.  
  27.  


das in ne liste, aber wie könnte ich die liste in delph umsetzen ???

Delphicode meines wissens:

Code:
  1.  
  2.  
  3.  &nbsp;type
  4.  
  5.  &nbsp; &nbsp;PVector3 = ^TVector3;
  6.  
  7.  &nbsp; &nbsp;TVector3 = record
  8.  
  9.  &nbsp; &nbsp; &nbsp;x,y,z : Single;
  10.  
  11.  &nbsp; &nbsp;end;
  12.  
  13.  
  14.  
  15.  &nbsp;m_vLines : TList;
  16.  
  17.  
  18.  
  19. procedure AddToList(V : TVector3);
  20.  
  21. var
  22.  
  23.  &nbsp;P : PVector3;
  24.  
  25. begin
  26.  
  27.  &nbsp;New(P);
  28.  
  29.  &nbsp;P := ^V;
  30.  
  31.  &nbsp;m_vLines.Add(P);
  32.  
  33.  &nbsp;Dispose(P);
  34.  
  35. end;
  36.  
  37.  
  38.  
  39.  


was ist jetzt aber, wenn ich kein record habe, sondern ein object:

Code:
  1.  
  2.  
  3.  &nbsp;type
  4.  
  5.  &nbsp; &nbsp;PVector3 = ^TVector3;
  6.  
  7.  &nbsp; &nbsp;TVector3 = object
  8.  
  9.  &nbsp; &nbsp;public
  10.  
  11.  &nbsp; &nbsp; &nbsp;x,y,z : Single;
  12.  
  13.  &nbsp; &nbsp; &nbsp;procedure Assign(V : TVector3);
  14.  
  15.  &nbsp; &nbsp; &nbsp;procedure Plus(V : TVector3);
  16.  
  17.  &nbsp; &nbsp;end;
  18.  
  19.  
  20.  
  21.  &nbsp;m_vLines : TList;
  22.  
  23.  
  24.  
  25. procedure TVector3.Assign(V : TVector3);
  26.  
  27. begin
  28.  
  29.  &nbsp;X := V.X;
  30.  
  31.  &nbsp;Y := V.Y;
  32.  
  33.  &nbsp;Z := V.Z;
  34.  
  35. end;
  36.  
  37.  
  38.  
  39. procedure TVector3.Plus(V : TVector3);
  40.  
  41. begin
  42.  
  43.  &nbsp;X := X + V.Z;
  44.  
  45.  &nbsp;Y := Y + V.Y;
  46.  
  47.  &nbsp;Z := Z + V.Z;
  48.  
  49. end;
  50.  
  51.  
  52.  
  53. procedure AddToList(V : TVector3);
  54.  
  55. var
  56.  
  57.  &nbsp;P : PVector3;
  58.  
  59. begin
  60.  
  61.  &nbsp;New(P);
  62.  
  63.  &nbsp;P := ^V;
  64.  
  65.  &nbsp;m_vLines.Add(P);
  66.  
  67.  &nbsp;Dispose(P);
  68.  
  69. end;
  70.  
  71.  
  72.  
  73.  


würde das trotzdem funktionieren, in der liste ???
ich denke nicht, da man ja nur records speichern kann.
habs zwar nicht ausprobiert, aber dürfte eigentlich nicht gehen.
Und ausserdem hasse ich Listen, die funktionieren nie wie sie sollen.
Ich nehm lieber arrays:

Code:
  1.  
  2.  
  3.  &nbsp;type
  4.  
  5.  &nbsp; &nbsp;PVector3 = ^TVector3;
  6.  
  7.  &nbsp; &nbsp;TVector3 = object
  8.  
  9.  &nbsp; &nbsp;public
  10.  
  11.  &nbsp; &nbsp; &nbsp;x,y,z : Single;
  12.  
  13.  &nbsp; &nbsp; &nbsp;procedure Assign(V : TVector3);
  14.  
  15.  &nbsp; &nbsp; &nbsp;procedure Plus(V : TVector3);
  16.  
  17.  &nbsp; &nbsp; &nbsp;procedure Minus(V : TVector3);
  18.  
  19.  &nbsp; &nbsp; &nbsp;procedure Multiply(V : TVector3);
  20.  
  21.  &nbsp; &nbsp; &nbsp;procedure Dividet(V : TVector3);
  22.  
  23.  &nbsp; &nbsp;end;
  24.  
  25.  
  26.  
  27.  &nbsp;m_vLines : array of TVector3;
  28.  
  29.  
  30.  
  31. procedure TVector3.Assign(V : TVector3);
  32.  
  33. begin
  34.  
  35.  &nbsp;X := V.X;
  36.  
  37.  &nbsp;Y := V.Y;
  38.  
  39.  &nbsp;Z := V.Z;
  40.  
  41. end;
  42.  
  43.  
  44.  
  45. procedure TVector3.Plus(V : TVector3);
  46.  
  47. begin
  48.  
  49.  &nbsp;X := X + V.Z;
  50.  
  51.  &nbsp;Y := Y + V.Y;
  52.  
  53.  &nbsp;Z := Z + V.Z;
  54.  
  55. end;
  56.  
  57.  
  58.  
  59. procedure AddToArray(V : TVector3);
  60.  
  61. begin
  62.  
  63.  &nbsp;SetLength(m_vLines, SizeOf(m_VLines)+1);
  64.  
  65.  &nbsp;m_vLines[High(m_VLines)].Assign(V);
  66.  
  67. end;
  68.  
  69.  
  70.  
  71.  


also ich denke mal so hab ichs verstanden.

jetzt mal zu nem anderen prob:

Code:
  1.  
  2.  
  3. void CreateNewNode(CVector3 *pVertices, vector<bool> pList, int numberOfVerts, CVector3 vCenter,float width,int triangleCount, int nodeID);
  4.  
  5.  

was ist bitte schön:

Code:
  1.  
  2.  
  3. vector<bool> pList ???
  4.  
  5.  


und so wird zeugs zugewiesen:

Code:
  1.  
  2.  
  3. // Create the list of booleans for each triangle index
  4.  
  5. vector<bool> pList1(numberOfTriangles);
  6.  
  7. // TOP_LEFT_FRONT node list
  8.  
  9. vector<bool> pList2(numberOfTriangles);
  10.  
  11.  


also ich weiss nicht, c++ ist schrott...
ich raff es nicht...

:(

Code:
  1.  
  2.  
  3. // This stores the triangles that should be drawn with this node
  4.  
  5. CVector3 *m_pVertices;
  6.  
  7.  


wieso dieser stern, heisst das etwa array ??

das bedeutet doch in delphi:

Code:
  1.  
  2.  
  3.  &nbsp;m_pVertices: array of TVector;
  4.  
  5.  


oder ???

Code:
  1.  
  2.  
  3. // These are the eight nodes branching down from this current node
  4.  
  5. COctree *m_pOctreeNodes[8];
  6.  
  7.  


wieso kommt muss da nen Stern vor dem m_pOctreeNodes ???
obwohl es nen Statisches Array von 0..7 ist.
raff ich nich

oder das hier:

Code:
  1.  
  2.  
  3. void COctree::CreateNewNode(CVector3 *pVertices, vector<bool> pList, int numberOfVerts, CVector3 vCenter, float width,int triangleCount, int nodeID)
  4.  
  5.  
  6.  
  7. if(triangleCount) &nbsp;
  8.  
  9. {
  10.  
  11.  &nbsp;// Allocate memory for the triangles found in this node (tri's * 3 for vertices)
  12.  
  13.  
  14.  
  15. CVector3 *pNodeVertices = new CVector3 [triangleCount * 3];
  16.  
  17.  


prüft er ob trianglecount nen boolean ist oda was ???
obwohl int davor steht, oder prüft er on trianglecount <> 0 ist oder = 0 ist.

HELP A C++ NEWBIE IN NOT


matane,
Finalspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 08, 2002 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Also, der Stern bedeutet einfach mal ein Pointer. Somit wäre

int *Dummy

gleichbedeutend mit

var
Dummy : ^Integer;

oder

var
Dummy : PInteger;

Was die Liste angeht, so hast Du ein kleines Problem. Du erstellst mit New einen neue Eintrag, merkst die im PVector die Adresse von V. Bringt nix PVector ist bereits ein Zeiger auf den Typ TVector. Du machst folgendes:

Speicher für den Type PVector3 reservieren.
Adresse von TVector3 (also V) zuweisen (auf wenn das Falsch ist. Der Code könnte so nie funktionieren. Du müsstest @V machen)
Diesen dann zur Liste hinzufügen
Und das ganze freigeben. da P aber auf die Adresse von V verweist, ergibt das ganze Chaos!

Eigentlich reicht m_vLines.Add(@V), wobei der Speicherbereich von V nicht mehr freigegeben werden darf. Les Dir am besten mal in der Delphi-Hilfe alles zum Thema Ponter durch. Wenn Du dann unter Pascal das Pointer-Handling 'raushast, dann kannste weiter C++-Code konvertieren.

Ein Object sollte übrigens NICHT mit New sonder mit Create erstellt werden. Also

Code:
  1.  
  2.  
  3. var
  4.  
  5.  &nbsp;P : TVector3;
  6.  
  7. begin
  8.  
  9.  &nbsp;P := TVector3.Create;
  10.  
  11.  &nbsp;...
  12.  
  13.  &nbsp;P.Free;
  14.  
  15. end;
  16.  
  17.  


TVector3 ist zwar ein Objekt, aber eigentlich wird dann in P nur die Adresse des Objektes gespeichert. PVector3 ist also ein Zeiger auf TVector3, was eigentlich wiederum ein Zeiger auf das Objekt ist, Somit ist PVector3 ein Zeiger auf einen Zeiger...

Allerdigns darfst Du weder den reservierten Speicher noch das Objekt freigeben. Denn wenn Du es mit Add zur Liste hinzufügst, dannach aber frei gibtst, dann existiert das ganze nicht mehr im Speicher und das Ergebnis ist ein gnadenloser Crash!

Wie gesagt: Beschäftige Dich mal mit Pointer, Dynamische Speicherverwalltung, Objekten etc...

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Danke
BeitragVerfasst: Fr Nov 08, 2002 12:38 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Thx,

danke, hab bis jetzt eigentlich nicht viel mit Pointer am hut gehabt.
Werd mir die hilfe mal anschauen.

matane,
Finalspace


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.017s | 15 Queries | GZIP : On ]