zerowanie tablic wielowymiarowych

0

Witam

// mam tablice
var
  tab : array of array of array of Integer ;

// gdzies w funkcji ja tworze
begin
  SetLength(tab,  3, 3, 3) ;
end ;

// jako ze funkcja SetLength nie zeruje takiej tablicy chcialbym ja sam wyzerowac wiec pisze dodatkowo
begin
  SetLength(tab,  3, 3, 3) ;
  ZeroMemory(tab, sizeof(Integer)*3*3*3) ;
end ;

// i wywala blad :)
// czy jedynym rozwiazaniem jest zerowac to w petli?
0

ja to zawsze tak robiłem:

var tab: array[0..2] of array[0..1] of byte;
    i,j: Integer;
begin
for i:= 1 to 3 do
  for j:=1 to 2 do
    begin
      tab[i-1,j-1]:=i*10+j;  // ustawienie wartości
    end;
for i:= 1 to 3 do
  for j:=1 to 2 do
    begin
      FillChar(tab[i-1],sizeOf(tab[i-1]),0); // wyzerowanie tablicy
    end;
0

Uzywasz ZeroMemory tylko na ostatnim wymiarze (na tablicy liiowej). Po reszcie wymiarów lecisz pętla.

0

ja mam pytanie także dotyczące tablic wielowymiarowych.... otóż w pascalu nie chce mi sie skompilowac takie cos :

var
  tab : array of array of array of Integer ;
begin
  SetLength(tab,  3, 3, 3) ;
end ;

czyli to co powinno działać :D (to jest ten kod z góry ^) mi to nie działą...... używam FPC i mi wywala Syntax error: [ expected but OF found;
nie wiem dlaczego tak jest skoro wlasnie w taki sposób deklaruje się dynamiczne tablice wielowymiarowe.
z góry dziękuje za pomoc :D

0

a od kiedy pascal ma w standardzie tablice dynamiczne? :/

0

a nie ma? o kurde.... THX..... nie wiedziałem

i jak ja teraz zrobie zadanie z OI?

0

Napiszesz program konsolowy w Delphi :)

//DOPISANE
Jak słusznie zauwazył niejaki Juhas, którego post szybko zniknął, w pascalu są tablice wielowymiarowe, lecz nie ma dynamicznych, i o to zapewne chodziło ŁF.

0

nie można..... zgodnie z przepisami oni będą go kompilować Free Pascal Compilerem :(

da się jakoś zrobic te tablice wilelowymiarowe w pascalu czy nie?

0

A wiesz... Takich jak w delphi nie da sie, ale da się je zasymulować na tablicy jednowymiarowej , a jesli chcesz pzekroczyć prog 64KB to na tablicy wskaźników do tablic dynamicznych

0

a moglbys napisac przyklad tej symulacji w pascalu? z góry dziękuje :D

----dopisane-----
teraz sprawdzałem i nawet zwykla tablica mi nie działa....
napisalem
var
tabl: array of integerl
(...)
i mi wyskoczył ten sam błąd..... ze kompilator oczekiwał na ] a zastał of :( czemu tak jest? napisaliscie ze pascal nie obluguje tablic wielowymiarowych... no ok, ale zwykle dynamiczne to chyba obsluguje no nie?

// o bosz, przejęzyczenie - oczywiście, że chodziło o dynamiczne - ŁF

0

tabl: array of integer

To jest właśnie tablica dynamiczna, nie zwykła = statyczna.

a w pascalu ?

type
  buftype=array[0..16383]of integer; // 16384*sizeof(integer)=32KB < 65536 musi byc
  pbuftype=^buftype;
  myarray=array[0..8191]of pbuftype;
  pmyarray=^myarray;

procedure przydziel(var tab:pmyarray;size:longint);
var i,j:word;
begin
  i:=(size+16383)shr 14;
  getmem(tab,i*sizeof(pbuftype)); // sizeof(pbuftype)=4;
  i:=0;
  while size>0 do
    begin
      j:=16384;
      if(j>size)then j:=size;
      size:=size-j;
      getmem(tab[i],j*sizeof(integer));
      inc(i);
    end;
end;

procedure zwolnij(var tab:pmyarray;size:longint);
var i,j,k:word;
begin
  k:=(size+16383)shr 14;
  i:=0;
  while size>0 do
    begin
      j:=16384;
      if(j>size)then j:=size;
      size:=size-j;
      freemem(tab[i],j*sizeof(integer));
      inc(i);
    end;
  freemem(tab,k*sizeof(pbuftype));
end;

// odwołania:

var t:myarray;
t[nr shr 14]^[nr and 16383]:=0; // lub
t[nr div 16384]^[nr mod 16384]:=1;

gdzie:

size - ilosc elementow
nr < size - numer elementu
indeksowanie elementów od 0

Dalej pozostaje tylko przerobienie tablicy jednowymiarowej na wielowymiarowa, przeliczenie np.x,y,z na nr... I tak jesli chcesz zasymulowac tablice 3d o wymiarach dz=2 x dy=3 x dx=4 (array[0..1,0..2,0..3]), to odpowiednio musisz przydzielic 234 komórek a każdy nr:=(((x3)+y)4)+x=z43+y*4+x (dla maksymalnych indeksów z=1, y=2 i x=3... nr:=12+8+3=23... czyli wszystko sie zgadza).

To tak samo jak z ekranem 320x200 przy trybie 13h... pixel o wspołrzednych 100,50 (od zera indeksując) jest w liniowym buforze pod adesem 50*320+100

Musisz pamiętać oczywiście ile komórek stworzyleś, ale to musisz znac, bo to ty przydzielasz pamieć ;>

Proste... wrecz banalne, orawda ?

// Te : shr 14 i and 16383 są zamiast: div 16384 i mod 16384 , operacje na bitach są po prostu szybsze, a 16384 i 8191 nie są przypadkowo dobrane. Btw. nie sprawdzałem, czy się skompiluje.

0

dzieki, przeanalizuje i ewentualnie zastosuje (jak zrozumiem)
[browar] piwko dla Ciebie :D kawał dobrej roboty, oby takich ludzi więcej na forum :D

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