Dsy Network www | forum | my | didattica | howto | wiki | el goog | stats | blog | dona | rappresentanti
Homepage
 Register   Calendar   Members  Faq   Search  Logout 
.dsy:it. : Powered by vBulletin version 2.3.1 .dsy:it. > Community > Tech > [C] Passaggio di array a funzione
  Last Thread   Next Thread
Author
Thread    Expand all | Contract all    Post New Thread    Post A Reply
Collapse
DarkGod
superfallito

User info:
Registered: Sep 2001
Posts: 627 (0.07 al dì)
Location: Milano
Corso: Informatica
Anno: SuperDottore
Time Online: 3 Days, 0:10:52 [...]
Status: Offline

Post actions:

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
Click Here to See the Profile for DarkGod Click Here to See the Blog of DarkGod Click here to Send DarkGod a Private Message Find more posts by DarkGod Add DarkGod to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
DeepBlue
tired guy

User info:
Registered: Sep 2003
Posts: 4258 (0.52 al dì)
Location: CSN
Corso: Info tlc
Anno:
Time Online: 52 Days, 8:40:31 [...]
Status: Offline

Post actions:

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
Click Here to See the Profile for DeepBlue Click Here to See the Blog of DeepBlue Click here to Send DeepBlue a Private Message Find more posts by DeepBlue Add DeepBlue to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
DarkGod
superfallito

User info:
Registered: Sep 2001
Posts: 627 (0.07 al dì)
Location: Milano
Corso: Informatica
Anno: SuperDottore
Time Online: 3 Days, 0:10:52 [...]
Status: Offline

Post actions:

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
Click Here to See the Profile for DarkGod Click Here to See the Blog of DarkGod Click here to Send DarkGod a Private Message Find more posts by DarkGod Add DarkGod to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
yeah
.grande:maestro.

User info:
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

Post actions:

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
Click Here to See the Profile for yeah Click here to Send yeah a Private Message Find more posts by yeah Add yeah to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
DarkGod
superfallito

User info:
Registered: Sep 2001
Posts: 627 (0.07 al dì)
Location: Milano
Corso: Informatica
Anno: SuperDottore
Time Online: 3 Days, 0:10:52 [...]
Status: Offline

Post actions:

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
Click Here to See the Profile for DarkGod Click Here to See the Blog of DarkGod Click here to Send DarkGod a Private Message Find more posts by DarkGod Add DarkGod to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
yeah
.grande:maestro.

User info:
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

Post actions:

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
Click Here to See the Profile for yeah Click here to Send yeah a Private Message Find more posts by yeah Add yeah to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
DarkGod
superfallito

User info:
Registered: Sep 2001
Posts: 627 (0.07 al dì)
Location: Milano
Corso: Informatica
Anno: SuperDottore
Time Online: 3 Days, 0:10:52 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

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 -+- _____

05-10-2005 09:57
Click Here to See the Profile for DarkGod Click Here to See the Blog of DarkGod Click here to Send DarkGod a Private Message Find more posts by DarkGod Add DarkGod to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
All times are GMT. The time now is 20:19.    Post New Thread    Post A Reply
  Last Thread   Next Thread
Show Printable Version | Email this Page | Subscribe to this Thread | Add to Bookmarks

Forum Jump:
Rate This Thread:

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
 

Powered by: 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
Pagina generata in 0.131 seconds (64.24% PHP - 35.76% MySQL) con 25 query.