@
ASM
IMHO sind meine die korrekten.
Nein sind sie definitiv nicht!!
Du kannst nicht die Fehlerfreiheit einer Codierung dadurch korrekt prüfen und angeblich nachweisen, wenn Du - wie Du es gemacht hast - die relativ komplizierte Struktur eines 2-dimensionalen Arrays an gerade mal einer einzigen Elementposition des Arrays testest.
Das ist nicht eine Frage rein theoretischer Interpretation, sondern vor allem eine der praktischen Prüfung.
Auf den Fehler in Deinem Code bin ich nämlich gerade dadurch aufmerksam geworden, nachdem ich das komplette 2D-Array mit unterschiedlichen Werten gefüllt hatte und dann folgendermaßen vorgegangen bin: zum einen nach programminternem Austausch per Memorystream zwischen zwei formal gleichen Arrayvariablen (A und B), zum anderen nach Abspeicherung des ersten Arrays (A) per Filestream in einem File und anschließenden Einlesen dieses Files per Filestream in das zweite Array (B), wobei sich ergänzend mit einem Hexeditor die im File gespeicherte Information exakt nachprüfen ließ.
Ergebnis:
Mit Deinem originalen Code wurde in beiden Verfahren nur Garbage sichtbar, und außerdem führte es zufallsbedingt an unregelmäßigen Arraypositionen zu Crash wegen Access violation.
Wie Du also zu Deiner jetzigen Verteidigung und Behauptung kommen kannst, ist mir rätselhaft. Vielleicht solltest Du es einmal kontrollieren mit meiner folgenden Erweiterung Deines Beispielcodes zur Anwendung:
Code:
procedure TForm1.Button2Click(Sender: TObject);
var
a,b:T2DStringArray;
i:Integer;
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
try
SetLength(a,100,0);
for I := Low(a) to High(a) do
begin
// hier ist im Original (SetLength(a[i],i) schon einmal ein Fehler:
// bei i=0 wäre das Array a[0,0] an dieser Stelle sonst nur 1-dimensional!,
// der Versuch einer Belegung führt unweigerlich zum Crash
// also muss entweder die Länge der zweiten Dimension auf mindestens 1
// gesetzt werden oder es müsste eine Sicherheitsabfrage auf das Element A[i,0]
// erfolgen
SetLength(a[i],i+1);
a[i][random(i)]:=char(32+1);
end;
a[19,5] := 'Haus';
a[59,2] := 'Dies ist ein Test';
Save2DArray(a,ms);
// hierdurch wird unmissverständlich sichtbar,
// wie verheerend der originale Code sich auswirkt!
// Da das Array A ja ab hier nicht mehr benötigt wird,
// darf seine Eliminierung in der folgenden Anzeige der Elemente des Array B
// keinerlei Folgen haben; ist das so bei Deinem Code ?
setlength(a,0,0);
ms.Position := 0;
Load2DArray(b,ms);
Showmessage(format('%s'#13#10'%s',[b[19,5], b[59,2]]));
finally
ms.Free;
end;
end;
Was passiert wohl, wenn Du das Ergebnis der entsprechende Anwendung unter Verwendung Deiner Originalunit vergleichst mit der von mir korrigierten Version der
Unit ?
Ach ja, und im übrigen stammt der von Dir gepostete Code in seinem Kern eigentlich nicht von Dir (bzw. von einem Thomas Wassermann ?), sondern von einem P.Below aus dem Jahre 2003, der den Code unter dem Titel "Save and load a 2-dimensional dynamic array" in Torry's Delphi Pages veröffentlicht hatte (
http://www.swissdelphicenter.ch/torr....php?id=1971); leider ist diese Urheberschaft in Deiner
Unit nirgendwo erwähnt. Bei diesem Code ist der von Dir eingebrachte Fehler allerdings nicht relevant, da der Autor das 2D-Array nicht mit einem T2DStringArray, sondern mit einem T2DBooleanArray entworfen hat. Dieser Code wurde in Deiner
Unit uReadWrite_2D_Arrays.pas exakt übernommen und allein der Typ des Arrays ohne jede Rücksicht auf notwendige weitere Anpassung ausgetauscht.