Czy w Delphi są tablice szarpane ?

0

Tak się zastanawiam... Czy w Delphi (ogólnie pascal'u) są tablice szarpane (jak jest, np.w Javie) ?

int[][] vec =
{
 { 1, 2 },
 { 2, 3, 4, 5 },
 { 3 }
};
1
var 
    t:array of array of integer;
    i,j,n:integer;
begin
    n:=5;
    setlength(t,n);
    for i:=0 to n-1 do
        setlength(t[i],i+1);
    for i:=0 to n-1 do
         for j:=0 to i do
            t[i,j]:=i*j;
    for i:=0 to n-1 do begin
        for j:=0 to i do
            write(t[i,j]:5);
        writeln
    end;
end.
1

setlength nadaje rozmiar oraz zmienia rozmiar tablicy dynamicznej. Jeśli trzeba, przealokuje istniejące dane. Przy zwiększaniu nowy obszar jest zerowany (ale dane już istniejące są kopiowane). Przy zmniejszaniu tablica jest po prostu przycinana.

setlength zawsze może (ale nie musi) powodować relokację. Wobec tego, jeśli braliśmy wskaźniki na elementy tablicy, po zmianie rozmiaru tablicy wskaźniki stają się nieaktualne (kompilator nas nie ostrzeże).

Tablice dynamiczne są zawsze indeksowane od zera.
Tablice takie podlegają odśmiecaniu, ale można je ręcznie zwolnić przez finalize(tab).

Dodam jeszcze, że w Delphi zapis t[i,j] jest zawsze równoznaczny z t[i][j] niezależnie od tego, jakiej natury są poszczególne wymiary tablicy.
podobnie t[i][j][k] t[i,j][k] t[i][j,k] t[i,j,k] znaczą to samo.

0
type
    pint = ^integer;
var 
    z:^pint;  //pascal nie lubi gdy napiszemy z:^^integer; dziwak....
    i,j,n:integer;
begin
    n:=5;
    getmem(z,n*4); // 4 to rozmiar wskaźnika
    for i:=0 to 4 do
        getmem((z+i)^,(i+1)*sizeof(integer)); 
    for i:=0 to n-1 do
         for j:=0 to i do
            ((z+i)^+j)^:=i*j;
    for i:=0 to n-1 do begin
        for j:=0 to i do
            write(((z+i)^+j)^:5);
        writeln
    end;
    writeln(z[2][2]);  //  <--------
end. 

1 użytkowników online, w tym zalogowanych: 0, gości: 1