![]() |
Problem bei SetLength()
Hallo Community,
ich habe ein problem mit dem SetLength() Befehl aus Pascal. Ich nutze den Befehl, um einen dynamischen array auf die Länge X zu setzen. Rufe ich die prozedure ein zweites Mal auf, dieses Mal jedoch mit einem Wert <X, bekomme ich einen External SIGSEGV Error. Kann mir jemand erklären, warum dies so ist, bzw. wie ich diesen Fehler umgehen und ausbessern kann? Ich nutze Lazarus 1.2.6, jedoch habe ich in der betroffenen Unit die Codierung auf Delphi gestellt ({$mode delphi}) Grüße |
AW: Problem bei SetLength()
Zeig mal Code!
|
AW: Problem bei SetLength()
Der Code ist an sich eigentlich relativ simple, es wird nur eine Datei eingelesen:
Wie schon gesagt, lade ich eine Datei, funktioniert der Code ohne Probleme, lade ich jedoch später eine neue (kleinere, d.h. kleinere Array-länge) Datei, gibt es den Fehler mit SetLength()
Delphi-Quellcode:
var
MTL: array of record //only editable values :) Name: String; MatClass: array[0..3] of word; Diffuse, Ambient, Specular, Reflect2: TColor; XDiffuse, XSpecular, Specular2: TColor; TexName:String; Transparency:Byte; SpecProbs, Fresnel: array[0..2] of word; FallOff: array[0..1] of word; end; procedure LoadMTL(a:String); var f:Textfile; s:String; i:Integer; begin SetLength(MTL, TRXHead.Materials); {Fehler beim zweiten Laden} AssignFile(f,a); Reset(f); ReadLn(f,s); //ColSetInf for i:=0 to TRXHead.Materials-1 do begin ReadLn(f,s); //Empty line ReadLn(f,s); MTL[i].Name:=s; ReadLn(f,s); Delete(s,1,9); MTL[i].MatClass[0]:=StrToInt(s[1]+s[2]); MTL[i].MatClass[1]:=StrToInt(s[4]+s[5]); MTL[i].MatClass[2]:=StrToInt(s[7]+s[8]); MTL[i].MatClass[3]:=StrToInt(s[10]+s[11]); ReadLn(f,s); MTL[i].Diffuse:=ReadColorFromLine(s); ReadLn(f,s); MTL[i].Ambient:=ReadColorFromLine(s); ReadLn(f,s); MTL[i].Specular:=ReadColorFromLine(s); ReadLn(f,s); MTL[i].Reflect2:=ReadColorFromLine(s); ReadLn(f,s); MTL[i].Specular2:=ReadColorFromLine(s); ReadLn(f,s); MTL[i].XDiffuse:=ReadColorFromLine(s); ReadLn(f,s); MTL[i].XSpecular:=ReadColorFromLine(s); ReadLn(f,s); SetLength(s, Length(s)-1); Delete(s, 1, 10); MTL[i].TexName:=s; ReadLn(f,s); //Tex2 ReadLn(f,s); //Tex3 ReadLn(f,s); //TexFlags ReadLn(f,s); //TexOffset ReadLn(f,s); //TexScale ReadLn(f,s); //TexAngle ReadLn(f,s); Delete(s,1,6); MTL[i].Transparency:=StrToInt(s); ReadLn(f,s); Delete(s,1,10); MTL[i].SpecProbs[0]:=StrToInt(s[1]+s[2]+s[3]);MTL[i].SpecProbs[1]:=StrToInt(s[5]+s[6]+s[7]);MTL[i].SpecProbs[2]:=StrToInt(s[9]+s[10]+s[11]); ReadLn(f,s); Delete(s,1,8); MTL[i].Fresnel[0]:=StrToInt(s[1]+s[2]+s[3]);MTL[i].Fresnel[1]:=StrToInt(s[5]+s[6]+s[7]);MTL[i].Fresnel[2]:=StrToInt(s[9]+s[10]+s[11]); ReadLn(f,s); Delete(s,1,8); MTL[i].FallOff[0]:=StrToInt(s[1]+s[2]+s[3]);MTL[i].FallOff[1]:=StrToInt(s[5]+s[6]+s[7]); end; CloseFile(f); end; |
AW: Problem bei SetLength()
Zitat:
1)...... (das vergessen wir da die Formatierung mich irregeleitet hat) 2) was ist TRXHead.Materials ?? Gruß K-H |
AW: Problem bei SetLength()
Wegen den Longstrings? RefCount?
|
AW: Problem bei SetLength()
TRXHead.Materials ist ein Integerwert aus einer zugehörigen Datei, welcher größer 0 ist.
In beiden Fällen liefert mir dieser Wert einen gültigen wert, beim ersten Mal (die größere Datei) ist der Wert 2, bei der zweiten Datei ist der Wert 1. Ich nehme an, dass sich das erste genannte Problem erledigt hat (?) |
AW: Problem bei SetLength()
Zitat:
Mit Sicherheit greifst Du irgendo entweder auf MTL[] oder s[] auf einen ungültigen Indexwert zu. Der entscheidende Code-Abschitt fehlt. |
AW: Problem bei SetLength()
Der String dürfte dir auch Probleme bereiten. Oder willst du wirklich die Speicheradresse in dem Record haben?
|
AW: Problem bei SetLength()
Die Fehlermeldung kann nur dort passieren, da ich - wenn ich vor dem SetLength()und nach dem SetLength()einen ShowMessage-Dialog einbaue - nur den ersten Dialog bekomme, bevor die Fehlermeldung kommt.
Sollte ich auf einen ungültigen Wert von MTL[] oder s[] zugreifen, müsste es doch auch schon beim ersten Mal nicht funktionieren, oder? Luckie, was verstehst du unter "Probleme bereiten"? Kannst du dabei etwas genauer werden? Danke im Vorraus. |
AW: Problem bei SetLength()
Zitat:
Wenn der Fehler wirklich in
Delphi-Quellcode:
auftritt, sollte jemand an entweder dem Array selbst oder den enthaltenen Strings etwas kaputtgemacht haben.
setLength
Du machst doch sicher noch etwas zwischen den Aufrufen von
Delphi-Quellcode:
. Tritt der Fehler auch auf, wenn du die zwei
LoadMTL
Delphi-Quellcode:
-Aufrufe direkt nacheinander ausführst? Beziehungsweise, stellst du irgendwelche versauten Speicherarithmetik-Sachen mit den Daten an?
LoadMTL
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz