|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2003
Messaggi: 30
|
[C] problema con un esercizio
salve a tutti, ho un problema con un esercizio trovato online
dunque ogni riga(max 20) del file EFFEMERIDI.TXT contiene: -la data del rilevamento astronomico nel formato gg/mm/aaaa -una stringa di orari nel formato hh:mm in cui sono specificati: l'orario del crepuscolo, l'orario del sorgere e l'orario del tramonto della Luna -una stringa che rappresenta un numero che determina la fase (da 0,00 a 1,00. 1,00 luna piena) e ho due tipi di strutture: rilievo destinato a contenere i dati di una riga del file EFFEMERIDI.TXT rilievi che contiene un array di strutture di tipo rilievo e il numero di righe effettivamente lette. ora io devo creare una funzione leggi che: dato il nome di un file riempie una struttura di tipo rilievi contenente le righe lette dal file. La funzione restituisce 1 se l'operazione è andata a buon fine, altrimenti restituisce 0. dunque ho così costruito le due struct: typedef struct { int giorno, mese, anno, orec, minutic, ores, minutis, oret, minutit; float fase; }rilievo; typedef struct { rilievo r[MAX]; int num; }rilievi; i problemi insorgono sulla funzione leggi. in rete ho trovato questa soluzione: int leggi(char nomefile[],rilievi *r) { FILE* f; if((f=fopen(nomefile, "r"))==NULL){printf("Errore durante l'apertura del file %s", nomefile);return 0;} for(r->num=0;;r->num++) if(fscanf(f,"%d/%d/%d%d:%d%d:%d%d:%d%f\n", &r->r[r->num].giorno, &r->r[r->num].mese, &r->r[r->num].anno, &r->r[r->num].orec, &r->r[r->num].minutic, &r->r[r->num].ores, &r->r[r->num].minutis,&r->r[r->num].oret, &r->r[r->num].minutit, &r->r[r->num].fase)==EOF) break; fclose(f); return 1; } ma non riesco a capire il significato di tutte quelle &r->r[r->num] , cioè che cosa fanno??! la funzione dovrebbe essere corretta, nascosto però è per me il suo funzionamento. mi scuso per il lungo post, ma la questione è molto importante per me e volevo essere il più chiaro possibile. vi ringrazio anticipatamente |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Non ho letto tutto il tipo, ati spiego il senso di &r->r[r->num] :
la funzione fscanf legge dei dati da un file e li memorizza in delle variabili. Per memorizzare un dato in una variabile bisona passare il puntatore alla variabile, che si ottiene tramite l'operatore &. Quindi con &r->r[r->num] si passa l'indirizzo di r -> r[r -> num] In r->r[r->num] r -> r indica il campo r della variabile r passata come argomento (una scelta infelice del nome, fa si che il paramntro della funzione e il campo della struttra hanno lo setsso nome..ma in r->r le due r sono cose diverse, la prima r indica la variabile passata alla funzione, la seconda r indica il campo r di quella variabile che è un puntatore a rilievi).
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#3 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
- cerca di aprire il file in lettura e restituisci "falso" se non ci riesci; - leggi piu' stringhe che puoi nel formato dato, immagazzinando i valori letti nel vettore r; - chiudi il file e restituisci "vero". Passiamo alla fscanf: come sai, essa ha come argomenti un puntatore a file, una stringa di formato, e una sequenza di puntatori. Qui la stringa di formato e': Codice:
"%d/%d/%d%d:%d%d:%d%d:%d%f\n" I campi con la & hanno tutti la forma: Codice:
&r->r[r->num].x Codice:
&(r->(r[r->num].x)) Per ora dovrebbe bastare. Dai anche un'occhiata alla guida in linea del tuo compilatore (o alle man page di Linux) e tieni sotto mano un buon manuale di linguaggio C, ad esempio il K&R.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 14-09-2004 alle 17:54. |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2003
Messaggi: 30
|
vi ringrazio entrambi siete stati chiarissimi
penso proprio di avere capito! thanx |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:50.



















