|
| return array i C Fra : finn knussen |
Dato : 23-05-06 18:58 |
|
hvordan retunere jeg et array fra en funktion i en (C-fil) til en
anden funktion i en anden (C-fil)
| |
N_N (23-05-2006)
| Kommentar Fra : N_N |
Dato : 23-05-06 19:35 |
|
> hvordan retunere jeg et array fra en funktion i en (C-fil) til en
> anden funktion i en anden (C-fil)
Ved ikke om man i det hele taget kan, men du kan returnere en pointer til et
array.
| |
Ukendt (23-05-2006)
| Kommentar Fra : Ukendt |
Dato : 23-05-06 20:08 |
|
Kommer lidt an på hvor du allokerer array'et henne, i den kaldende kode
eller inde i funktionen.
Idet førstnævnte er ret trivielt (bruges bl.a. med str* funktionerne),
går jeg ud fra at du tænker på den sidstnævnte situation hvor funktionen
opretter et array og returnerer det til kalderen i form af en pointer.
Så hvis vi taler om et array af f.eks. int kan det gøres som følger
/* Funktionen opretter et array og returnerer pointeren til det i
*parray og størrelsen af det som retur værdien. */
size_t create_array(int ** parray)
{
int i;
size_t array_size = 100;
*parray = malloc(array_size * sizeof(int));
for(i = 0; i < array_size; i++) {
*parray[i] = i+1;
}
return array_size;
}
int main(int argc, char ** argv)
{
int * array;
int array_size;
int i;
array_size = create_array(&array);
for(i = 0; i < array_size; i++) {
printf("%03d\n", array[i]);
}
/*
Frigiv hukommelsen efter brug. Dog vil det ofte af
symmetri- og kontekstmæssige årsager være fornuftigt
at lave en funktion, release_array(), der gør dette.
*/
free(array);
return 0;
}
Output:
001
002
003
....
099
100
finn knussen (slet H0AYO) skrev:
> hvordan retunere jeg et array fra en funktion i en (C-fil) til en
> anden funktion i en anden (C-fil)
>
| |
Bertel Lund Hansen (24-05-2006)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 24-05-06 13:19 |
|
finn knussen skrev:
> hvordan retunere jeg et array fra en funktion i en (C-fil) til en
> anden funktion i en anden (C-fil)
Du berører et potentielt problem. Hvis du opretter et array i en
funktion, dør det når den afslutter, og en pointer dertil vil
være udefineret.
Jeg opretter f.eks. et array i main(), og så overfører jeg en
pointer dertil som parameter til alle de funktioner der skal
bearbejde det. Derved sikrer jeg mig at det er det originale
array der bliver ændret. Så lader jeg normalt funktionerne være
void, for der er ikke noget resultat der skal returneres -
medmindre man vil lave dem som bool der fortæller om det hele gik
godt.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Kim S. Pedersen (12-06-2006)
| Kommentar Fra : Kim S. Pedersen |
Dato : 12-06-06 14:50 |
|
Bertel Lund Hansen wrote:
> finn knussen skrev:
>
>> hvordan retunere jeg et array fra en funktion i en (C-fil) til en
>> anden funktion i en anden (C-fil)
>
> Du berører et potentielt problem. Hvis du opretter et array i en
> funktion, dør det når den afslutter, og en pointer dertil vil
> være udefineret.
Ja, hvis det allokeres på stakken. Men med malloc er det intet problem.
Eller også kan du allokere det "static", men om det er en god løsning
afhænger din problem/kode i øvrigt.
| |
Bertel Lund Hansen (12-06-2006)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 12-06-06 15:12 |
|
Kim S. Pedersen skrev:
> Ja, hvis det allokeres på stakken. Men med malloc er det intet problem.
Det er nemt nok at allokere og sørge for at arrayet er stabilt,
men en subrutine der snupper noget hukommelse, som skal frigives
et helt andet sted, det er en potentiel kilde til
hukommelsesspild.
Hvis rutinen imidlertid har som sit eneste/primære formål at
oprette et array, så er det jo logisk nok.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Kim S. Pedersen (13-06-2006)
| Kommentar Fra : Kim S. Pedersen |
Dato : 13-06-06 11:37 |
|
Bertel Lund Hansen wrote:
> Kim S. Pedersen skrev:
>
>> Ja, hvis det allokeres på stakken. Men med malloc er det intet problem.
>
> Det er nemt nok at allokere og sørge for at arrayet er stabilt,
> men en subrutine der snupper noget hukommelse, som skal frigives
> et helt andet sted, det er en potentiel kilde til
> hukommelsesspild.
Øhh ja, det er klart, så tak for din "indsigt".....
>
> Hvis rutinen imidlertid har som sit eneste/primære formål at
> oprette et array, så er det jo logisk nok.
>
| |
|
|