 | |
Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum |
[C] Passaggio di array a funzione Clicca QUI per vedere il messaggio nel forum |
DarkGod |
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' |
DeepBlue |
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! |
DarkGod |
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. |
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 :) |
DarkGod |
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?! -__- |
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 :) |
DarkGod |
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 |
|
|
|
|