|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1551
|
[C] Benedetti puntatori !Aiuto!
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
__________________
myFlickr |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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;
int x;
caricafile(&vett, &nprod);
printf("elementi: %d\n", nprod);
for(x=0; x<nprod; ++x)
printf("%d\n", vett[x].peso);
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1551
|
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); }
__________________
myFlickr |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
Codice:
&((*vett[i]).peso));
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Dovrei farti un disegno per spiegarti il problema; l'errore lo commetti qui:
Codice:
fscanf(fp, "%d", &((*vett[i]).peso)); (*(vett[i])).peso Non è il tuo caso (vett non è un array di puntatori, ma contiene un unico elemento-puntatore!), la forma corretta è questa: Codice:
fscanf(fp, "%d", &((*vett)[i].peso));
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
PS:
ceccoggi usa [ c o d e ] codice... [ / c o d e ]
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 Ultima modifica di cipi : 26-08-2004 alle 15:42. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
Quote:
Scherzo, scherzo, bella spiegazione.. come al solito
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1551
|
Quote:
Dai, che un giorno i miei figli studieranno su "Ilsensine - La Bibbia dell'Informatica" 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
__________________
myFlickr |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:47.



















