|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2003
Città: verona
Messaggi: 541
|
[C] - problema double pointer a file
ciao a tutti, sto cercando di far funzionare questo programmino (non l'ho scritto io è di un amico
Codice PHP:
la funzione openCommChannels è definita così: Codice PHP:
se lo eseguo l'output del programma è: 76c0db07 pre controllo su ifpp pointer pre 76c0db07 e poi il tutto crasha...quindi il problema dovrebbe essere qui *ifpp = x; e non capisco perchè! avete suggerimenti?
__________________
CASE: Cooler Master Stacker 831 Silver MOBO: Asus Maximus Formula CPU: Intel Q6600@2,4ghz RAM: 2x 1GB Corsair XMS2 pc2-8500@1066mhz + 2x2GB Corsair XMS2 pc2-8500@1066mhzVGA: ATI Sapphire RADEON 5830 1GB GDDR5 HD: 2 x WD Caviar SE16 500GB Raid 0 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Sì, il problema è proprio lì, perché ifpp non punta a nulla, o meglio punta ad un'area di memoria che non hai allocato. Lo stesso vale per ofpp.
Per risolvere dove dichiari in e out dovresti allocare il puntatore: Codice:
FILE ** in=(FILE**)malloc(sizeof(FILE*)); FILE ** out=(FILE**)malloc(sizeof(FILE*)); Tra l'altro non ho guardato proprio bene ma mi sembra che un semplice puntatore fosse sufficiente (invece di un doppio puntatore) in questo caso potresti fare: Codice:
FILE * in; FILE * out; Codice:
openCommChannels(filein , fileout , &in , &out); |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2003
Città: verona
Messaggi: 541
|
grazziiiiieeeeee
__________________
CASE: Cooler Master Stacker 831 Silver MOBO: Asus Maximus Formula CPU: Intel Q6600@2,4ghz RAM: 2x 1GB Corsair XMS2 pc2-8500@1066mhz + 2x2GB Corsair XMS2 pc2-8500@1066mhzVGA: ATI Sapphire RADEON 5830 1GB GDDR5 HD: 2 x WD Caviar SE16 500GB Raid 0 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Aug 2003
Città: verona
Messaggi: 541
|
mmm solo una domanda...ma perchè se utilizzo il doppio puntatore devo allocare la memoria prima mentre con il puntatore singolo no?
__________________
CASE: Cooler Master Stacker 831 Silver MOBO: Asus Maximus Formula CPU: Intel Q6600@2,4ghz RAM: 2x 1GB Corsair XMS2 pc2-8500@1066mhz + 2x2GB Corsair XMS2 pc2-8500@1066mhzVGA: ATI Sapphire RADEON 5830 1GB GDDR5 HD: 2 x WD Caviar SE16 500GB Raid 0 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Dunque, non è facilissimo da spiegare (non per me almeno):
Il doppio puntatore può contenere l'indirizzo in memoria di un puntatore singolo. Il puntatore singolo invece può contenere un indirizzo di memoria in cui si trova un valore. Quindi se ho **p 1) p può contenere l'indirizzo di un'area di memoria contenente un puntatore singolo 2) *p è il valore del puntatore singolo puntato da p 3) **p è il valore puntato dal puntatore singolo puntato da p Quando dichiari FILE **p stai allocando lo spazio solo per il doppio puntatore che quindi non contiene ancora l'indirizzo di un puntatore e quindi non puoi usare 2) e 3) Se allochi lo spazio per un puntatore e metti il risultato (la malloc restituisce un indirizzo) in p potrai usare 2). A questo punto non puoi ancora usare 3) ma in openCommChannels la fopen restituisce un puntatore a FILE (quindi un indirizzo) e lo mette in *p Codice:
*ifpp = x; 1) p può contenere un indirizzo di memoria in cui si trova un valore. 2) *p è il valore puntato da p Quando dichiari FILE *p allochi lo spazio per il singolo puntatore e quindi puoi usare 1) ma questo non contiene ancora un indirizzo di memoria valido. L'indirizzo che ti serve ti viene restituito dalla fopen e a quel punto potrai usare anche 2) |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Per rispondere alla tua domanda: con il puntatore singolo la memoria viene allocata dalla funzione fopen, ma con il puntatore doppio chi la inizializza? Prova a pensare (o a debuggare che forse ti spiegherebbe tante cose): a cosa punta nel main FILE ** in; ? Ad un area di memoria passatemi il termine "sbagliata" o meglio non inizializzata (** è un puntatore a un puntatore). Quando provi ad assegnarne il valore del "puntatore puntato" all'interno di openCommChannels stai cercando di modificare un puntatore non valido (*ifpp rappresenta appunto questo puntatore non inizializzato), ovvero stai cercando di modificare un'area di memoria che non puoi modificare. La soluzione che ti è stata suggerita era corretta infatti a te nel main serve un FILE* che deve essere modificato all'interno di openCommChannels, qui è corretto l'uso di FILE** in quanto te devi modificare il valore della variabile in contenuta nel main e in C per fare questo serve appunto un puntatore a puntatore. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:38.




















