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

Aktuelle Zeit: Sa Jul 12, 2025 09:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: StringList Problem
BeitragVerfasst: Mo Dez 03, 2007 15:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
als ich benutze in meinem Programm eine StringList um Texturnamen zu speichern wenn ich jedoch die add procedure aufrufe und eine Variable übergebe speichert er siese nur als pointer auf die Variable mein problem ist nun das ich die namen aus einer Datei lese bzw einem Stream sich die Variable also ändert...wenn ich dann die indexOff function benutze tritt ein exception auf....

Frage stimmt das mit den pointer hat sich mir z mindestens so erschlossen
Wenn ja was kann ich da machen....

mfg FrenK


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 03, 2007 15:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe das Thema mal ins Allgemeine verschoben.

Also eigentlich speichert eine TStringList die Strings ab und nicht nur die Pointer. Evtl hast du es geschafft da intern irgendetwas auszutricksen. Poste mal bitte den Code an dem du den String lädst und an dem du ihn hinzufügst. Und was halt so wichtig ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 03, 2007 23:48 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Man kann an eine Stringliste ja noch Objekte hängen, nur weiss ich nicht genau worauf die Frage hinaus will.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 04, 2007 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Code:
  1.  
  2. procedure TTextureManager.AddTextureFromStream(AStream : TStream);
  3. var StrSize : Longint;
  4.     Str     : String;
  5. Begin
  6.   AStream.Read(StrSize,SizeOf(StrSize));
  7.   SetLength(Str,StrSize);
  8.   AStream.Read(Str, StrSize);
  9.   TexNames.Add(Str);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  10.   SetLength(TexData, length(TexData)+1);
  11.   TexData[high(TexData)] := TG3DETexture.Create;
  12.   TexData[high(TexData)].LoadFromStream(AStream,TRILINIAR,LOD);
  13.   BugTracker.Write('Texture : '+Str+' loaded');
  14. End;
  15.  


Das erst ma zum Code ich denke es ist ersichtlich um welche zeile es geht

Code:
  1.  
  2. function TStringList.Add(const S: string): Integer;
  3. begin
  4.   Result := AddObject(S, nil);
  5. end;
  6.  
  7. function TStringList.AddObject(const S: string; AObject: TObject): Integer;
  8. begin
  9.   if not Sorted then
  10.     Result := FCount
  11.   else
  12.     if Find(S, Result) then
  13.       case Duplicates of
  14.         dupIgnore: Exit;
  15.         dupError: Error(@SDuplicateString, 0);
  16.       end;
  17.   InsertItem(Result, S, AObject);
  18. end;
  19.  
  20. procedure TStringList.InsertItem(Index: Integer; const S: string; AObject: TObject);
  21. begin
  22.   Changing;
  23.   if FCount = FCapacity then Grow;
  24.   if Index < FCount then
  25.     System.Move(FList^[Index], FList^[Index + 1],
  26.       (FCount - Index) * SizeOf(TStringItem));
  27.   with FList^[Index] do
  28.   begin
  29.     Pointer(FString) := nil;
  30.     FObject := AObject;
  31.     FString := S;
  32.   end;
  33.   Inc(FCount);
  34.   Changed;
  35. end;
  36.  


Wen ich dann die indexOf dunction aufrufe erhalte ich eine exception

ich will wissen woran das liegen könnte bzw wie man das ändern könnte.....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 04, 2007 15:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Strings sind normal lediglich Pointer. Bei Stream.Read musst du aber einen Speicherbereich angeben in die gelesen wird. Durch das Var, in dem Paramater von Read, wird aber intern ein Pointer übergeben. Also hat die Read Methode nicht die Adresse von dem Buffer bekommen sondern die Adresse von der Variable Str.

Du musst also entsprechend den Anfang des Stringbuffers übergeben.
Code:
  1. AStream.Read(Str[1], StrSize);


PS: Wenn die Strings größer als 4 Bytes sind dann wurde auch bereits in einen anderen Speicherbereich geschrieben. Was an späteren Stellen zu Fehlern führen kann. Du solltest also noch mal überprüfen ob du sonst noch wo strings ausließt.

PPS: Der String dürfte im Debugger aber schon falsch ausgesehen haben, da dessen Pointer überschriebe wurde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 05, 2007 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Danke so ein simpler fehler...an anderen stellen im programm hab ichs auch noch richtig gemacht danke....


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.008s | 15 Queries | GZIP : On ]