Delphi 2010: Problem mit Pointern

Ich habe eine Schleife geschrieben, die einen String nach einem bestimmten System (immer abwechselnd 2 und 1 Zeichen) in ein zweidimensionales Array einsortiert. Nach der Ausführung kann ich ab einer bestimmten Länge des Strings mein Programm nicht mehr ohne Fehlermeldung schließen, die mir eine Access Violation angibt. Normalerweise bedeutet das ja eine Speicherüberschreitung z.B. bei einem Array aber in diesem Fall erscheint die Exception ja beim Schließen des Programms, deshalb wiß ich nicht womit es zusammenhängt.

Code:
for k := 1 to length(ams)-1 do
for l := 1 to length(ams[k])-1 do
begin
ams[k,l] := chr(0);
end;
k := 0;
a := 2;
while length(x) > 0 do
begin
k := k+1;
if k > length(y) then
begin
k := 1;
a := a+1;
end;
if (odd(k)) and (length(x) >= 2)then
begin
ams[k,a] := x[1] + x[2];
delete(x,1,2);
end
else
begin
ams[k,a] := x[1];
delete(x,1,1);
end;
end;

x ist der betreffende String, ams das Array (ams : array of array of string[2])

Ich kann mir das beim besten Willen nicht erklären.

hallo,
das erste problem sehe ich darin, daß variablen vor dem setzen abgefragt werden, ihr wert also undefiniert ist - delphi setzt, soweit ich weiß, auch in der 2010er version keine neuen variablen auf „null“ - auch werden dynamische arrays nicht selbstständig erweitert, sondern bekommen ihre länge durch „setlength“ - in diesen beiden punkten kann ich mich aber irren, ich benutze keine 2010er z.zt.

in der ersten schleife k das ganze ams durchlaufen (for k:=1 to length(ams)-1), aber so wird schon mal das erste feld unterschlagen, die schleife müßte von 0 bis length-1 laufen (es sei denn, du hast für feld „0“ andere pläne) - außerdem ist die länge von ams undefiniert

später wird „y“ abgefragt, aber nie gesetzt (if k>length(y) then…) - sollte y eigentlich x sein?

dazu kann das umkopieren in ams nicht funktionieren, weil „a“ zu hoch ist - du beginnst mit „a:=2“ und a kann sogar größer werden „a:=a+1“ - a kann also größer als 2 sein, dann aber kriegst du es nicht mehr ams rein (ams: array of array of string[2]) - wofür wird „a“ überhaupt erhöht?

ams selbst ist doppelt dynamisch (array of array of string[2]), du müßtest also z.b. ams[1,1,1] schreiben

ich habe dein programm gekürzt und vereinfacht - so funktioniert es zumindest und weniger code läßt sich leichter pflegen

var
ams : array of string[2];
k, b: integer;
x: string;
begin
x:=‚this_is_a_serious_test‘;

setlength(ams,length(x));
for k:=0 to length(ams)-1 do ams[k]:=’’;

k:=1;
while length(x)>0 do begin
b:=1; if (odd(k)) and (length(x)>=2) then b:=2;

ams[k]:=copy(x,1,b); delete(x,1,b);

k:=k+1;
end;

)

(oh, mann!)

ok, es war schon früh am morgen, da habe ich ein wenig unsinn geschrieben

das dynamische feld ams wird natürlich mit mit index 1 zuerst angesprochen, du unterschlägst da nichts