Dynamiczne tablice, wskaźnik, record

0

Mam Coś takiego :
type
TRec = record
dlugosc : longint;
il_pol : word;
il_ciag : word;

polecenia : array of word;
ciagi : array of record
Len : word;
ciag : array of Char;
end;
end;
PRec = ^TRec;
var
a : PRec;

begin

i teraz jak chcę ustawić rozmiar dynamicznej tablicy, zanim dam new(a), to wyskakuje mi błąd. Problem polega na tym, że jeśli najpierw dam new(a), to wtedy przydziela za dużo pamięci i mi się dalej program komplikuje :D. Jeśli wcześniej wpiszę np.

polecenia : array[1..2] of word;

to jest wszystko super. Ale chodzi o to, że nie wiem ile chcę mieć elementów w tablicy.
Potrzebuję sposobu, na to aby najpierw ustawić rozmiar tablicy, a potem przydzielić pamięć.

0
var
  a : PRec;
begin
  New(a);
  SetLength(a.polecenia, rozmiar1);
  SetLength(a.ciagi, rozmiar2);
  for i := 0 to Length(a.ciagi)-1 do
    SetLength(a.ciagi[i].ciag, rozmiar3);

Zarezerwuje tyle pamięci ile mu kaźesz. Wpisujac New(a) rezerwujesz tyle pamięci ile zajmuje TRec. Ponieważ używasz tam tablic dynamicznych, które w rzeczywistości są wskaźnikami, to na każdą z nich rezerwujesz 4 bajty.

A swoją drogą strasznie skomplikowane rekordy robisz. Jesteś pewien, że nie da się tego łatwiej zapisać?

/* dopisane */
berl: "komplikuje" i "kompiluje" to dwa różne słowa. Jak coś się kompiluje bez błędów to dobrze. Ale jak się kod komplikuje to wcale takie fajne nie jest :-D

/* dopisane: każe, każe, każe, bo kazać :P - moja kara */

0

Ok, może da się inaczej zapisać, tylko nie bardzo wiem jak :)
Chodzi o to, że ja muszę to wszystko potem wysłać funkcją :

Send(Data : Pointer ; Len : Integer)

więc potrzebuje wskaźnik na mój rekord z dynamiczną tablicą :)

Chyba że to się da jakoś inaczej zrobić :)

0

Już wiem czemu mi to nie gra :)
po prostu a.polecenia[cośtam] przechowuje wskaźnik do rekordu w tablicy, i zawsze zajmuje 4 bajty :). Dlatego jeśli pobierałem rozmiar SizeOf(a^) to zawsze było tyle samo, niezależnie od tego co było w tablicy.
To teraz przejdę do pytania.
Jak zrobić, aby jeśli dam SizeOf(a^) wyświetlił mi się prawidłowy rozmiar i najważniejsze, jeśli wysyłam wskaźnik to mojego rekordu(TRec), to zamiast w 9, 10 bajcie wartości word, w bajtach 9,10,11,12 jest wskaźnik do pola w tablicy. Jak zrobić, aby w 9 i 10 bajcie była wartość word. Uprzedzam, że tablice statyczne odpadają, bo nie znam ilości pól w tablicy. A może da się zrobić to jakoś inaczej?

Jakieś sugestie? :)

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