Homepage  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


.dsy:it. .dsy:it. Archive > Community > Tech
 
[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

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate