Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem bei SetLength() (https://www.delphipraxis.net/186275-problem-bei-setlength.html)

the3dcloser 19. Aug 2015 14:27


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

TiGü 19. Aug 2015 14:50

AW: Problem bei SetLength()
 
Zeig mal Code!

the3dcloser 19. Aug 2015 15:23

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;

p80286 19. Aug 2015 15:41

AW: Problem bei SetLength()
 
Zitat:

Zitat von the3dcloser (Beitrag 1312740)
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);
...
end;

Das sollte eigentlich überhaupt nicht compilieren.
1)...... (das vergessen wir da die Formatierung mich irregeleitet hat)
2) was ist TRXHead.Materials ??

Gruß
K-H

Mavarik 19. Aug 2015 15:46

AW: Problem bei SetLength()
 
Wegen den Longstrings? RefCount?

the3dcloser 19. Aug 2015 15:56

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 (?)

BadenPower 19. Aug 2015 16:04

AW: Problem bei SetLength()
 
Zitat:

Zitat von the3dcloser (Beitrag 1312733)
Rufe ich die prozedure ein zweites Mal auf, dieses Mal jedoch mit einem Wert <X, bekomme ich einen External SIGSEGV Error.

Der "External SIGSEGV Error" wird nicht bei der Benutzung von SetLength ausgegeben, selbst dann nicht, wenn neagative Werte oder ein Zeichen übergeben wird.

Mit Sicherheit greifst Du irgendo entweder auf MTL[] oder s[] auf einen ungültigen Indexwert zu.

Der entscheidende Code-Abschitt fehlt.

Luckie 19. Aug 2015 17:20

AW: Problem bei SetLength()
 
Der String dürfte dir auch Probleme bereiten. Oder willst du wirklich die Speicheradresse in dem Record haben?

the3dcloser 19. Aug 2015 17:48

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.

BUG 19. Aug 2015 19:04

AW: Problem bei SetLength()
 
Zitat:

Zitat von Luckie (Beitrag 1312760)
Der String dürfte dir auch Probleme bereiten. Oder willst du wirklich die Speicheradresse in dem Record haben?

Ich denke schon, es sieht aus, als ob ein Record einfach nur als "dummer" Datensatz ohne Logik benutzt wird.


Wenn der Fehler wirklich in
Delphi-Quellcode:
setLength
auftritt, sollte jemand an entweder dem Array selbst oder den enthaltenen Strings etwas kaputtgemacht haben.
Du machst doch sicher noch etwas zwischen den Aufrufen von
Delphi-Quellcode:
LoadMTL
. Tritt der Fehler auch auf, wenn du die zwei
Delphi-Quellcode:
LoadMTL
-Aufrufe direkt nacheinander ausführst? Beziehungsweise, stellst du irgendwelche versauten Speicherarithmetik-Sachen mit den Daten an?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz