Avatar billede c.h. Nybegynder
22. marts 2000 - 20:28 Der er 16 kommentarer og
2 løsninger

Antal elementer i Array's

Hvordan tæller jeg antallet af elementer i en array? Og hvordan indsætter jeg et nyt element?
Avatar billede retep Nybegynder
22. marts 2000 - 20:54 #1
Hvad har du i dit array? Objekter, Records eller heltal??? Og hvordan er de initaliserede???

Du indsætter noget i et array på pladsen i (integer) således:

MitArray[i]:= EtEllerAndetAfArrayetsType;

Mvh
Retep

Avatar billede c.h. Nybegynder
22. marts 2000 - 22:46 #2
Jeg har integers.

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?
Avatar billede retep Nybegynder
22. marts 2000 - 23:19 #3
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 :-)

Mvh
Retep
Avatar billede retep Nybegynder
22. marts 2000 - 23:59 #4
Her er hvad jeg har kunnet finde:

Dynamisk Array:
Virker fra Delphi 4 og opefter.

Når variabel erklæres skal der ikke indtastes en størrelse. Først efter erklæringen sættes størrelsen. Eks.

Var
  MitArray : Array of integer;
Begin
  SetLength(MitArray, 20);
  .
  .
  .
  .
End;

Her skabtes et array, og størrelsen blev sat til 20.

Størrelsen kan senere ændres med SetLength proceduren.

Det skal også noteres at et dynamisk array altid starter med 0.

Derudover står der en hel del i Delphi's hjælp om hvordan du kan manipulere dynamiske arrays.

Håber dette var hvad du manglede :-)

Mvh
Retep
Avatar billede retep Nybegynder
23. marts 2000 - 00:02 #5
Skulle også lige nævnes at til at finde størrelsen på et dynamisk array, kan man bruge length(MitArray)...
Avatar billede michaelras Nybegynder
23. marts 2000 - 09:50 #6
I Delphi 3 er det også muligt at finde størrelsen på en array ved at bruge High(MinArray) og/eller Low(MinArray)

ex:
var MinArray : Array[5..15] of Integer;

Så vil
Low(MinArray) returnere 5
High(MinArray) returnere 15

Man kan også lave dynamiske arrays i Delphi 3:
type PRecArray = ^TRecArray;
    TRecArray = Array[0..32767] of TMinType;

var MinArray : PRecArray;

GetMem(MinArray, AntalElementer * sizeOf(TMinType));

Michael

Ps: Mener det er nogenlunde sådan, er et stykke tid siden, og havde ikke lige tid til at checke

Avatar billede ckrame Nybegynder
23. marts 2000 - 10:31 #7
Kan dynamisk arrays kun være én diminsionelle ?
Avatar billede retep Nybegynder
23. marts 2000 - 11:01 #8
ckrame>> Nej du kan også lave multidimensionelle dynamiske arrays...

ex.

a : array of array of integer;

setlength(a,5,5);

og du tilgår dem som alm. multidimensionelle arrays...

ex.

a[2,2] := 4;

Mvh
Retep

Avatar billede c.h. Nybegynder
23. marts 2000 - 14:23 #9
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.
Avatar billede ckrame Nybegynder
24. marts 2000 - 08:03 #10
Undskyld jeg sådan bryder ind, men jeg mente det var mest relevant at sprøge her hvor debatter var igang.

retep>> Vil det sige at antallet af dimensioner er dynamiske ?.
Kan man i starten skrive setlength(a,5) og senere setlength(a,5,5)?
Avatar billede retep Nybegynder
24. marts 2000 - 11:11 #11
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...
Avatar billede retep Nybegynder
26. marts 2000 - 20:55 #12
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...

http://geocities.com/~franzglaser/tpsrc/tp_dynarr.html

God fornøjelse ;)
/Retep
Avatar billede retep Nybegynder
26. marts 2000 - 20:57 #13
P.s. du skal cirka 1/4 ned af siden før du finder dét om dynamiske arrays...
Avatar billede michaelras Nybegynder
27. marts 2000 - 10:05 #14
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)
Avatar billede c.h. Nybegynder
27. marts 2000 - 13:32 #15
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.
Avatar billede michaelras Nybegynder
28. marts 2000 - 12:08 #16
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)

Michael
Avatar billede michaelras Nybegynder
28. marts 2000 - 12:19 #17
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)

Michael
Avatar billede c.h. Nybegynder
02. april 2000 - 00:41 #18
Tak for hjælpen begge to.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester