+ Rispondi
Pagina 1 di 3 1 2 3 UltimaUltima
Risultati da 1 a 10 su 25
  1. #1

    Iscritto dal
    04/11/2011
    Località
    Svizzera-Ticino
    Messaggi
    1,872

    Gestione strutture con il C

    Buonasera a tutti,
    Avrei qualche problemino nella stesura di un programma in C, spero che voi possiate aiutarmi

    Ho le seguenti strutture:

    codice:
     
        typedef struct anagrafico{
          int    matricola;
          char   cognome[20];
          char   nome[20];
          char   indirizzo[30];
          char   telefono[20];
        }Anagrafico; 
    
       typedef struct votiDisc {
         float  inf[10] ;
         float  mec[10]; 
         float  elet[10] ;
       }VotiDisc; 
    
       typedef struct studDisc{
          int     matricola;
          VotiDisc  disciplina; 
        }StudDisc;
    E queste due funzioni:

    codice:
     
    void aggVoti(void); 
    void modificaNota(StudDisc *votiAllieviPtr);

    Come vede, ho una struttura "annidiata" in un altra struttura.

    Ora, dalla funzione aggVoti passo alla funzione modificaNota l'indirizzo di una struttura di tipo StudDisc che voglio modificare.
    Il mio dubbio è come modificare i campi della struttura VotiDisc contenuti nella struttura StudDisc dalla funzione modificaNota.

    Io avevo pensato a questo:

    codice:
      if(verifica1==0) votiAllieviPtr->disciplina->inf[NrEspe-1] = Nota;
      if(verifica2==0) votiAllieviPtr->disciplina->mec[NrEspe-1]= Nota; 
      if(verifica3==0) votiAllieviPtr->disciplina->elet[NrEspe-1] = Nota;
    Nota è una variabile di tipo float che acquisisco da tastiera, NrEspe è una variabile di tipo INT che acquisisco da tastiera.
    In questo modo il compilatore mi da errore, allora ho provato cosi:
    codice:
      if(verifica1==0) votiAllieviPtr->disciplina.inf[NrEspe-1] = Nota; 
      if(verifica2==0) votiAllieviPtr->disciplina.mec[NrEspe-1]= Nota;
      if(verifica3==0) votiAllieviPtr->disciplina.elet[NrEspe-1] = Nota;
    In questo modo il compilatore non mi restituisce errore, ma il programma non mi salva i valori dove dovrebbe. Il mio dubbio è:
    sono le suddette righe di codice sbagliate oppure devo cercare il problema altrove?

    Grazie mille a tutti

  2. #2
    {abstract}
    Iscritto dal
    05/09/2011
    Località
    altrove.
    Messaggi
    4,110
    fatto al volo in c++ ...

    codice:
    #include <iostream>
    using namespace std;
    
    struct anagrafico{
          int    matricola;
          char   cognome[20];
          char   nome[20];
          char   indirizzo[30];
          char   telefono[20];
    }; 
    
    struct votiDisc {
         float  inf[10] ;
         float  mec[10]; 
         float  elet[10] ;
    }; 
    
    struct studDisc{
          int     matricola;
          votiDisc  disciplina; 
    };
    
    void modificaNota(studDisc *votiAllieviPtr){
    votiAllieviPtr->matricola=12345;
    votiAllieviPtr->disciplina.inf[0]=1;
    votiAllieviPtr->disciplina.mec[0]=2;
    votiAllieviPtr->disciplina.elet[0]=3;
    };
    
    int main(){
    
    anagrafico a;
    votiDisc vd;
    studDisc sd;
    
    studDisc *pSD=&sd;
    modificaNota(pSD);
    
    cout<<pSD->matricola<<endl;
    cout<<pSD->disciplina.inf[0]<<" "<<pSD->disciplina.mec[0]<<" "<<pSD->disciplina.elet[0];
    
    cout<<endl<<sd.matricola<<endl;
    cout<<sd.disciplina.inf[0]<<" "<<sd.disciplina.mec[0]<<" "<<sd.disciplina.elet[0];
    
    }

    edit:
    il codice qui sopra fa quello che ho scritto e che tu vorresti ...
    da quanto hai scritto sopra, non riesco ad aiutarti di più ...
    se vuoi postare del codice più completo ...

    Ultima modifica: 29-05-2013 alle 21:30, di Urizen
    ...

  3. #3

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,858
    Spoiler: Codice

    codice:
    #include "stdio.h"
    #define MAX_ELENCO 10
    #define MAX_STR 20
    #define N_VOTI 10
     typedef struct anagrafico{
          int    matricola;
          char   cognome[MAX_STR];
          char   nome[MAX_STR];
          char   indirizzo[MAX_STR];
          char   telefono[MAX_STR];
        }Anagrafico; 
    
       typedef struct votiDisc {
         float  inf[N_VOTI] ;
         float  mec[N_VOTI]; 
         float  elet[N_VOTI] ;
       }VotiDisc; 
    
       typedef struct studDisc{
          int     matricola;
          VotiDisc  disciplina; 
        }StudDisc;
    
       void aggVoti(void); 
       void fillMatricole(void);
       void modificaNota(StudDisc *votiAllieviPtr);
    
       Anagrafico matricole[MAX_ELENCO];
       StudDisc elenco[MAX_ELENCO];
       //unsigned int punt = 0;
    int _tmain(int argc, _TCHAR* argv[])
    {
        fillMatricole();
        aggVoti();
        return 0;
    }
     void aggVoti(void)
     {
         int i=0;
         for(i = 0; i < MAX_ELENCO; i++)
         {
            printf("\Assegno il voto della Matricola [%d], Cognome [%s] , Nome [%s]",matricole[i].matricola,matricole[i].cognome,matricole[i].nome);
            elenco[i].matricola = matricole[i].matricola; //assegno la matricola al record voti
            modificaNota(&elenco[i]);
            printf("\nI voti assegnati sono:\nInformatica : [%f]\nElettronica : [%f]\nMeccanica : [%f]",elenco[i].disciplina.inf[0],elenco[i].disciplina.elet[0],elenco[i].disciplina.mec[0]);
         }
     }
    
     void fillMatricole(void)
     {
         int i;
         for(i = 0; i < MAX_ELENCO; i++)
         {
             matricole[i].matricola = i +1;
             sprintf(matricole[i].cognome,"Cognome_%d",i+1);
             sprintf(matricole[i].nome,"Nome_%d",i+1);
             sprintf(matricole[i].indirizzo,"Indirizzo_%d",i+1);
             sprintf(matricole[i].telefono,"Telefono_%d",i+1);
             
         }
     }
    
    
    
      void modificaNota(StudDisc *votiAllieviPtr)
      {
          votiAllieviPtr->disciplina.elet[0] = 8;
          votiAllieviPtr->disciplina.inf[0] = 7;
          votiAllieviPtr->disciplina.mec[0] = 6;
      }



    Una cosa di questo tipo?
    edit: pressochè identica alla soluzione di Urizen (visto dopo la riposta) ma io ho usato C puro, tiè

    l'errore che tu dici, se non posti il sorgente per intero non saprei indicarti dove stà.
    Anche se ad occhio fai un pò di cose concettualmente errate.
    Tanto mi sembra sia un compito, esercitazione a livello superiori o no? (spero )
    Ultima modifica: 30-05-2013 alle 09:24, di xam8re

  4. #4

    Iscritto dal
    04/11/2011
    Località
    Svizzera-Ticino
    Messaggi
    1,872
    È una serie di esercizi di preparazione per l'esperimento
    Il sorgente è lunghetto, attualmente sono 400 righe di codice....

    Comunque non voglio la pappa pronta, voglio solo capire se come accedo al campo della struttura dalla funzione è giusto
    Alcune domande:

    1)Se voglio modificare e leggere un file ad accesso causale gia creato come devo aprirlo? rb+?
    2)Sono giuste le seguenti righe di codice?

    codice:
    modificaNota(&tempS);    
    fseek(file1Ptr,i*sizeof(StudDisc),SEEK_SET);
    fwrite(&tempS, sizeof(StudDisc),1, file1Ptr);
    Prima di questa parte di codice devo cercare la struttura da modificare in base a una certa chiave, quindi leggo in questo modo
    fread(&tempS, sizeof(StudDisc),1, file1Ptr);
    se non trovo la chiave incremento la variabile i di 1, la variabile I mi rappresenta la mia posizione quindi, se invece la trovo I non varia ed entro in un if con le istruzioni sopracitate.
    La funzione modificaNota mi modifica la variabile tempS di tipo struttura, ora devo scrivere questa variabile in un file ad accesso casuale.
    Mi devo posizionare nel record dove voglio scrivere la mia struttura, cioè dove ho letto la struttura precedentemente.

    Spero di essere chiaro
    Ultima modifica: 30-05-2013 alle 10:05, di Bambinz

  5. #5

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,858
    Quote Originariamente inviato da Bambinz Visualizza il messaggio
    È una serie di esercizi di preparazione per l'esperimento
    Il sorgente è lunghetto, attualmente sono 400 righe di codice....

    Comunque non voglio la pappa pronta, voglio solo capire se come accedo al campo della struttura dalla funzione è giusto

    Se voglio modificare e leggere un file ad accesso causale gia creato come devo aprirlo? rb+?
    Chiedevo il sorgente perchè, per come hai scritto, hai scritto giusto.
    la sintassi
    codice:
     votiAllieviPtr->disciplina->inf[NrEspe-1] = Nota;
    è corretta.
    Se hai errori il problema è altrove ma, l'unico modo per aiutarti è vedere il resto del codice.

    Si rb+ va benissimo

  6. #6

    Iscritto dal
    04/11/2011
    Località
    Svizzera-Ticino
    Messaggi
    1,872
    Sono riuscito a isolare l'errore a una porzione di codice più piccola:

    codice:
    void aggVoti(void)
    {
       FILE *filePtr; 
       FILE *file1Ptr; 
      
       char nomeFileAna[20];
       char nomeFileVot[20];
       int key;
       int i;
          
       Anagrafico tempA = {0, "", "", "", ""};
       VotiDisc tempV = { {},{},{} };  
       StudDisc tempS = {0, tempV};
     
       printf("Introdurre il nome del file Voti che si vuole leggere\n");
       scanf("%s", nomeFileVot);
       
        if (( file1Ptr = fopen(nomeFileVot, "rb+") ) == NULL)
            printf("Il file non può essere aperto.\n" );
        else
        {
              printf("\n\nInserire la matricola da modificare, EOF to exit\n");
              scanf("%d", &key);
              i=0;
              
              while(!feof(stdin))
              { 
                fread(&tempS, sizeof(StudDisc),1, file1Ptr);
                if(tempS.matricola==key)
                  {
                    modificaNota(&tempS);
                    //printf("Informatica:\n%1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f\n", tempS.disciplina.inf[0],tempS.disciplina.inf[1],tempS.disciplina.inf[2],tempS.disciplina.inf[3],tempS.disciplina.inf[4],tempS.disciplina.inf[5],tempS.disciplina.inf[6],tempS.disciplina.inf[7],tempS.disciplina.inf[8],tempS.disciplina.inf[9]);
                    //printf("Meccanica:\n%1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f\n", tempS.disciplina.mec[0],tempS.disciplina.mec[1],tempS.disciplina.mec[2],tempS.disciplina.mec[3],tempS.disciplina.mec[4],tempS.disciplina.mec[5],tempS.disciplina.mec[6],tempS.disciplina.mec[7],tempS.disciplina.mec[8],tempS.disciplina.mec[9]);
                    //printf("Elettronica:\%1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f\n", tempS.disciplina.elet[0],tempS.disciplina.elet[1],tempS.disciplina.elet[2],tempS.disciplina.elet[3],tempS.disciplina.elet[4],tempS.disciplina.elet[5],tempS.disciplina.elet[6],tempS.disciplina.elet[7],tempS.disciplina.elet[8],tempS.disciplina.elet[9]);
                    //aTasto();
                    
                    fseek(file1Ptr,i*sizeof(StudDisc),SEEK_SET);
                    fwrite(&tempS, sizeof(StudDisc),1, file1Ptr);
                        
                    printf("\n\nInserire la matricola da modificare, EOF to exit\n");
                    scanf("%d", &key);
                    rewind(file1Ptr);
                    
                    i=0;
                  }
                else
                 i++;
                 
                if(feof(file1Ptr))
                  {
                    printf("Matricola non trovata, inserire nuova matricola, EOF to exit");
                    scanf("%d", &key);
                    rewind(file1Ptr);
                    i=0;
                  } 
              }
              
              fclose(file1Ptr);
        }
    }
    la funzione modificaNota(&tempS); fa quello che deve fare, ho verificato questo con i printf che adesso ho commentato. Il problema sta nel salvataggio del record sul file

  7. #7

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,858
    Quote Originariamente inviato da Bambinz Visualizza il messaggio
    Sono riuscito a isolare l'errore a una porzione di codice più piccola:

    [ ****]
    la funzione modificaNota(&tempS); fa quello che deve fare, ho verificato questo con i printf che adesso ho commentato. Il problema sta nel salvataggio del record sul file

    definisci problema Non salva, salva in posizioni sbagliate? Riesci a darmi un binario popolato? Non posso generarlo io a caso, altrimenti l'aiuto sarebbe vano.

  8. #8

    Iscritto dal
    04/11/2011
    Località
    Svizzera-Ticino
    Messaggi
    1,872
    Praticamente quando vado a leggere trovo dei voti che non corrispondono con quelli immessi.
    Non riesco a capire se non salva, salva in modo sbagliato o boh

    Edit:
    Bene, l'errore sta nella funzione di visualizzazione e non nelle altre pian piano mi sto avvicinando al problema eheheh

  9. #9

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,858
    Quote Originariamente inviato da Bambinz Visualizza il messaggio
    Praticamente quando vado a leggere trovo dei voti che non corrispondono con quelli immessi.
    Non riesco a capire se non salva, salva in modo sbagliato o boh
    Veramente devo rifare da 0 tutto il resto del progettino per aiutarti?
    Ad una prima lettura comunque dai un occhio qui se sovrascrive nella posizione giusta: fseek(file1Ptr,i*sizeof(StudDisc),SEEK_SET);

    Poi occhio che dal ciclo se non azzecchi una matricola non esci più

  10. #10

    Iscritto dal
    04/11/2011
    Località
    Svizzera-Ticino
    Messaggi
    1,872
    Il controllo delle matricole ecc l'ho fatto
    Comunque non preoccuparti, mi sei gia stato di grande aiuto.

    Allora, il problema è SICURAMENTE qui

    codice:
    printf("Informatica:\n%1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f\n", tempS.disciplina.inf[0],tempS.disciplina.inf[1],tempS.disciplina.inf[2],tempS.disciplina.inf[3],tempS.disciplina.inf[4],tempS.disciplina.inf[5],tempS.disciplina.inf[6],tempS.disciplina.inf[7],tempS.disciplina.inf[8],tempS.disciplina.inf[9]);
                 printf("Meccanica:\n%1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f\n", tempS.disciplina.mec[0],tempS.disciplina.mec[1],tempS.disciplina.mec[2],tempS.disciplina.mec[3],tempS.disciplina.mec[4],tempS.disciplina.mec[5],tempS.disciplina.mec[6],tempS.disciplina.mec[7],tempS.disciplina.mec[8],tempS.disciplina.mec[9]);
                 printf("Elettronica:\n%1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f %1.f\n", tempS.disciplina.elet[0],tempS.disciplina.elet[1],tempS.disciplina.elet[2],tempS.disciplina.elet[3],tempS.disciplina.elet[4],tempS.disciplina.elet[5],tempS.disciplina.elet[6],tempS.disciplina.elet[7],tempS.disciplina.elet[8],tempS.disciplina.elet[9]);
              
    
      
                for(i=0;i<30;i++)
                 {
                    if(i<10)
                    {
                        if(!i) printf("\nVoti informatica\n");
                        printf("%.1f ", tempS.disciplina.inf[i]);
                    }
                    else if(i>=10 && i<20)
                    {
                        if(i==10) printf("\nVoti meccanica\n");
                        printf("%.1f ", tempS.disciplina.mec[i-10]);
                    }
                    else
                    {
                      if(i==20) printf("\nVoti elettronica\n");
                      printf("%.1f ", tempS.disciplina.mec[i-20]);
                    } 
                 }
    Se faccio la visualizzazione nel modo "verde" funziona perfettamente, con i cicli for no ...

    Che cretino che sono..... Guarda sotto Voti elettronica.... C'è scritto .mec !!!!! -.- un macello di tempo buttato per una stupidata del genere....
    Grazie infinite a tutti!
    Ultima modifica: 30-05-2013 alle 11:01, di Bambinz


 
+ Rispondi
Pagina 1 di 3 1 2 3 UltimaUltima

Autorizzazioni

  • Non puoi iniziare nuove discussioni
  • Non puoi rispondere alle discussioni
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
Powered by vBulletin™ Version 4.1.5
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved
SEO by vBSEO ©2011, Crawlability, Inc.
Fuso orario: UTC +1, sono le 07:24.