Patryk27:
Czyli należy utworzyć dynamiczną tablicę rekordów, która ma stały rozmiar? Obawiam się, że nie w tym wszechświecie.
grzegorz_so:
tym samym temat zadania zawiera w sobie sprzeczność
Nic nie stoi na przeszkodzie, aby macierzy dynamicznej używać jako statycznej i statycznej jako dynamicznej :]
Z pozoru jest to sprzeczność, jednak z punktu widzenia implementacji, dynamiczna macierz to jedynie typ danych, ot specyficzny kontener. Z jego natury wcale nie wynika, że musi zmieniać swój rozmiar podczas danej sesji. Wspomniany stały rozmiar macierzy nie dotyczy ograniczeń wykorzystanego typu danych, a tylko tego konkretnego przypadku, czyli tego jednego dziwnego zadania.
Nie zmienia to jednak faktu, że to podejście starodawne i trąci trochę nonsensem. W Turbo Pascalu nie istniały macierze dynamiczne, więc trzeba było kombinować z wytworzeniem takich dynamicznych tworów.
Zakładając, że program ma posługiwać się wyłącznie wskaźnikami na macierz dynamiczną, przykładowa obsługa może wyglądać tak jak poniżej. W tagu jest jedynie pascal
, bez sprecyzowania konkretnego dialektu, więc przykład napisałem we Free Pascalu:
Kopiuj
type
TNumbers = array of UInt8;
PNumbers = ^TNumbers;
procedure InitNumbers(out ANumbers: PNumbers);
begin
New(ANumbers);
SetLength(ANumbers^, 0);
end;
procedure DisposeNumbers(var ANumbers: PNumbers);
begin
Dispose(ANumbers);
ANumbers := nil;
end;
procedure AddNumber(const ANumbers: PNumbers; const ANumber: UInt8);
begin
SetLength(ANumbers^, Length(ANumbers^) + 1);
ANumbers^[High(ANumbers^)] := ANumber;
end;
procedure ShowNumbers(const ANumbers: PNumbers);
var
LNumber: UInt8;
begin
for LNumber in ANumbers^ do
Write(LNumber:3);
WriteLn();
end;
var
Numbers: PNumbers;
begin
InitNumbers(Numbers);
try
AddNumber(Numbers, 0);
AddNumber(Numbers, 1);
AddNumber(Numbers, 5);
ShowNumbers(Numbers);
finally
DisposeNumbers(Numbers);
end;
end.
Co prawda dotyczy macierzy liczb, jednak na potrzeby testu wystarczy - dodanie obsługi struktur to zadanie dla pytającego. Powyższy kod działa jak najbardziej prawidłowo - brak błędów oraz wycieków pamięci (sprawdziłem pod HeapTrc
). Kod można sprawdzić tutaj.
Tak więc użycie wskaźnika na dynamiczną macierz jest jak najbardziej możliwe.