Avatar billede hvedstrup Nybegynder
23. oktober 2002 - 15:08 Der er 15 kommentarer

Længde af array

Er der en funktion i c som returnerer længden af et array?
Avatar billede arne_v Ekspert
23. oktober 2002 - 15:13 #1
Nej.
Avatar billede hvedstrup Nybegynder
23. oktober 2002 - 15:15 #2
Er det virkelig rigtigt?
Ligesom arraynavn.length() i java???
Hvad gør man så hvis man har en funktion som tager arrays af forskellig længde.
Avatar billede roger Nybegynder
23. oktober 2002 - 15:18 #3
HeHe.. så holder man styr på længden på anden måde. Kreativitet :P
Avatar billede arne_v Ekspert
23. oktober 2002 - 15:19 #4
Ja.

Java er anderledes en C på dette punkt.

Man sende længden med over som argumenter.

Eks.:

    fgets

      Reads a line from a specified file, up to one less than the
      specified maximum number of characters or up to and including the
      new-line character, whichever comes first.  The string is stored in
      the argument str.

      Syntax:

            #include <stdio.h>

            char *fgets(char *str, int maxchar, FILE *file_ptr);
Avatar billede hvedstrup Nybegynder
23. oktober 2002 - 15:19 #5
Kan man så tælle længen af arrayet op ved hjælp af en lykke?
Avatar billede hvedstrup Nybegynder
23. oktober 2002 - 15:23 #6
løkke selvfølgelig!
Avatar billede arne_v Ekspert
23. oktober 2002 - 15:24 #7
Generelt: nej.

Hvis du ved noget om arrayet kan du sommetider.

Det mest kendte eksempel er strenge i form af char
arrays, hvor du ved at der ligger en nul char til sidst.

Den kan du lede efter (eller bare bruge strlen som gør det
for dig).

Men det gælder ikke generelt for arrays.
Avatar billede soepro Nybegynder
23. oktober 2002 - 15:32 #8
Der findes ikke nogen member funktion, om du kender det fra java's .length(), men du kan næsten altid opnå det samme vha. en simpel sizeof() beregning:

int intArray[100];
int intArrayLength = sizeof(intArray) / sizeof(intArray[0]);

PAS PÅ - den holder ikke for variabler der overføres som pointere, altså typisk char arrays.

char charArray[100];
int  charArrayLen = sizeof(charArray) / sizeof(charArray[0]);

Denne er OK.

int myFunct(char *array)
{
  int arrayLen = sizeof(array) / sizeof(array[0]);
}
myFunct(charArray);
HOLDER IKKE - charArray er en pointer, og resultatet bliver derfor altid 4. (En pointer er normalt 32-bit, dvs. 4 bytes = 4 char.) Følgende ændring vil fungere:

int myFunct(char *array, int arrayLen)
{
  // arrayLen overføres
}
myFunct(charArray, sizeof(charArray)/sizeof(charArray[0]));

Brug f.eks. typedef på char array, for at sikre at det fungerer rigtigt.
Avatar billede oink Nybegynder
23. oktober 2002 - 16:54 #9
Jah, man kan bruge strlen:

int main()
{
    char hej[] = "HEJSA!";
    cout << strlen((char*)hej);
    return 0;
}
Avatar billede smokes Nybegynder
23. oktober 2002 - 23:15 #10
hvedstrup: hmm du kan ligeså godt beholde pointene og lukke denne tråd.. der ER ingen metode.. men egentlig er dit spørgsmål også ligegyldigt.. hvis du har oprettet det statisk med int array[100].. så ved du at skidtet er 100 ints langt.. sidste item er array[99] fordi du starter med at tælle fra 0.. i dette tilfælde kan du dog bruge sizeof(metoden) men den fortæller dig hvor meget skidtet fylder i BYTES.. det vil sige du kan ikke adressere array[sizeof(array)-1]..
det andet tilfælde.. hvis du har oprettet array dynamisk på heapen med malloc() eller new.. well.. igen er det DIG der har oprettet det.. derfor ved du også hvor langt lortet er..  hvad jeg vil frem til er at du kan vente lige så længe du vil.. du får ikke et nyttigt svar på et ligegyldigt spørgsmål.. hvis vi skal hjælpe dig ville det måske være en ide at forklare HVORFOR du skal bruge længden på array'et??
Avatar billede segmose Nybegynder
28. oktober 2002 - 16:22 #11
Hvis du vil lave lidt creativ programering kan du lave det selv.

/* Warning untested code by segmose */
char *MyAlloc(size_t siz) {
  char tmp = malloc(siz+sizeof(size_t);
  assert(tmp);
  (size_t *)tmp = siz;
  tmp += sizeof(size_t);
  return tmp;
}
size_t ArrayLen(char *array) {
  return *(size_t *)(array - sizeof(size_t));
}

int main(void) {
  char
    *test;
  test = MyAlloc(100);
  printf("size of test is %ld", (long)ArrayLen(test));
  return EXIT_SUCCESS;
}
Avatar billede thjal Nybegynder
22. november 2002 - 09:48 #12
Hey! Hvad er der galt med STD::Vector? (selvfølgelig kun brugbart under Windows) - men den har alle de fordele som et array under Java har. Og der kan du gøre hvad som helst, som fx. at aflæse længden på vectoren - bare slå den op på MSDN :)

-hygge
Avatar billede segmose Nybegynder
22. november 2002 - 13:31 #13
Ja, jeg kan også en masse spændende ting i C++, men hvedstrup skrev C hvor
der ikke er en STD, der findes forøvrigt masser af implementeringer til C++
compilere at Standard Template Libery (STL) ikke kun til microsoft men til
andre compilere.
Avatar billede thjal Nybegynder
22. november 2002 - 14:17 #14
segmose - du har fuldstændigt ret - jeg læste got spørgsmålet, men da jeg nåede bunden af siden havde jeg åbentbart glemt det totalt :). Til hvedstrup kan jeg jo bare sige: "Glem mit inlæg, det er ikke to potter pis værd når du programmere i C".
Avatar billede thjal Nybegynder
22. november 2002 - 14:18 #15
ok og got staves selvfølgeligt "godt"... :P
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