Avatar billede anderskm Nybegynder
24. april 2010 - 17:42 Der er 5 kommentarer og
1 løsning

C - hukommelsesforbrug for parametre i en funktion

Hejsa :-)

Er i gang med at skrive et filter, der skal simulere rumklang. Det betyder imidlertid at jeg kan ende med at skulle bruge et kæmpe stort array som input parameter. Hele programmet skal køre på en DSP, hvorfor hukommelsen derfor er begrænset.
Mit spørgsmål er måske simpelt, men lyder således: når jeg kalder min funktion, hvad sker der så rent hukommelsesmæssigt med mit array? Bliver det kopieret, så min funktion så at sige har sin egen version af array'et, det kan arbejde med, eller forbliver det kun en version af array'et?

På forhånd tak for hjælpen :-)
Avatar billede arne_v Ekspert
24. april 2010 - 19:27 #1
int a[1000000];
f(a);

void f(int *a) { ... }

og alle andre normale konstruktioner vil kun have en kopi d.v.s. at alle funktioner refererer til samme array.
Avatar billede oddi Nybegynder
24. april 2010 - 19:37 #2
Hvad med at kun lave et array og hvis du skal arbejde med det så bruger du pointere.

eks:

#include <stdio.h>

#define MYSIZE (2)

void myFunc(int arr[], size_t arrSize)
{
    int i;
    int *arrPtr = arr;
   
    for(i = 0; i < arrSize; i++)
    {
        *arrPtr *= 2;
        arrPtr++;
    }
}

int main(void)
{
    int myArr[MYSIZE] = {1,2};
   
    myFunc(myArr, MYSIZE);
   
    int i;
    for(i = 0; i < MYSIZE; i++)
    {
        printf("myArr[%i] = %i\n", i, myArr[i] );
    }
    return 0;
}
Avatar billede anderskm Nybegynder
24. april 2010 - 20:33 #3
Jeg har tænkt på pointer løsningen, og har faktisk allerede implementeret den halvt :-)
Mit spørgsmål var egentlig ikke så meget på hvad en løsning kunne være, men mere på om DSP'en kopierer array'et, hvis man ikke bruger en pointer.

Men tak for forslagene. Det bekræfter, at mit brug af pointerer ikke er helt ved siden af :-)
Avatar billede arne_v Ekspert
24. april 2010 - 22:41 #4
I den her sammenhæng er der ikke forskel på array og pointer.

Hvis du kører:

#include <stdio.h>

void f1(int *a)
{
    printf("%p\n", a);
}

void f2(int a[])
{
    printf("%p\n", &a[0]);
}

int main()
{
    int a[] = { 1, 2, 3 };
    int *p = a;
    f1(a);
    f2(a);
    f1(p);
    f2(p);
    return 0;
}

vil du se at det er samme adresse for alle 4 kombinationer.
Avatar billede anderskm Nybegynder
25. april 2010 - 00:14 #5
Ah, ja. Det var egentlig en smart måde at teste det på :-)

arve_v, smid et svar, så kvitterer jeg med point :-)
Avatar billede arne_v Ekspert
25. april 2010 - 00:16 #6
ok
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