Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    struct e funzioni, linguaggio c

    salve, ho un problema con un programma.. in poche parole ho creato una funzione sfruttando anche il tipo struct.. però penso che abbia qualche problema con i puntatori.. perchè all'interno della funzione è tutto ok, ma i valori che dovrebbero acquisire le variabili, quando passo al main, vengono persi...

    codice:
    void lettura_voti(record dati, stringa s1, stringa s2, int*n){ 
    register int i; int m; 
    FILE*f; FILE*r; FILE*t; 
    
    printf("\nInserire il nome del file in cui sono contenuti i voti dei giocatori(specificareanche il suo indirizzo se il file non e' collocato nella stessa cartella \ndell'exe): "); scanf("%s",s1); 
    
    f=fopen(s1,"r"); 
    if (f==NULL) {
     printf ("\nSi e' verificato un errore . . .\nFile inesistente, procedere con l'inserimento dei voti manuale . . .\n"); 
                      lettura_alternativa(dati,n); } 
    else{ 
    fscanf(f,"%d",n); for(i=0;i<*n;i++) fscanf(f,"%f",&dati.gio[i]); 
                     } 
    
    printf("\nInserire il nome del file in cui e' contenuto l'elenco dei nomi della formazioneschierata(specificare anche il suo indirizzo se il file non e' collocato nella \nstessa cartella dell'exe): "); 
    
    scanf("%s",s2); 
    
    r=fopen(s2,"r");
     
    if (r==NULL) { 
      printf ("\nSi e' verificato un errore . . .\nFile inesistente, i nomi dei giocatori non saranno mostrati . . .\n"); 
    t=fopen("file_errore.txt","r"); 
    fscanf(t,"%d",&m);
    for(i=0;i<m;i++) fscanf(t,"%s",dati.mia_rosa[i]); } 
    
    else { 
    fscanf(r,"%d",&m); 
    for(i=0;i<m;i++) 
    fscanf(r,"%s",dati.mia_rosa[i]); } }
    questa postata è la funzione che mi legge da file i valori che mi servono.. però quando nel main richiamo un'altra funzione che si occupa della stampa, i valori sono sballati..
    penso che centrano i puntatori perchè se provo a fare un printf dei valori appena acquisiti nella funzione suscritta, i valori stampati sono esatti...

    help me, please!!

    edit: ho dimenticato di scrivere il preambolo, che altrimenti non si capisce una mazza
    codice:
    #define M 12 
    #define G 50 
    
    typedef float voti[M]; 
    typedef char giocatore[G]; 
    typedef giocatore formazione[M]; 
    typedef char stringa[G]; 
    typedef struct { voti gio; formazione mia_rosa; } record;

  2. #2
    comunque ho capito l'errore... non posso utilizzare una funzione void, ma una funzione che ritorna un valore struct..... ma se volessi utilizzare il void e i puntatori per lo struct.. come dovrei procedere???

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ti basta passare alla funzione l'indirizzo della struttura in questione e modificare quindi il parametro relativo dichiarandolo e utilizzandolo come puntatore a struttura (quindi ad esempio accedendo ai suoi campi con ->), conservando void come valore di ritorno. Tra l'altro passare per valore direttamente una struttura e non il suo indirizzo e in ogni caso da evitare, anche se non vanno fatte modifiche: un conto è copiare i 4 o 8 byte dell'indirizzo, un altro è copiare gli N byte della struttura con N che può essere maggiore di 4 o 8 anche di qualche ordine di grandezza. Stessa cosa per il return di una struttura.
    every day above ground is a good one

  4. #4
    penso di aver capito... quindi la sintassi per accedere ad un campo con puntatore è -> ??

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da seby.91
    penso di aver capito... quindi la sintassi per accedere ad un campo con puntatore è -> ??
    Sì. Ad occhio e croce la tua funzione diventa:

    codice:
    void lettura_voti(record *dati, stringa s1, stringa s2, int*n){ 
    register int i; int m; 
    FILE*f; FILE*r; FILE*t; 
    
    printf("\nInserire il nome del file in cui sono contenuti i voti dei giocatori(specificareanche il suo indirizzo se il file non e' collocato nella stessa cartella \ndell'exe): "); scanf("%s",s1); 
    
    f=fopen(s1,"r"); 
    if (f==NULL) {
     printf ("\nSi e' verificato un errore . . .\nFile inesistente, procedere con l'inserimento dei voti manuale . . .\n"); 
                      lettura_alternativa(dati,n); } 
    else{ 
    fscanf(f,"%d",n); for(i=0;i<*n;i++) fscanf(f,"%f",&dati->gio[i]); 
                     } 
    
    printf("\nInserire il nome del file in cui e' contenuto l'elenco dei nomi della formazioneschierata(specificare anche il suo indirizzo se il file non e' collocato nella \nstessa cartella dell'exe): "); 
    
    scanf("%s",s2); 
    
    r=fopen(s2,"r");
     
    if (r==NULL) { 
      printf ("\nSi e' verificato un errore . . .\nFile inesistente, i nomi dei giocatori non saranno mostrati . . .\n"); 
    t=fopen("file_errore.txt","r"); 
    fscanf(t,"%d",&m);
    for(i=0;i<m;i++) fscanf(t,"%s",dati->mia_rosa[i]); } 
    
    else { 
    fscanf(r,"%d",&m); 
    for(i=0;i<m;i++) 
    fscanf(r,"%s",dati->mia_rosa[i]); } }
    Dovrai però modificare anche la funzione "lettura_alternativa" allo stesso modo, dato che ora l'argomento "dati" che le passi è un puntatore.
    every day above ground is a good one

  6. #6
    ho capito grazie mille compaesà(anche io sono di napoli! ), sei stato di grande aiuto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.