[Delphi]Tablice dynamiczne i SetLength

0

Witam. Muszę użyć tablic dynamicznych więc nie mogę napisać tak:

var
  Tablica : array[1..100] of Integer;

tylko tak

var 
Tablica : array of integer;

a w procedurze:

SetLength(Tablica,100);

Wszystko fajnie, mam tablicę dynamiczną i działa teraz jak zwykła, jednak nie mogę rozgryźć jednej rzeczy, czyli wartości początkowej. Za pomocą SetLength ustaliłem sobie że ma być "długa" na 100 tylko że ja chcę uzyskać efekt array[1..100] czyli aby zaczynało od 1.

Jest jakaś funkcja ustalająca wartość początkową tablicy dynamicznej? Szukam i szukam i nic o tym nie ma. W kodzie nie mogę używać np. i+1 bo wszystko jest zbyt skomplikowane i potem i psuje mi to cały kod :/

Więc jak to mogę zrobić? Proszę o pomoc

0

Nie, tablice dynamiczne mają zawsze pierwszy element o indeksie 0

0

I nie mogę tego w żaden sposób zmienić?

0

Tego nie. Nie wiem co ci przeszkadza i+1, no ale "skoro psuje kod" :>
Możesz np. napisać funkcję w stylu:

function pobierz(index: integer) : integer;
begin
  Result := Tablica[index + 1];
end;

Ale to jeszcze bardziej "psuje kod" i jego czytelność.

0

a nie mozesz zadeklarowac o tablicy o 1 wiekszej i po prostu nie uzywac tego pierwszego elementu (o indeksie 0)?

0

To mu będzie "nieelegancko" wyglądało + 1 w SetLength :>

0

straci 4 bajty pamięci.. straszne :P

0

teoretycznie da się coś takiego zrobić: własna klasa opakowująca tablicę dynamiczną z default property do indeksowania elementów — ale to by miało niepotrzebny narzut wydajnościowy.

zresztą niechaj będzie:

type TIntArray=class
     private
       tab:array of integer;
       base:integer;
       procedure SetItem(index,value:integer);
       function GetItem(index:integer):integer;
     public
       procedure SetBounds(afrom,ato:integer);
       destructor Destroy; override;
       property Item[i:integer]:integer read GetItem write SetItem; default;
     end;

procedure TIntArray.SetItem(index,value:integer);
begin
 { można dodać kontrolę indeksu }
  tab[index-base]:=value;
end;

function TIntArray.GetItem(index:integer):integer;
begin
 { można dodać kontrolę indeksu }
  GetItem:=tab[index-base];
end;

procedure TIntArray.SetBounds(afrom,ato:integer);
var len:integer;
begin
  len:=ato-afrom+1;
  setlength(tab,len);
  base:=afrom;
end;

destructor TIntArray.Destroy;
begin
  finalize(tab);
end;

var tab:TIntArray;
begin
  tab:=TIntArray.Create;
  tab.SetBounds(1,10); // array [1..10]
  tab[1]:=2;
  writeln(tab[1]);
  tab.Free;
end.

ale nie bardzo polecam, bo prawie na pewno jest wolniejsze od zwykłej tablicy. nie mierzyłem.
powinno działać też dla ujemnych indeksów, czyli np. SetBounds(-10,-5)

.
0

Teoretycznie to każdy problem da się rozwiązać niepotrzebym kombinowaniem - wszystko jedno: klasa, funkcja, nadmiarowy element - tylko po co? Gość po prostu musi się nauczyć, że najczęściej indeksy zaczynają się od 0. A jak dostanie tablicę asocjacyjną do obsługi to co mu zacznie przeszkadzać?

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