Du misforstod det. Spørgsmålet er om/hvordan man kan udvide et array med et element. Altså hvis det er erklæret som MitArray: Array[0..1] of integer; og jeg gerne vil have det til at være med 3 elementer altså [0..2] - kan jeg gøre det - og hvordan? Jeg er rimelig ny indenfor Delphi - hvad mener du med hvordan de er initaliserede?
Ahhhh... Så er jeg ved at være med :-) Du vil gerne vide hvordan man kan udvide et array, når det er fyldt op... D.v.s. hvordan man benytter et dynamisk array. Jeg troede du var på helt bar bund og ville vide hvordan man talte hvormange elementer man havde fyldt i sit array. Og for at finde ud af det, ville man jo være nødt til at initallisere arrayet hvor man satte alle pladser til at være ét specifikt tal, når de ikke er i brug, for derefter at løbe hele arrayet igennem, og tælle en variabel op hvergang man ikke fandt pågældende tal.
Grunden til at jeg spurgte om type var at hvis det var objekter ville man jo bruge nil...osv...
Jeg vender lige tilbage med svar på dynamisk array... Skal lige kigge i en bog :-)
retep>> Jeg har desværre kun Delphi 3. michaelras>> Jeg er altså lidt for ny til at forstå hvordan du laver dynamiske arrays. Kan du ikke uddybe de enkelte ting lidt mere. Jeg tænker især på GetMem-proceduren.
ckrame>> Det ved jeg ikke om du kan. Tror jeg ikke. Men hvis du opretter et array of array of integer, så er det rigtigt at du bruger setLength med tre parametre...
c.h.>> Her har du et link, der forklarer hvordan man tidligere (læs: før Delphi4) lavede dynamiske arrays. Men jeg tror hurtigt at du vil indse, at du skal opgradere til Delphi4, eller finde en anden løsning på dit problem. F.eks. at starte med at lave dit array så stort så du er sikker på at der er plads nok. RAM er jo normalt ikke et stort problem i dag...
C.h: GetMem proceduren allokerer bare AntalElementer * sizeOf(TMinType) bytes hukommelse, og tilegner det til pointeren MinArray, som er en pointer til en Array af TMinType. (TMinType kan være alt lige fra records, arrays aller fx Integer). Altså med andre ord klargører et hukommelsesudsnit så programmet har et sted at placere dataen i arrayen. sizeOf(TMinType) returnerer hvor mange bytes TMinType fylder, og ganget med AntalElementer * sizeOf(TMinType) får man jo så det samlede hukommelsesforbrug for arrayen.
OBS. GetMem pointere skal alt frigøres med FreeMem !!!
Michael
PS: For at få adgang til de enkelte data i arrayen: fx MinArray^[100] for at få fat på data nr. 101 (starter fra 0)
Retep>> Hvor meget koster det at opgradere til Delphi4? Jeg fik mit Delphi3 sammen med et datablad - jeg tror det var Alt om Data.
Michaelras>> Når man erklærer MinArray klargøre den så ikke allerede der plads til arrayet? Hvordan finder jeg størrelsen af arrayet? Jeg har prøvet med high(Minarray) men det gik ikke. Hvis du vil have nogle point så svar i stedet for at kommenter.
Hvis du erklærer MinArray som en almindelig array fx: var MinArray : Array[0..100] of Integer;
så har du ret i at den automatisk klargører arrayen. Men hvis du bruger en pointer, som er nødvendigt for dynamiske arrays i delphi 3, så er det kun selve pointeren der klargøres, og den sættes som standard til nil = ingenting. For at klargøre selve arrayen - som MinArray jo er en pointer til - må man bruge GetMem for at allokere hukommelse til den.
Et lille eksempel:
function LavNoget(Antal : Integer) : Integer; type PMyArray = ^TMyArray; TMyArray = Array[0..32767] of Integer;
var MinArray : PMyArray; begin GetMem(MinArray, Antal * sizeOf(Integer)); // ^ Allokerer hukommelse til arrayen (* Gør et eller andet med den array... fx: MinArray^[0] := 12345; *) FreeMem(MinArray, Antal * sizeOf(Integer)); // ^ Vi er færdige med at bruge arrayen, frigør dens hukommelse end;
Jeg vil lige gøre opmærksom på at 32767 i: type PMyArray = ^TMyArray; TMyArray = Array[0..32767] of Integer; betemmer at der max kan være 32767 elementer i arrayen HVIS OG KUN HVIS Range Checking er slået til under "Compiler directives". Du kan evt. slå Range Checking fra i de procedurer/functioner hvor du bruger dynamiske arrays (vha. {$RANGECHECKS ON} eller {$RANGECHECKS OFF} ) hvis Range Checking er slået fra kan man nøjes med at skrive: TMyArray = Array[0..0] of Integer; ellers kan du jo altid ændre tallet 32767 til noget højere
Du har ret ang. at high/low ikke virker med dynamiske arrays, men de virker med almindelige arrays... Det er fordi delphi ikke ser pointeren som en array, og hvis man bruger high(MinArray^) så returnerer den det er står specificeret i type delen (fx 32767)
Hvis du også vil være i stand til at ændre antallet af elementer i din dynamiske array kan du gøre noget a la (er vist ikke særlig optimeret):
type PMyArray = ^TMyArray; TMyArray = Array[0..0] of Integer;
procedure ReSize(var P : PMyArray; GemAntal, Elementer : Integer); var T : PMyArray; I : Integer; begin GetMem(T, Elementer * sizeOf(TMyArray)); For I := 0 to GemAntal do begin T^[I] := P^[I]; end; FreeMem(P); P := T; end;
Det kræver bare at ALLE FreeMem der bruges på de dynamiske array (fx MinArray) kun skal kaldes som FreeMem(MinArray)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.