Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array, setlength und vorhandene Daten (https://www.delphipraxis.net/197440-array-setlength-und-vorhandene-daten.html)

bernau 7. Aug 2018 10:44

Delphi-Version: 10.2 Tokyo

Array, setlength und vorhandene Daten
 
Manchmal nehme ich Dinge einfach als gegeben hin und mache mir keine Gedanken darüber. Grade bei so einfachen Sachen, die man Jahrelang verwendet.

Dann möchte ich aber doch wissen, ob das Ergebnis Zufall ist, oder ob es ein definierter Zustand ist.

Ich kann es nicht in der Embarcadero-Doku finden, deshalb brauche ich mal euren Input.

Gegeben ist ein zweidimensionales Array von einem einfachen Record. Das Array wird mit Setlength auf die gewünschte Größe gebracht.

Ist der Inhalt nun definiert, oder Zufall? (Bisher habe ich so ein Array immer initialisiert und mir keine Gedanken gemacht). Im Beispielprogramm sieht es so aus, als wenn die Inhalte des Records (Integer-Werte) einen definierten Zustand haben (0). Zufall oder nicht? Ich finde in der Doku keine Definition.

Dann belege ich die Records mit Werten.

Danach verkleinere ich das Array mit SetLength. Die bestehenden Zellen behalten ihre definierte Werte. Was auch gewünscht ist. Aber.... Zufall oder nicht? Ich finde in der Doku keine Definition.

Danach vergrößere ich das Array mit SetLength. Die bestehenden Zellen behalten ihre definierte Werte. Und die neuen Zellen bekommen wieder einen definierten Wert (Keine Zufallszahl). Aber.... Zufall oder nicht? Ich finde in der Doku keine Definition.

Kennt einer eine Stelle in der Delphi-Dokumentation, in dem beschrieben wird, wie sich die Werte eines Array nach Änderung der Größe mit SetLength verhalten? Gibt es Unterschiede bei den Datentypen? (Integer, double, String, etc.)

Wie gesagt: Eine triviale Frage. Aber es interessiert mich.


Hier das Beispielprogramm:

Delphi-Quellcode:
program ccConsoleTest;

{$APPTYPE CONSOLE}

{$R *.res}


uses
  System.Types,
  System.SysUtils,
  System.math;

Type
  TestRecord = record
    x: Integer;
    y: Integer;
    function asText: String;
  end;

TTestRecordArray = array of array of TestRecord;

Procedure writelnTestArray(aTestRecordArray: TTestRecordArray);
var
  lx: Integer;
  ly: Integer;
  stri: string;
begin
  for ly := 0 to length(aTestRecordArray[0]) - 1 do
    begin
      stri := '';
      for lx := 0 to length(aTestRecordArray) - 1 do
        stri := stri + aTestRecordArray[lx,ly].asText + ' ';
      writeln(stri);
    end;
  writeln('---------');
end;

function TestRecord.asText: String;
begin
  Result := inttostr(x) + '/' + inttostr(y);
end;

var
  lx: Integer;
  ly: Integer;
  lTestRecordArray: TTestRecordArray;
begin
  setlength(lTestRecordArray, 5, 5);
  // Zufallswerte oder nicht
  writelnTestArray(lTestRecordArray);
  // Belegen der Zellen
  for lx := 0 to 4 do
    for ly := 0 to 4 do
      begin
        lTestRecordArray[lx,ly].x := lx;
        lTestRecordArray[lx,ly].y := ly;
      end;

  writelnTestArray(lTestRecordArray);
  // Array verkleinern
  setlength(lTestRecordArray, 3, 3);
  writelnTestArray(lTestRecordArray);
  // Array vergrößern
  setlength(lTestRecordArray, 5, 5);
  writelnTestArray(lTestRecordArray);
  // Ende
  readln;
end.
Hier der Output:

Code:
0/0 0/0 0/0 0/0 0/0 
0/0 0/0 0/0 0/0 0/0 
0/0 0/0 0/0 0/0 0/0 
0/0 0/0 0/0 0/0 0/0 
0/0 0/0 0/0 0/0 0/0 
----------------
0/0 1/0 2/0 3/0 4/0
0/1 1/1 2/1 3/1 4/1
0/2 1/2 2/2 3/2 4/2
0/3 1/3 2/3 3/3 4/3
0/4 1/4 2/4 3/4 4/4
----------------
0/0 1/0 2/0
0/1 1/1 2/1
0/2 1/2 2/2
----------------
0/0 1/0 2/0 0/0 0/0 
0/1 1/1 2/1 0/0 0/0 
0/2 1/2 2/2 0/0 0/0 
0/0 0/0 0/0 0/0 0/0 
0/0 0/0 0/0 0/0 0/0

Uwe Raabe 7. Aug 2018 10:50

AW: Array, setlength und vorhandene Daten
 
Zitat:

Zitat von bernau (Beitrag 1409976)
Ist der Inhalt nun definiert, oder Zufall? (Bisher habe ich so ein Array immer initialisiert und mir keine Gedanken gemacht). Im Beispielprogramm sieht es so aus, als wenn die Inhalte des Records (Integer-Werte) einen definierten Zustand haben (0). Zufall oder nicht? Ich finde in der Doku keine Definition.

Dann belege ich die Records mit Werten.

Danach verkleinere ich das Array mit SetLength. Die bestehenden Zellen behalten ihre definierte Werte. Was auch gewünscht ist. Aber.... Zufall oder nicht? Ich finde in der Doku keine Definition.

Danach vergrößere ich das Array mit SetLength. Die bestehenden Zellen behalten ihre definierte Werte. Und die neuen Zellen bekommen wieder einen definierten Wert (Keine Zufallszahl). Aber.... Zufall oder nicht? Ich finde in der Doku keine Definition.

Steht aber doch in der Doku: http://docwiki.embarcadero.com/Libra...stem.SetLength
Zitat:

Bei einer dynamischen Array-Variable weist SetLength dem in S referenzierten Array die angegebene Länge zu. Die vorhandenen Elemente des Arrays werden beibehalten, und der neu zugewiesene Platz wird auf 0 oder nil gesetzt.

bernau 7. Aug 2018 10:58

AW: Array, setlength und vorhandene Daten
 
Oh mann.:oops:

Fünf mal durchgelesen und nicht gesehen.

Bitte schließen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr.

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