Avatar billede onkel_satan Nybegynder
09. september 2004 - 14:59 Der er 22 kommentarer og
1 løsning

array/pointers igen

Hejsa!

Så er jeg igen kørt fast i det med array/pointers. Vil lave en funktion som konvertere dec. til bin. Hvordan det gøres har jeg styr på men problemet lægger i hvordan jeg returnere mit resultat.

Det jeg har lavet ind til videre ser således ud men virker ikke helt.

char* decToBin(int n){
    char bin[32]; //idet en int er på 32 bit.
    int i;
    for(i=0; n>0; i++){
        bin[i] = n%2;
        n = n/2;
    }
    return bin;
}

Hvis nogen kunne forklare mig hvordan man i al sin almindelighed retur arrays af forskellige fra funktioner.

En anden ting, et arrays størrelse SKAL defineres fra starten af lige meget om man initialsere dem som en adresse array[] eller som pointer, korrekt ??
Avatar billede onkel_satan Nybegynder
09. september 2004 - 15:00 #1
edit:
..... returnere arrays af forskellige data type fra funktioner.
Avatar billede arne_v Ekspert
09. september 2004 - 15:04 #2
Du bør ikke returnere er automatisk array.

static char bin[32]; //idet en int er på 32 bit

evt. flytte den udenfor funktionen
Avatar billede arne_v Ekspert
09. september 2004 - 15:05 #3
Til simple løsninger ville jeg bruge:

static char bin[32];

char* decToBin(int n){
  ...
  return bin;
}
Avatar billede arne_v Ekspert
09. september 2004 - 15:06 #4
Til avanacerede løsninger som skal være thread safe vil jeg bruge:

void decToBin(int n, char *bin){
  ...
}

altså sende bufferen med over som argument.
Avatar billede arne_v Ekspert
09. september 2004 - 15:07 #5
Du kan allokere of deallokere dynamisk.

C:

char *p;
p = (char *)malloc(a+b);
...
free(p);

C++:

char *p = new char[a+b];
...
delete[] p;
Avatar billede arne_v Ekspert
09. september 2004 - 15:07 #6
OK ?
Avatar billede onkel_satan Nybegynder
09. september 2004 - 15:12 #7
"Du bør ikke returnere er automatisk array."
Er ikke helt med, jeg skal da returnere et svar ??
og hvis jeg flytter arrayet ud hvor skal funktionen så gemme resultatet ?
Avatar billede arne_v Ekspert
09. september 2004 - 15:15 #8
Du skal enten  bruge:

static char bin[32];

char* decToBin(int n){
  ...
  return bin;
}

eller:

char* decToBin(int n){
  static char bin[32];
  ...
  return bin;
}
Avatar billede arne_v Ekspert
09. september 2004 - 15:16 #9
I begge tilfælde kan bin bruges inde i funktionen.

Men med et automatisk array som betragter C hukommelsen som frigivet
til andet brug ved return.
Avatar billede onkel_satan Nybegynder
09. september 2004 - 15:21 #10
ok tygger lidt på det.
Avatar billede segmose Nybegynder
09. september 2004 - 15:23 #11
De lokale data der ligger i bin ligger på stack og næste gang stack bruges efter return er de overskrevet, den rigtige måde er

void decToBin(int n, char *bin)

hvor man sender en pointer med (eller en referance i C++), de 2 løsninger med static holder ikke i længden, tænk reentrant og multi-threaded.

char *p;
assert(p = (char *)malloc(BitPerInt));
decToBin(BitPerInt, p)
free(p);
Avatar billede onkel_satan Nybegynder
09. september 2004 - 15:47 #12
Jeg er med på at variabler int, char arrays bliver gemt på stacken og så snart at funktionen hvori de er erkleret ender bliver deres plads frigivet. Men det gæler ikke pointers vel ?? og hvis jeg forstår det korrekt saa bliver f.eks. obejkter startet med new oxo gemt et andet sted. Hvor er det er de bliver gemt ?
Avatar billede segmose Nybegynder
09. september 2004 - 15:51 #13
new laver arrays på heap, men i dit oprindelige exemple bliv arrayet oprettet lokalt i decToBin og altså derfor på stacken.
Avatar billede arne_v Ekspert
09. september 2004 - 15:59 #14
segmose>

Har du læst alle indlægene ?
Avatar billede onkel_satan Nybegynder
09. september 2004 - 15:59 #15
ok. Har så lige prøvet at lave det om til den 'rigtige' måde hvor jeg udover en int sender en pointer med hvori resultatet skal gemmes:

void decToBin(int n, char* bin){
    int i;
    for(i=0; n>0; i++){
        bin[i] = n%2;
        n = n/2;
    }
}


int main(int argc, char* argv[]){
    //printf("resultat er: %s\n", getDay(25, 12, 1848));
   
    int n=2000;   
      char* bin;
    decToBin(n, bin);
    printf("The binary number %d equals %d in decimal\n", n, bin);
    return 0;
}

Men char* bin; kan vel ikke bruges som input til funktionen idet at den ikke kan udvides dynamisk sp der skal jeg vel lave en char bin[32]; istedet, korrekt ??
Avatar billede arne_v Ekspert
09. september 2004 - 16:15 #16
Enten en statisk:

char bin[32];

eller en dynamisk:

char *bin = new char[32];

/

char *bin = (char *)malloc(32);
Avatar billede arne_v Ekspert
09. september 2004 - 16:16 #17
afhængig af om det er C eller C++

husk at deallokere (se en 10-15 indlæg længere op hvordan)
Avatar billede onkel_satan Nybegynder
09. september 2004 - 16:31 #18
damn det er godt nok wird, jeg har skrevet følende:
void decToBin(int n, char* bin){
    while(n>0){
        *bin++ = n%2;
        n = n/2;
    }
}

int main(int argc, char* argv[]){
    int n=2000;   
    char bin[32];
    decToBin(n, bin);
    printf("The binary number %d equals %d in decimal\n", n, bin);
    return 0;
}

og så giver den mig 245020 som svar, nogen ide til hvad der sker ?
Avatar billede onkel_satan Nybegynder
09. september 2004 - 16:58 #19
Fandt ud af det. Tak for hjælpen allesemmen.
Avatar billede arne_v Ekspert
09. september 2004 - 17:10 #20
(du printede adressen på bin arrayet)
Avatar billede segmose Nybegynder
10. september 2004 - 09:59 #21
void decToBin(int n, char* bin){
    while(n>0){
        *bin++ = n%2+'0';
        n = n/2;
    }
  *bin = '\0'; // afslut streng
}

int main(int argc, char* argv[]){
    int n=2000; 
    char bin[32+1];
    decToBin(n, bin);
    printf("The binary number %d equals %s in decimal\n", n, bin);
    return 0;
}
Avatar billede segmose Nybegynder
10. september 2004 - 10:00 #22
lige en sidste ting :)
printf("The binary number %s equals %ds in decimal\n", bin, n);
Avatar billede segmose Nybegynder
10. september 2004 - 10:00 #23
lige en sidste ting #2 :)
printf("The binary number %s equals %d in decimal\n", bin, n);
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