Einzelnen Beitrag anzeigen

Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#1

Array, setlength und vorhandene Daten

  Alt 7. Aug 2018, 11:44
Delphi-Version: 10.2 Tokyo
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
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat