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

Aktuelle Zeit: Fr Jul 18, 2025 18:20

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: TList Problem.
BeitragVerfasst: Fr Jul 22, 2005 17:14 
Offline
DGL Member

Registriert: Mi Jul 20, 2005 18:43
Beiträge: 30
Hallo,

Ich bin gerade dabei eine "Verwaltungsklasse" für *.3ds Dateien zu schreiben. Die Klasse speichert die Modelle in einer Liste vom Typ TList, wenn ich das erste Model lad funktioniert noch alles einwandfrei, jedoch sobald ich mehrere lade crasht er ("Could not open File 'Pfad\GFX\'"). Aber wenn ich ein neues Model lade ist doch immer der Dateiname angegeben!

Code:
  1. TModel = class
  2.   private
  3.    Mesh    : TList;
  4.   public
  5.    constructor Create;
  6.    destructor Destroy;
  7.  
  8.    procedure LoadModel(FName: String);
  9.    procedure Render(Index: Integer);
  10.   end;
  11.  
  12. //....
  13.  
  14. { ===== Model Create ===== }
  15. constructor TModel.Create;
  16. begin
  17.  Mesh := TList.Create;
  18. end;
  19.  
  20. { ===== Load Model ===== }
  21. procedure TModel.LoadModel(FName: String);
  22. var Model : ^TAll3DSMesh;
  23. begin
  24.  New(Model);
  25.  Model^ := TAll3DSMesh.Create(nil);
  26.  Model^.TexturePath := 'GFX';
  27.  Model^.LoadFromFile('GFX' + FName);
  28.  Mesh.Add(Model);
  29. end;
  30.  
  31. //...
  32.  
  33. procedure TGLForm.FormCreate(Sender: TObject);
  34. begin
  35.  //...
  36.   Model := TModel.Create;
  37.    Model.LoadModel('CBoard.3DS');
  38.    Model.LoadModel('Pawn.3DS');
  39.  //...
  40. end;
  41.  


Ich komm einfach nicht darauf an was es liegen könnte :( - Könnt ihr mir helfen?
Danke schonmal

MFG
Maximus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 22, 2005 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Naja, mir stellt sich die Frage, warum diese Zeile keinen Fehler meldet:
Code:
  1. Mesh.Add(Model);

Model ist doch ein 3dsMesh, ist das nicht inkompatibel mit TList, sollte da nicht ein Zeiger rein?

Außerdem wird ja nach der derzeitigen Programmierung (jedenfalls wenns laufen würde) immer beim Laden eines neuen Meshes das vorige ersetzt, das kann doch ned recht sinnvoll sein?

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 22, 2005 18:23 
Offline
DGL Member

Registriert: Mi Jul 20, 2005 18:43
Beiträge: 30
La_Boda hat geschrieben:
Model ist doch ein 3dsMesh, ist das nicht inkompatibel mit TList, sollte da nicht ein Zeiger rein?


Model zeigt doch auf TAll3DSMesh (Model : ^TAll3DSMesh)

La_Boda hat geschrieben:
Außerdem wird ja nach der derzeitigen Programmierung (jedenfalls wenns laufen würde) immer beim Laden eines neuen Meshes das vorige ersetzt, das kann doch ned recht sinnvoll sein?


Ich häng doch immer wieder das aktuelle Model an die Liste hinten dran, D.h. erstes mal Add = Element 0 , zweites mal Add = Element 1, oder?

MFG
Maximus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 22, 2005 18:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ah sorry, hab noch nicht mit TList gearbeitet, und deswegen teilweise mit TStringList verwechselt :oops:
Dann kann ich dir leider auch ned helfen, aber versuch vielleicht mal, das Ganze mit weniger Pointern zu machen, weil bei denen schleichen sich schon gerne mal Fehler ein (va. wenn man sie einmal im Jahr gebraucht, so wie ich ;) )

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 22, 2005 19:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Klassen sind bereits Pointer und müssen nicht extra referenziert und dereferenziert werden!

Code:
  1. procedure TModel.LoadModel(FName: String);
  2. var
  3.   Model: TAll3DSMesh;
  4. begin
  5.   Model := TAll3DSMesh.Create;
  6.   Model.TexturePath := 'GFX';
  7.   Model.LoadFromFile('GFX' + FName);
  8.   Mesh.Add(Model);
  9. end;


Das reicht vollkommen aus um Klassen in eine TList zu packen.

Ansprechen kannst du sie mit so etwas.
Code:
  1.  TAll3DSMesh(Mesh[Idx]).Irgendwas;


Aber ich würde mal für deine Dateien absolute Pfade verwenden. Evtl wird ja durch irgendeine Aktion das aktuelle Verzeichnis verändert und du verscht sie von Sonstwoher zu laden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 22, 2005 21:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
das reicht nicht nur aus, das muss so sein^^
hatte den Fehler auch schonmal (passiert wenn man vorher zu viel C++ gemacht hat :-) )


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 22, 2005 21:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Pellaeon hat geschrieben:
das reicht nicht nur aus, das muss so sein^^

