Discussion:
Compiler-Fehler? Oder self.denkerror?
(zu alt für eine Antwort)
Christian Schmitt
2017-09-11 10:24:44 UTC
Permalink
Hallo Leute,

ich habe mal wieder ein Problem, bei dem ich Experten brauche :-)

Folgende Funktion:

function TPVIItem.GetPlcVariableName(i: Integer): AnsiString;
begin
Result := '';
if not(i in [0 .. High(FPviObject)]) then
begin
DebugLog.Add(DateTimeToStr(now)+' Index out of Range: I=' + IntToStr(i)+' High(FPviObject)='+inttostr(High(FPviObject)));
exit;
end;
Result := FPviObject[i].Name;
end;

I wird von 0 durchgezählt bis High(FPviObject). Genau bei I=7 ist die If-Abfrage True und mein Debug-Log gibt folgendes aus:

9/11/2017 6:15:42 PM Index out of Range: I=7 High(FPviObject)=262

Wenn ich die If-Abfrage wie folgt ändere:

if not((I>=0) and (I<=High(FPviObject)) then

dann funktioniert alles. Das lustige ist, dass die Software erst spinnt, seit dem 16 FPviObjects dazugekommen sind, vorher lief die Software ein halbes Jahr stabil. Und ich habe an dieser Routine rein gar nichts verändert...

Hat jemand eine Erklärung? Muß ich jetzt alle meine "A in B" Konstrukte umändern?

Gruß
Heiko Rost
2017-09-11 11:38:04 UTC
Permalink
Post by Christian Schmitt
function TPVIItem.GetPlcVariableName(i: Integer): AnsiString;
begin
Result := '';
if not(i in [0 .. High(FPviObject)]) then
begin
DebugLog.Add(DateTimeToStr(now)+' Index out of Range: I=' + IntToStr(i)+' High(FPviObject)='+inttostr(High(FPviObject)));
exit;
end;
Result := FPviObject[i].Name;
end;
9/11/2017 6:15:42 PM Index out of Range: I=7 High(FPviObject)=262
Hat jemand eine Erklärung?
Das "[0 .. High(FPviObject)]" ist eine Menge, und falls ich mich nicht
sehr irre, darf die maximal 256 Elemente enthalten. In deinem Beispiel
sind es aber 263, so daß die vollständige Umwandlung in eine Menge nicht
mehr möglich ist.
Post by Christian Schmitt
Muß ich jetzt alle meine "A in B" Konstrukte umändern?
Aus Gescheindigkeitsgründen wäre das wahrscheinlich sowieso die bessere
Wahl.

Gruß Heiko
--
Es geht einem so glatt ein wie dem Teufel eine Advokatenseele.
Sprichwort
Christian Schmitt
2017-09-11 12:49:40 UTC
Permalink
Post by Heiko Rost
Das "[0 .. High(FPviObject)]" ist eine Menge, und falls ich mich nicht
sehr irre, darf die maximal 256 Elemente enthalten. In deinem Beispiel
sind es aber 263, so daß die vollständige Umwandlung in eine Menge nicht
mehr möglich ist.
Ouha, das wäre eine Erklärung, auch warum es vorher mit <256 Elementen problemlos funktioniert hat.

Ganz spontan würde ich bei sowas aber ne Compilerwarnung erwarten, ihr nicht? :-P

Dann wohl doch ein self.blöderheini :-)

Danke vielmals!

Gruß
Heiko Rost
2017-09-11 13:42:57 UTC
Permalink
Post by Christian Schmitt
Ganz spontan würde ich bei sowas aber ne Compilerwarnung erwarten, ihr nicht? :-P
Stimmt, ein Datentyp mit mehr als einem Byte Länge ist an der Stelle
eine potentielle Fehlerquelle. Delhi 2007 hat in einem kleinen
Testprogramm zumindest einen Laufzeitfehler bzw. eine Exception erzeugt,
wenn der Range Check aktiviert ist.

Gruß Heiko
--
Wo ein Wille ist, da ist auch ein Weg.
Sprichwort
Matthias Frey
2017-09-11 11:40:10 UTC
Permalink
Post by Christian Schmitt
...
if not((I>=0) and (I<=High(FPviObject)) then
dann funktioniert alles. Das lustige ist, dass die Software erst spinnt, seit dem 16 FPviObjects dazugekommen sind, vorher lief die Software ein halbes Jahr stabil. Und ich habe an dieser Routine rein gar nichts verändert...
Hat jemand eine Erklärung? Muß ich jetzt alle meine "A in B" Konstrukte umändern?
Nein, zumindest ich müsste erst mal wissen wie FPviObject definiert ist.
Post by Christian Schmitt
Gruß
Gras
Christian Schmitt
2017-09-11 12:51:11 UTC
Permalink
Post by Matthias Frey
Post by Christian Schmitt
Hat jemand eine Erklärung? Muß ich jetzt alle meine "A in B" Konstrukte umändern?
Nein, zumindest ich müsste erst mal wissen wie FPviObject definiert ist.
Das ist ein dynamischer Array of Record, aber doch theoretisch egal oder? Wenn high() im Debuglog-Befehl 262 liefert, sollte doch high() in der If-Abfrage auch 262 liefern, oder?

Gruß
Loading...