Bei meinem Quelltext ging es mir nur darum zu sehen, ob in hilfe2 das drin ist, was erwartet wurde. Wenn Du das auf andere Weise geprüft hast, ist das auch in Ordnung.
Wollte nur sichergestellt haben, dass hilfe2 korrekt befüllt ist.
Nächste Frage:
Als ich mit TurboPascal programmieren lernte, konnte man auf Strings mit 'nem Index zugreifen. Sowas hier war (sinngemäß) gang und gäbe:
Delphi-Quellcode:
var
s : String;
b : Byte Absolut s;
i : Integer;
begin
s := '1234567890';
for i := 1 to b do begin
WriteLn(s[i]);
end;
s := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
for i := 1 to b do begin
WriteLn(s[i]);
end;
end;
Ein String konnte maximal 255 Zeichen enthalten, im 0. Zeichen stand die Länge. Da b an der Adresse von s liegt, enthält es immer die Länge des String.
Heute kann ein "handelsüblicher" String auch mehr als 255 Zeichen enthalten.
In Delphi 7 wird zwischen String und ShortString unterschieden.
Zitat von
Delphi 7-Hilfe:
ShortString 255 Zeichen 2 bis 256 Byte Abwärtskompatibilität
Damit kann man noch solche turbopascaltypischen "Spielereien" machen. Geht das unter FreePascal auch noch mit normalen Strings oder kennt das auch den ShortString?
Wenn ja, wäre das mal einen Versuch wert.
Geht das heute mit den Mehrbytezeichensätzen auch noch?
Ausgehend von der Programmlogik scheint mir dashier korrekt zu sein:
Delphi-Quellcode:
a := hilfe2[schluessel2[zaehler1]];
b := hilfe2[t1[zaehler1]];
Wenn hier aber a und b Werte enthalten, die nicht im Array vorkommen, so kann das beinahe nur durch den Zugriff auf Speicherinhalte außerhalb des Arrays resultieren (da das ja offensichtlich korrekt befüllt ist).
Gibt es in FreePascal eine Bereichsprüfung für Arraygrenzen und wenn ja, ist die eingeschaltet?
In Delphi 7 heißt es in der Hilfe:
Zitat:
Bereichsprüfung
Typ Schalter
Syntax {$R+} oder {$R-}
{$RANGECHECKS ON} oder {$RANGECHECKS OFF}
Vorgabe (Kontrollfeld) {$R-}
{$RANGECHECKS OFF}
Bereich Lokal
Anmerkungen
Mit der Direktive $R kann die Generierung von Bereichsprüfungscode aktiviert und deaktiviert werden. Im Status {$R+} werden alle Ausdrücke, die Arrays und Strings indizieren, dahingehend überprüft, ob sie sich innerhalb der festgelegten Grenzen befinden. Der gleichen Prüfung werden alle Zuweisungen an skalare Variablen und Teilbereichsvariablen unterzogen. Das Fehlschlagen der Bereichsprüfung führt zu einer ERangeError-
Exception (bzw. zum Programmabbruch, wenn die
Exception-Behandlung nicht aktiviert ist).
Die Aktivierung der Bereichsprüfung vergrößert und verlangsamt Ihr Programm.
Kennt FreePascal das auch, dann füge bitte diesen Kompilerschalter in Deinen Quelltext ein und schaue dann, ob er für ein verändertes Programverhalten sorgt.