PDA

View Full Version : [C] Benedetti puntatori !Aiuto!


ceccoggi
26-08-2004, 13:43
Apro questo 3d perchè è da troppo tempo che mi porto avanti il problema che sto per esporvi.
Nei classici esercizi o temi d'esame che svolgo all'uni, mi trovo sempre davanti a uno o + file di testo da aprire, e da inserire in un'opportuna struttura dati. Nel caso d'esempio che vi porto
ho nella prima riga il numero di elementi che devo inserire nella mia struttura (quindi sapendo il numero di elementi mi creo sempre un vettore con la funz "calloc"), e in seguito, in ciascuna riga, i dati riferiti a ciascun elemento. Sempre nel mio esempio, i dati riferiti a ciascun elemento sono un ipotetico peso in quintali di colli da trasportare.
Ora io mi sono creato la classica funzione caricafile() nella quale gli passo il vettore sul quale inserire i miei elementi e un intero nprod - per riferimento - nel quale memorizzare la lunghezza di questo vettore. Il problema è che ancora non ho capito bene come passare sto vettore alla funzione, infatti all'interno della funzione lo carico x bene di tutti i suoi elementi,ma quando torno nel main, il suo contenuto è sputtanato, quindi sicuramente l'ho passato male. Il problema è che ho provato a passarlo in diversi modi, ma il risultato è sempre stato lo stesso...
Vi mando il codice che ho scritto, e visto che sarà sicuramente una cavolata per molti di voi, chiaritemi il mio problema una volta x tutte!

codice:

#include <stdio.h>
#include <stdlib.h>

typedef struct{
int peso;
int preso;
int cam;}carro;

void caricafile(carro *vett, int *nprod){
FILE *fp;
int i;
char nomefile[20];

printf("Inserisci il nome del file da aprire: ");
scanf("%s", nomefile);
if( (fp=fopen(nomefile, "r")) !=NULL){
fscanf(fp, "%d", nprod);
vett =(carro *)calloc((*nprod), sizeof(carro ));
for(i=0;i<(*nprod);i++)
fscanf(fp, "%d", &(vett[i].peso));
}
}

void main(){
carro *vett;
int nprod = 0;

caricafile(vett, &nprod);}

file di esempio:
6
20
70
80
50
90
30


Grazie mille

ilsensine
26-08-2004, 14:53
#include <stdio.h>
#include <stdlib.h>

typedef struct{
int peso;
int preso;
int cam;}carro;

void caricafile(carro **vett, int *nprod){
FILE *fp;
int i;
char nomefile[20];

printf("Inserisci il nome del file da aprire: ");
scanf("%s", nomefile);
if( (fp=fopen(nomefile, "r")) !=NULL){
fscanf(fp, "%d", nprod);
*vett =(carro *)calloc((*nprod), sizeof(carro ));
for(i=0;i<(*nprod);i++)
fscanf(fp, "%d", &((*vett)[i].peso));
}
}

void main(){
carro *vett;
int nprod;
int x;
caricafile(&vett, &nprod);
printf("elementi: %d\n", nprod);
for(x=0; x<nprod; ++x)
printf("%d\n", vett[x].peso);
}

ceccoggi
26-08-2004, 15:13
Ciao, grazie 1k x la risposta, cmq mi sono trovato un mio prog chiamato "prog non funzionante" nel quale avevo fatto la prova di passare il vettore come dici tu. Ti mando il listato, il quale sembra identico al tuo, ma testandolo non funzia (ho testato il mio, non il tuo). Se riesci a capire cos'è che non va te ne sarei davvero grato!

#include <stdio.h>
#include <stdlib.h>

typedef struct{
int peso;
int preso;
int cam;}carro;

void caricafile(carro **vett, int *nprod){
FILE *fp;
int i;
char nomefile[20];

printf("Inserisci il nome del file da aprire: ");
scanf("%s", nomefile);
if( (fp=fopen(nomefile, "r")) !=NULL){
fscanf(fp, "%d", nprod);
(*vett) =(carro *)calloc((*nprod), sizeof(carro ));
for(i=0;i<(*nprod);i++)
fscanf(fp, "%d", &((*vett[i]).peso));
}
}

void main()
{
carro *vett;
int nprod = 0;

caricafile(&vett, &nprod);
}

cipi
26-08-2004, 15:27
&((*vett[i]).peso));


:O ;)

ilsensine
26-08-2004, 15:28
Dovrei farti un disegno per spiegarti il problema; l'errore lo commetti qui:

fscanf(fp, "%d", &((*vett[i]).peso));

ovvero indicizzi un array di puntatori, quindi dereferenzi il puntatore ottenuto. E' più evidente se lo scrivi così:
(*(vett[i])).peso
Non è il tuo caso (vett non è un array di puntatori, ma contiene un unico elemento-puntatore!), la forma corretta è questa:

fscanf(fp, "%d", &((*vett)[i].peso));

ovvero dereferenzi il puntatore al puntatore del primo elemento del vettore, quindi indicizzi l'i-simo elemento del vettore.

cipi
26-08-2004, 15:29
PS:
ceccoggi usa [ c o d e ] codice... [ / c o d e ]

cipi
26-08-2004, 15:32
Originariamente inviato da ilsensine
ovvero dereferenzi il puntatore al puntatore del primo elemento del vettore, quindi indicizzi l'i-simo elemento del vettore.
Ma come cacchio parli? :confused: :confused: :D :D
Scherzo, scherzo, bella spiegazione.. come al solito :ave:

ceccoggi
26-08-2004, 16:32
Originariamente inviato da cipi
Ma come cacchio parli? :confused: :confused: :D :D
Scherzo, scherzo, bella spiegazione.. come al solito :ave:

si, in effetti ho avuto un po' di difficoltà pure io.... :confused: :p
Dai, che un giorno i miei figli studieranno su "Ilsensine - La Bibbia dell'Informatica":D

Cmq ora ho capito benissimo, grazie mille a entrambi x l'aiuto... in realtà qualche altro dubbietto sui puntatori ce l'avrei, ma ora vado un po' di fretta, al max mi faccio sentire via pvt.

Grazie di nuovo;)