Was muss wie sein? Wie sollte es denn sein?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 22, 2005 23:43 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@Palleon: So sicher bin ich mir nicht. Es verbietet ja Delphi niemanden einen Pointer auf einen Pointer anzulegen. Gehen müsste das Trotzdem. So klar ist mir der Fehler nämlich noch net...schließlich dereferenziert er ja alles wieder korrekt. Somit sollte der überflüssige Pointer dazwischen sich eigentlich nicht auswirken. :roll: :?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 23, 2005 07:41 
Offline
DGL Member

Registriert: Mi Jul 20, 2005 18:43
Beiträge: 30
Hallo,

Danke für die Hilfen! Also bei der TList hat sich nichts geändert ausser das die unnötigen Zeichen/Zeilen rausgeflogen sind. Was ich bisher beim debuggen rausgefunden hab ist, dass sobald man das "Pawn" Model lädt der TexturePath zickt. Der Fehler liegt warscheinlich beim Model , dass ich nun genauer unter die Lupe nehmen werde :) .

MFG
Maximus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 23, 2005 12:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
@flash also ich hatte das auch mal gemacht mit dem @ vor der Referenz um an den Zeiger zu kommen. Da hatte ich dann dauernd Speicherzugriffsfehler usw. Als ich das @ weggemacht hatte gings wunderbar.

ich denke deshalb: wenn man das @ davor macht merkt man sich dann ja in der Liste die Adresse von der Referenzvariable(der nach verlassen der Funktion ja eh ungültig ist) und nicht die Adresse des dynamischen Speichers, wo die Referenz hinzeigt. Das ist ja aber das Ziel, daher ohne @ machen

edit: ach ja please: Pellaeon net pallaeon ;-) thx


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 23, 2005 15:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wollte dir natürlich nicht zu nahe treten. ;)

Ob die Erklärung so hinhaut glaub ich nicht. Die lokale Variable mag zwar ungültig werden, aber schließlich wurde sie ja kopiert (in die Liste). Und da der Speicherbereich wo der Pointer drauf zeigt mit New() allokiert wurde, gibt da Delphi auch nix frei.
Bei dem @-Operator kann ich nix zu sagen. Ich hab immer nur mit dem OldSchool "^" gearbeitet.

Ich kann mir aber vorstellen, dass es knallt, wenn du damals sowas probiert hast:
Code:
  1.  
  2. var Klasse  :TKlasse;
  3. begin
  4.     Klasse := TKlasse.Create;
  5.     Liste.Add(@Klasse);
  6. end;


Da sollte es richtig knallen...

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 23, 2005 16:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich kann euch gerade nicht folgen. @ und ^ sind zwei völlig unterschiedliche Sachen. Um genau zu sagen sogar genau gegenteilig.

Kleines Beispiel:

Code:
  1. var
  2.   Int: Integer;
  3.   pInt: PInteger; // oder auch ^Integer
  4. begin
  5.   Int := 12;
  6.   pInt := @Int;
  7.   pInt^ := 13;
  8. end;

Wie groß ist Int? 12 oder 13? Natürlich 13, weil mit "pInt := @Int" pInt die Adresse von Int zugewiesen wurde. Wenn jetzt pInt dereferenziert wird dann zeigt er auf den gleich Wert wie Int. Weißt man ihm so etwas zu, dann besitzt auch Int anschließend diesen Wert.

Bei dem Beispiel von Flash wird also lediglich die Adresse der lokalen Variable in die Liste gehangen. Nach der Ausführung der Methode dürfte diese nicht mehr existieren und alle Aufrufe würden in die Hose gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 23, 2005 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
*moep* wer lesen kann is klar im Vorteil^^ mein Fehler, keine Ahnung wo ich das @ gesehen habe, was ja garnicht da ist :oops:

jo den Fehler den du da beschrieben hast, hatte ich mal gemacht, wie gesagt wenn man davor C++ gemacht hat^^ Da ist das Referenzenkonzept ja ein bisschen anders.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 23, 2005 21:41 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Da ist das Referenzenkonzept ja ein bisschen anders.
:roll:
Du hast nur recht , falls du damit Syntax meinst.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 25, 2005 00:21 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich gebs ja zu...hab doch gesagt, dass ich mit dem @ keinen Umgang pflege... Knallen tuts aber trotzdem :mrgreen:

Aber begriffen warum es nicht ging, hab ich jetzt trotzdem. Wie sniper sagte, hat er in den Speicherbereich für die Klasse nur einen Pointer geschrieben...

Pointer sind schon strange... (auf dem ersten Blick) ... aber wenn man mal mit JAVA gearbeitet hat, fehlen einem die richtig...(Jedenfalls offiziell)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 Gäste


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.010s | 16 Queries | GZIP : On ]