Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    30

    Problemi con struct e enum in C

    Ciao a tutti purtroppo ho un paio di problemi con le struc e le enum...ovvero mi spiego meglio:
    vorrei creare una struct data e in questa inserire dei valori presi da un enum in cui inserisco sia i giorni che i mesi..posto il codice che però non funziona ma amgari si capisce meglio:

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


    typedef struct data
    {
    int mese;
    int giorno;
    };

    int main()
    {

    typedef enum {Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre} mese;
    typedef enum {Lunedi, Martedi, Mercoledi, Giovedi, Venerdi, Sabato, Domenica} giorno;

    struct data *oggi;
    oggi=(struct data *) malloc (sizeof(struct data));
    mese prova=1;
    giorno prov=1;
    oggi->mese=prova;
    oggi->giorno=prov;
    printf("%s %s\n",oggi->giorno, oggi->mese);
    free(oggi);
    return 0;
    }

    In realtà poi il mio scopo sarebbe quello di chiedere all'utente di inserire una data tramite printf("Inserisci una data") ecc e scanf("", )nella scanf gli verrebbero passati poi valori numerici..
    qualche consiglio??
    Grazie mille a tutti in anticipo

  2. #2
    Non capisco a che scopo fai tutto ciò.

    Le enum le dichiari e poi le usi con l'operator di scope resolution (:: quindi, a parte che in questo caso non servono proprio a nulla, le devi usare così

    codice:
    typedef enum {Domenica, Lunedi, Martedi, Mercoledi } Giorni;
    
    Giorni::Domenica
    Cioè tu fai inserire un numero da scanf e per inserirle in variabili int usi gli enum ?
    Una cosa inutile.

    Avrebbe avuto senso se avessi fatto inserire dei numeri, e poi avessi messo nella struttura non int ma enum, così:

    codice:
    struct data {
     Giorni g;
    };
    In questo caso la conversione da int a enum è automatica, puoi assegnare direttamente l'int a g, solo che devi ricordarti che gli enum partono da zero, quindi se un utente ha inserito 1 per intendere lunedi e Lunedi è in 1^ posizione nell'enum, Lunedì nell'enum varrà 0 non 1.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    30
    Quello che vorrei fare io è appunto quello che dicevi te alla fine.
    La logica di questo procedimento dovrebbe rientrare in un programma più ampio

    Dovrei creare un'agenda per note..e quindi devo creare una struttura adatta..
    L'utente tramite un menu scegli inserisci nota e gli deve comparire inserisci la nota e la data...l'utente scrive la sua nota e la data tipo con inserisci
    giorno:7
    mese: 1

    e poi quando va a stampare la nota deve venirgli fuori: domenica gennaio, poi ovviamente è da sistemare. solo che come ho provato a fare non funziona e anche sostituendo quello che mi dici tu mi da cmq errore...

  4. #4
    Originariamente inviato da Heroes7
    Quello che vorrei fare io è appunto quello che dicevi te alla fine.
    La logica di questo procedimento dovrebbe rientrare in un programma più ampio

    Dovrei creare un'agenda per note..e quindi devo creare una struttura adatta..
    L'utente tramite un menu scegli inserisci nota e gli deve comparire inserisci la nota e la data...l'utente scrive la sua nota e la data tipo con inserisci
    giorno:7
    mese: 1

    e poi quando va a stampare la nota deve venirgli fuori: domenica gennaio, poi ovviamente è da sistemare. solo che come ho provato a fare non funziona e anche sostituendo quello che mi dici tu mi da cmq errore...
    Il fatto è che è inutile usare gli enum in questo caso, o meglio, se programmi ad oggetti, può essere un modo di procedere, altrimenti non servono:

    Per fare quello che vuoi fare tu, siccome l'utente inseririrà giorno, mese ed anno in formato numerico, un modo di procedere potrebbe essere anche quello di usare 3 variabili int per memorizzarle.
    Quello che serve a te, inoltre, e poter associare un numero ad una stringa, perchè vuoi stampare una stringa per ogni valore numerico.
    Questo non lo fai con gli enum, ma usando magari un array di stringhe:

    codice:
    char* giorno [] {"Domenica", "Lunedi", "Martedi" ecc...};
    char* mese [] {"Gennaio", "Febbraio", "Marzo" ecc...};
    ed usando giorno[1] potrai stampare Lunedì e così via.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    30
    grazie mille per le risposte anche nell'altro thread..ora provo a farla come mi dici tu qui che sembra il modo migliore

  6. #6
    Originariamente inviato da Heroes7
    grazie mille per le risposte anche nell'altro thread..ora provo a farla come mi dici tu qui che sembra il modo migliore
    Ora non so se hai mai programmato in Java, in Java gli enum sono convertibili in stringhe (cioè se fai un enum.toString() ti ritorna il nome dell'enum) non in C++
    lolide
    Java Programmer

    Informati

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    30
    ciao, bè in java si ho presente però purtroppo mi tocca programmare in c.
    ho un altro problema...ti posto il codice. Se lo provi dunziona tutto tranne per il fatto che quando va a sptampare dal main l'orario lo stampa male.

    /*struttura data.. main che invoca inserisciData che costrusce una struttura con i dati inseriti dall'utente e poi li stampa*/



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

    struct data inserisciData();

    struct data{
    int giorno;
    int anno;
    char *mese;
    char *ora;
    };

    main(){
    int i;
    struct data domani;
    printf("Avvio del programma\n");
    domani = inserisciData();
    printf("Il giorno e': %d\n",domani.giorno);
    printf("Il mese e': %s\n",domani.mese);
    printf("L'anno e': %d\n",domani.anno);
    printf("L'ora e': %s\n",domani.ora);
    //free (domani.mese);
    return 0;
    }

    struct data inserisciData(){
    struct data oggi;
    int day, month, year; // giorno anno mese
    int hour, minute;
    int x = 0; // variabile che uso per controllare se la data inserita è corretta o meno. settata a 0 non lo è settata a 1 si
    int y = 0; //uguale a sopra solo per l'ora
    char orario[10];
    /*char* mese;
    mese = (char*) malloc (sizeof(char)*15); se ti interessano 15 caratteri*/
    char* nomemese[]={"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"};
    do{
    printf("Inserisci un giorno: \n");
    scanf("%d",&day);
    printf("Inserisci un mese: \n");
    scanf("%d",&month);
    printf("Inserisci un anno: \n");
    scanf("%d",&year);
    if(day<1 || day>31){
    printf("I mesi hanno al massimo 31 giorni\n");
    }
    if(month<1 || month>12){
    printf("Hai inserito un numero di mese che non esiste\n");
    }
    else if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
    if(day>0 && day<=31){
    x=1;
    }
    }
    else if(month==4 || month==6 || month==9 || month==11){
    if(day>0 && day<=30){
    x=1;
    }
    }
    else if(month==2){
    if(day>0 && day<29){
    x=1;
    }
    }
    else
    printf("Hai digitato un numero di giorni che non corrsiponde al mese che hai inserito\n");
    if(x==0){
    printf("Ripeti l'inserimento della data\n");
    }

    }while(x==0);

    do{
    printf("Inserisci l'ora dell'appuntamento e poi alla prossima richiesta i minuti (hh): \n");
    scanf("%d", &hour);
    printf("Inserisci i minuti (mm): \n");
    scanf("%d", &minute);
    if(hour>=0 && hour<=23){
    if(minute>=0 && minute<=59){
    y=1;
    }
    }

    }while(y==0);
    sprintf(orario, "%d:%d", hour, minute);
    oggi.giorno=day;
    oggi.mese=nomemese[month-1]; /*-1 perchè l'array parte da 0*/
    oggi.anno=year;
    oggi.ora=orario;
    printf("Il giorno e': %d\n",oggi.giorno);
    printf("Il mese e': %s\n",oggi.mese);
    printf("L'anno e': %d\n",oggi.anno);
    printf("L'ora e' %s\n",oggi.ora);
    return oggi;
    }


    il problema è proprio qui..ovvero quando faccio il return. Non da errori di compilazione e quando sampa oggi.ora lo stampa bene....non capisco perchè non me lo stampi bene dal main....

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Ciao,

    non riesco a capire bene il codice (forse sarebbe meglio usare i tag [CODE] ), ma nella tua struct hai due puntatori a char...e li assegni nella funzione dandogli l'indirizzo di due variabili locali! (nomemese[] e orario sono dichiarate all'interno della funzione, quando la funzione ritorna...puff...).

    Quando torni al main non credo che la memoria dove puntano sia ancora valida...e quindi....

    Non puoi usare delle stringhe?

    Poi non so se è più corretto che "domani" lo dichiari come puntatore e lo passi alla funzzione (e nella funzione allochi "oggi" con malloc)

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    30
    si ma non sparei come fare per usare le stringhe, qualche consiglio?

    Lo scopo finale è quello poi di creare un agenda dove posso inserire le note..cioè mi spiego meglio:
    nella struct che ho postato ci andrebbe un campo nota dove uno può per esempio scrivere compleanno o cose così...
    dopo dal main o dalla funzione tramite inseriscidata dovrei allocare tramite malloc uno spazio di memoria per la nuova struttura. Non so se sono stato molto chiaro a dire il vero
    Poi l'utente una volta inserita la sua nota decide se inserirne un'altra o no..e poi bisognerebbe tramite una funzione stampare tutto.
    Però direi un problema alla volta
    Cosa dovrei aggiustare per fargli stampare correttamente l'orario?
    E cosa dovrei fare per far si che magari in un futuro non perda le info che faccio inserire all'utente?
    Grazie mille in anticipo a te e a chiunque risponderà
    Ti riposto di nuovo il codice con code e togliendo due parti che non servono che sono commentate così riesce a vederlo meglio:

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    
    struct data inserisciData();
    
    struct data{
      int giorno;
      int anno;
      char *mese;
      char *ora;
    };
    
    main(){
      int i;
      struct data domani;
      printf("Avvio del programma\n");
      domani = inserisciData();
      printf("Il giorno e': %d\n",domani.giorno);
      printf("Il mese e': %s\n",domani.mese);
      printf("L'anno e': %d\n",domani.anno);
      printf("L'ora e': %s\n",domani.ora);
      return 0;
    }
    
    struct data inserisciData(){
       struct data oggi;
       int day, month, year; // giorno anno mese
       int hour, minute;
       int x = 0; // variabile che uso per controllare se la data inserita è corretta o meno. settata  a 0 non lo è settata a 1 si
       int y = 0; //uguale a sopra solo per l'ora
       char orario[10];
       char* nomemese[]={"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"};
       
    do{
    printf("Inserisci un giorno: \n");
    scanf("%d",&day);
    printf("Inserisci un mese: \n");
    scanf("%d",&month);
    printf("Inserisci un anno: \n");
    scanf("%d",&year);
       if(day<1 || day>31){
       printf("I mesi hanno al massimo 31 giorni\n");
       }
       if(month<1 || month>12){
        printf("Hai inserito un numero di mese che non esiste\n");
       }
       else if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
                 if(day>0 && day<=31){
                    x=1;
                 }
       }
       else if(month==4 || month==6 || month==9 || month==11){
                     if(day>0 && day<=30){
                              x=1;
                      }
        }
       else if(month==2){
               if(day>0 && day<29){
                    x=1;
               }
       }
        else
               printf("Hai digitato un numero di giorni che non corrsiponde al mese che hai inserito\n");
        if(x==0){
              printf("Ripeti l'inserimento della data\n");
        }
    
    }while(x==0);
    
    
    do{
    printf("Inserisci l'ora dell'appuntamento e poi alla prossima richiesta i minuti (hh): \n");
    scanf("%d", &hour);
    printf("Inserisci i minuti (mm): \n");
    scanf("%d", &minute);
    if(hour>=0 && hour<=23){
             if(minute>=0 && minute<=59){
                 y=1;
             }
    }
    
    }while(y==0);
    
    sprintf(orario, "%d:%d", hour, minute);
    oggi.giorno=day;
    oggi.mese=nomemese[month-1]; /*-1 perchè l'array parte da 0*/
    oggi.anno=year;
    oggi.ora=orario;
    printf("Il giorno e': %d\n",oggi.giorno);
    printf("Il mese e': %s\n",oggi.mese);
    printf("L'anno e': %d\n",oggi.anno);
    printf("L'ora e' %s\n",oggi.ora);
    return oggi;
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Io pensavo ad una cosa di questo tipo (posto il codice), anche se sarei curioso di sapere se ritornare la struct come avevi fatto tu è corretto...chiedo aiuto a qualche saggio del forum!
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    struct data{
    int giorno;
    int anno;
    char mese[10];
    char ora[10];
    };
    
    void inserisciData(struct data*);
    
    int main()
    {
    int i;
    struct data domani;
    
    printf("Avvio del programma\n");
    inserisciData(&domani);
    
    printf("Il giorno e': %d\n",domani.giorno);
    printf("Il mese e': %s\n",domani.mese);
    printf("L'anno e': %d\n",domani.anno);
    printf("L'ora e': %s\n",domani.ora);
    
    return 0;
    }
    
    void inserisciData(struct data* oggi){
    
    int day, month, year; // giorno anno mese
    int hour, minute;
    int x = 0; // variabile che uso per controllare se la data inserita è corretta o meno. settata a 0 non lo è settata a 1 si
    int y = 0; //uguale a sopra solo per l'ora
    char orario[10];
    
    char* nomemese[]={"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"};
    do{
    printf("Inserisci un giorno: \n");
    scanf("%d",&day);
    printf("Inserisci un mese: \n");
    scanf("%d",&month);
    printf("Inserisci un anno: \n");
    scanf("%d",&year);
    if(day<1 || day>31){
    printf("I mesi hanno al massimo 31 giorni\n");
    }
    if(month<1 || month>12){
    {
      perror("malloc");
      exit(-1);
    }
    printf("Hai inserito un numero di mese che non esiste\n");
    }
    else if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
    if(day>0 && day<=31){
    x=1;
    }
    }
    else if(month==4 || month==6 || month==9 || month==11){
    if(day>0 && day<=30){
    x=1;
    }
    }
    else if(month==2){
    if(day>0 && day<29){
    x=1;
    }
    }
    else
    printf("Hai digitato un numero di giorni che non corrsiponde al mese che hai inserito\n");
    if(x==0){
    printf("Ripeti l'inserimento della data\n");
    }
    
    }while(x==0);
    
    do{
    printf("Inserisci l'ora dell'appuntamento e poi alla prossima richiesta i minuti (hh): \n");
    scanf("%d", &hour);
    printf("Inserisci i minuti (mm): \n");
    scanf("%d", &minute);
    if(hour>=0 && hour<=23){
    if(minute>=0 && minute<=59){
    y=1;
    }
    }
    
    }while(y==0);
    sprintf(orario, "%d:%d", hour, minute);
    oggi->giorno=day;
    strcpy(oggi->mese,nomemese[month-1]); /*-1 perchè l'array parte da 0*/
    oggi->anno=year;
    strcpy(oggi->ora,orario);
    printf("Il giorno e': %d\n",oggi->giorno);
    printf("Il mese e': %s\n",oggi->mese);
    printf("L'anno e': %d\n",oggi->anno);
    printf("L'ora e' %s\n",oggi->ora);
    
    return ;
    }

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.