|
|
|
|
 |
|  |
 |
DarkGod |
| [C] Passaggio di array a funzione |
03-10-2005 14:32 |
|
 |
DarkGod |
superfallito

Registered: Sep 2001
Posts: 627 (0.07 al dì)
Location: Milano
Corso: Informatica
Anno: SuperDottore
Time Online: 3 Days, 0:10:52 [...]
Status: Offline
Edit | Report | IP: Logged |
[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 -+- _____
Last edited by DarkGod on 03-10-2005 at 15:04
|
|
03-10-2005 14:32 |
|
|
|  |
 |
DeepBlue |
| Re: [C] Passaggio di array a funzione |
03-10-2005 14:55 |
|
 |
DeepBlue |
tired guy

Registered: Sep 2003
Posts: 4258 (0.52 al dì)
Location: CSN
Corso: Info tlc
Anno:
Time Online: 52 Days, 8:40:31 [...]
Status: Offline
Edit | Report | IP: Logged |
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! ~
|
|
03-10-2005 14:55 |
|
|
|  |
 |
DarkGod |
| Re: Re: [C] Passaggio di array a funzione |
03-10-2005 15:07 |
|
 |
DarkGod |
superfallito

Registered: Sep 2001
Posts: 627 (0.07 al dì)
Location: Milano
Corso: Informatica
Anno: SuperDottore
Time Online: 3 Days, 0:10:52 [...]
Status: Offline
Edit | Report | IP: Logged |
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 -+- _____
|
|
03-10-2005 15:07 |
|
|
|  |
 |
yeah |
| cambia:
... |
03-10-2005 15:27 |
|
 |
yeah |
.grande:maestro.

Registered: Nov 2003
Posts: 1644 (0.20 al dì)
Location: Cologno Monzese
Corso: Informatica Magistrale
Anno: II
Time Online: 12 Days, 21:36:41 [...]
Status: Offline
Edit | Report | IP: Logged |
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 
__________________
?
Last edited by yeah on 03-10-2005 at 15:36
|
|
03-10-2005 15:27 |
|
|
|  |
 |
DarkGod |
| [QUOTE][i]Originally posted by yeah [/i]
... |
03-10-2005 16:30 |
|
 |
DarkGod |
superfallito

Registered: Sep 2001
Posts: 627 (0.07 al dì)
Location: Milano
Corso: Informatica
Anno: SuperDottore
Time Online: 3 Days, 0:10:52 [...]
Status: Offline
Edit | Report | IP: Logged |
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 -+- _____
|
|
03-10-2005 16:30 |
|
|
|  |
 |
yeah |
| La differenza tra i miei suggerimenti è nulla, po ... |
03-10-2005 20:23 |
|
 |
yeah |
.grande:maestro.

Registered: Nov 2003
Posts: 1644 (0.20 al dì)
Location: Cologno Monzese
Corso: Informatica Magistrale
Anno: II
Time Online: 12 Days, 21:36:41 [...]
Status: Offline
Edit | Report | IP: Logged |
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
__________________
?
|
|
03-10-2005 20:23 |
|
|
|  |
 |
| All times are GMT. The time now is 20:19. |
|
|
 |
|
 |
|
|
|  |
Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
|
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is ON
|
|
|
|
|
|