Hoi,
Ik ben gisteren even bezig geweest met Free Pascal, en wilde daar wat dingen met dynamische arrays doen. Ik kwam tot de conclusie dat dit wel wat moeilijker was dan in Delphi: Geen SetLength, en je kunt ook niet 'Variable: array of TIets' gebruiken.
Ik zal dus met pointers moeten gaan werken, GetMem en FreeMem en voor het resizen waarschijnlijk ReAllocateMem.
Ik maak een record aan, hoe maak ik dan een dynamische array van records ? In een voorbeeldje stond ergens, dat je een statische array maakt met dus als grootte de lengte die de array maximaal kan gaan worden in je programma.
Wat ik wil maken, zou er in Delphi ongeveer zo uitzien:
Code:
Type TPersoon = Record
Naam: String;
LeefTijd: Byte;
Telefoon: Array of String[11]; // Bijv. 1234-567890
end;
..
var
Personen: Array of TPersoon;
Dan op de Pascal manier, maar wel in Delphi geschreven (zonder Telefoon in het record):
Code:
Type TPersoon = Record
Naam: String;
LeefTijd: Byte;
end;
Type Personen = Array [0..9] Of TPersoon;
Type PPersonen = ^Personen;
var
PersonenLijst: PPersonen;
ShowMessage(IntToStr( SizeOf(PersonenLijst^))); // geeft 80 terug
GetMem(PersonenLijst, 3*SizeOf( TPersoon ));
ShowMessage(IntToStr( SizeOf(PersonenLijst^))); // 80
// Ik ging er dus vanuit dat de showmessages de lengte van de gereserveerde ruimte zouden teruggeven, dat doen ze schijnbaar niet.
PersonenLijst^[0].Naam := 'Pieter';
PersonenLijst^[6].Naam := 'Pieter'; // Dit leidt tot een AV...
PersonenLijst^[6].LeefTijd := 46; // Dit kan raar genoeg wel, als ik voorgaande regel natuurlijk eerst weghaal. Waarom kan dit wel, en voorgaande niet ? Bij beiden ken ik waarden toe aan een gedeelte wat ik nog niet heb gereserveerd.
FreeMem(PersonenLijst, 3*SizeOf( TPersoon ));
Ik kan het natuurlijk ook verkeerd doen, maar de manier waarop ik het hier heb toegepast stond op verschillende sites.
Ik moet de array ook nog kunnen resizen, dat de gegevens die er in staan behouden blijven.
En als dat eenmaal lukt, ook de 'lijst' met telefoonnummers erin, zoals bij het Delphi voorbeeld stond.
Wie kan mij helpen met wat informatie hoe ik wel zoiets kan doen? Alleen de manier waarop, het programma maken doe ik zelf graag .
Groeten, Pieter
Bookmarks