.dsy:it.
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Tech (http://www.dsy.it/forum/forumdisplay.php?forumid=189)
-- [C] Passaggio di array a funzione (http://www.dsy.it/forum/showthread.php?threadid=21702)


Posted by DarkGod on 03-10-2005 14:32:

[C] Passaggio di array a funzione

Ciao, devo passare un array di puntatori ad una funzione (in C), ma mi sto incasinando... O_o

Ho un array di puntatori a file dichiarato nel seguente modo:

code:
FILE *array[5];

all'interno del main.

Devo creare una funzione che chiuda tutti i file aperti, i cui riferimenti sono nall'array che ho dichiarato.
Volevo quindi passare alla funzione il puntatore al primo file, in modo poi da poter ricavare di conseguenza i puntatori successivi.
Ho dichiarato la funzione nel seguente modo:

code:
void chiudi(FILE *array);

E (all'interno del main) la richiamo così:

code:
chiudi(array);

Quando compilo però mi da un warning: "passing arg 1 of 'chiudi' from incompatibile pointer type".
Ma "array" scritto da solo non dovrebbe essere il puntatore al primo elemento dell'array?
In cosa sto sbagliando?? O__o'

__________________
Chiamatemi Darky ^_^

_____ -+- ANTINOMY -+- __________ -+- Inside Human Cruelty -+- _____


Posted by DeepBlue on 03-10-2005 14:55:

Re: [C] Passaggio di array a funzione

Originally posted by DarkGod
Quando compilo però mi da un warning: "passing arg 1 of 'chiudi' from incompatibile pointer type".
Ma "array" scritto da solo non dovrebbe essere il puntatore al primo elemento dell'array?
In cosa sto sbagliando?? O__o'

Esatto, dovrebbe. Però ti ha dato solo un warning, cosa che con i puntatori non è così infrequente. (poi se c'è un errore, ora come ora non te lo so dire).

Oltre al quel warning c'è altro? se lo fai girare, funziona?

EDIT: sicuro che la funzione "chiudi" sia corretta? Nel prototipo hai scritto una cosa, nella chiamata un'altra!

__________________
~ get Debian! ~ get FreeBSD! ~ get OpenBSD! ~


Posted by DarkGod on 03-10-2005 15:07:

Re: Re: [C] Passaggio di array a funzione

Originally posted by DeepBlue
Esatto, dovrebbe. Però ti ha dato solo un warning, cosa che con i puntatori non è così infrequente. (poi se c'è un errore, ora come ora non te lo so dire).

Oltre al quel warning c'è altro? se lo fai girare, funziona?

EDIT: sicuro che la funzione "chiudi" sia corretta? Nel prototipo hai scritto una cosa, nella chiamata un'altra!



Ops, avevo sbagliato scrivere (ma solo qui, non sul mio codice). Ora ho corretto.

Il codice cmq funziona, ma siccome quella funzione serve solo per chiudere i file, non so se effettivamente li chiuda oppure no, dato che chiaramente anche se esco dal programma senza aver chiudo i file non viene generato alcun errore.

__________________
Chiamatemi Darky ^_^

_____ -+- ANTINOMY -+- __________ -+- Inside Human Cruelty -+- _____


Posted by yeah on 03-10-2005 15:27:

cambia:
void chiudi(FILE *array);

in

void chiudi(FILE *array[]);

o

void chiudi(FILE **array);


Se non lo hai già fatto compila (suppongo gcc :)) con -Wall

[edit] Ti consiglio la prima :)

__________________
?


Posted by DarkGod on 03-10-2005 16:30:

Originally posted by yeah
cambia:
void chiudi(FILE *array);

in

void chiudi(FILE *array[]);

o

void chiudi(FILE **array);


Se non lo hai già fatto compila (suppongo gcc :)) con -Wall

[edit] Ti consiglio la prima :)



Ok, grazie :)
Così compila senza warning... ma non capisco perchè. In questo modo dichiaro (come parametro della funzione) un array di puntatori (o un puntatore e a puntatore nel secondo caso), ma poi quando la richiamo gli passo solo un puntatore ad un file.... non dovrebbe essere sbagliato? O mi sto confondendo io?! -__-

__________________
Chiamatemi Darky ^_^

_____ -+- ANTINOMY -+- __________ -+- Inside Human Cruelty -+- _____


Posted by yeah on 03-10-2005 20:23:

La differenza tra i miei suggerimenti è nulla, poichè quando richiamerai quella funzione gli passerai l'indirizzo di un vettore di puntatori, che è appunto un puntatore ad un puntatore :)

Le hai provate tutte e due? Perchè la seconda non l'ho mai usata (sono i due modi di dichiarare il secondo argomento del main).

Credo la differenza possa essere nell'intenzione dichiarata: se è un array di puntatori il compilatore può aspettarsi che la variabile venga usata come vettore (quindi cose tipo *(ptr + i)) mentre un puntatore a puntatore dovrebbe essere usato solo direttamente.

Questa è però una differenza che il compilatore potrebbe fare, ma che non ho mai riscontrato, dal lato funzionale non cambia nulla.


Tornando a quanto avevi scritto tu, la differenza è che il tuo prototipo si aspettava un puntatore a file, mentre gli passavi un puntatore ad un puntatore a file.

Per eliminare il warning avresti dovuto chiamare la funzione così

code:
chiudi(array[0]);

che è diverso da
code:
chiudi(&array[0]);

mentre quest'ultimo è uguale a
code:
chiudi(array);


Spero di aver dipanato almeno un pò i tuoi dubbi :)

__________________
?


Posted by DarkGod on 05-10-2005 09:57:

Originally posted by yeah
La differenza tra i miei suggerimenti è nulla, poichè quando richiamerai quella funzione gli passerai l'indirizzo di un vettore di puntatori, che è appunto un puntatore ad un puntatore :)

Le hai provate tutte e due? Perchè la seconda non l'ho mai usata (sono i due modi di dichiarare il secondo argomento del main).

Credo la differenza possa essere nell'intenzione dichiarata: se è un array di puntatori il compilatore può aspettarsi che la variabile venga usata come vettore (quindi cose tipo *(ptr + i)) mentre un puntatore a puntatore dovrebbe essere usato solo direttamente.

Questa è però una differenza che il compilatore potrebbe fare, ma che non ho mai riscontrato, dal lato funzionale non cambia nulla.


Tornando a quanto avevi scritto tu, la differenza è che il tuo prototipo si aspettava un puntatore a file, mentre gli passavi un puntatore ad un puntatore a file.

Per eliminare il warning avresti dovuto chiamare la funzione così
code:
chiudi(array[0]);

che è diverso da
code:
chiudi(&array[0]);

mentre quest'ultimo è uguale a
code:
chiudi(array);


Spero di aver dipanato almeno un pò i tuoi dubbi :)



Grazie mille, mi hai ri-chiarito le idee ;)
Quando ci si incasina coi puntatori è finita, eheh :P

__________________
Chiamatemi Darky ^_^

_____ -+- ANTINOMY -+- __________ -+- Inside Human Cruelty -+- _____


All times are GMT. The time now is 04:52.
Show all 7 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.