Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 19 su 19
  1. #11
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Quando dichiaro:
    codice:
    data oggi;
    Penso che il compilatore mi segnerebbe l' errore,comunque ho provato a fare come dici,crasha comunque.Penso sia un segmentation fault,adesso provo a riscrivere tutto.

  2. #12
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Il problema in cui mi sono imbattuto è di dichiarare una struttura che a sua volta contenga una struttura al suo interno.
    Esempio:
    codice:
    typedef struct
    {
        char *titolo;
        char *nota;
        short int orario[2];
    }nota_con_orario;
    typedef struct
    {
        short int mese;
        char *giorno_settimana;
        nota_con_orario *note;
    }data;
    Il mio intento era di accedere per esempio al titolo della nota così:
    esempio di dichiarazione
    codice:
    data dicembre[31];
    data *ptr;
    ptr=dicembre;
    ....                      /* poi lo passo a una funzione */
    /* dentro la funzione,di cui data*ptr è un parametro */
    (*ptr).note.titolo="titolo";
    Ma mi da errore:
    "titolo has not been declared".
    Eppure titolo è un componente del tipo di struttura nota_con_orario,di cui fa parte note.
    Come fare?

  3. #13
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    difficolta con i puntatori

    Ma devi usarli per forza i puntatori , se usi variabili normali o array ti funziona !

    ESEMPIO:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct
    {
        char titolo[30];
        char nota[50];
        short int orario[2];
    }nota_con_orario;
    typedef struct
    {
        short int mese;
        char giorno_settimana[20];
        nota_con_orario note;
    }data;
    int main()
    {
      data prova;
      prova.mese=3;
      prova.note.orario[0]=12;
      printf("%d   %d\n",prova.mese,prova.note.orario[0]);
      system("PAUSE");	
      return 0;
    }
    Tecnologia

  4. #14
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    principiante non so se dovrei scrivere

    Ciao ma le tue funzioni ti funzionano?
    perché secondo me se devi modificare i dati di una struttura in una funzione devi passarla
    per indirizzo funzione( &struttura) ricevendo funzione(tipo * dd).
    poi ti complichi la vita devi scrivere una struttura su un file puoi inizializzarla direttamente
    nella funzione poi scriverla ; se la devi leggere lo stesso poi mandi l' output direttamente dalla
    funzione non c'è bisogno di passarla continuamente dal main alle funzioni
    esempio :
    funzione legge record
    lo passa al main
    il main stampa


    si può fare
    funzione legge record e li stampa


    io avevo già fatto una piccola agenda nel main ho messo solo un menù di selezione
    la scrittura con inizializzazione della struttura in una funzione
    lettura e stampa in un altra
    lettura e modifica in un altra

    la cosa era abbastanza semplice se hai un tipo struttura globale
    Tecnologia

  5. #15
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Per variabili di cui so le dimensioni a priori le alloco normalmente,sennò ad esempio nel caso della nota,che ha dimensioni che non conosco,dichiaro il puntatore e poi gli alloco l' area di memoria con malloc e realloc.
    Ho ridichiarato la struttura così:
    codice:
    typedef struct
    {
        char *titolo;
        char *nota;
        short int orario[2];
    }nota_con_orario;
    typedef struct
    {
        short int mese;
        char *giorno_settimana;
        nota_con_orario *note;
    }data;
    Adesso ci sono due strutture e contiene il puntatore alla struttura nota_con_orario.
    Ogni volta che l' utente aggiunge una nota ridichiaro:
    codice:
    (*p).note=(nota_con_orario*)realloc((*p).note,(variabile)*sizeof(nota_con_orario));
    E mi dava errore perchè sbagliavo ad accederci,note.titolo è un puntatore a puntatore
    Per accederci direttamente guarda come devo fare:
    codice:
    (*((*p).note)).titolo="ciao";
    Altrimenti mi dice che titolo non è stato dichiarato,perchè l' operatore . ha la precedenza su * e quindi va separato da parentesi.
    Comunque piano piano l' agenda sta prendendo forma,per ora compare il menù con le scelte che si possono fare,ma devo fare ancora le funzioni per inserire una nota,stampare i promemoria,ecc...la mia idea è di gestire il puntatore *note creando una pila di elementi,che si aggiungono o tolgono pian piano che l' utente inserisce una nota.
    E per ora la faccio senza file,poi quando mi studio fopen per bene salverò tutto su un file.

    P.S.: E avevo già creato una funzione in un altro thread per allocare dinamicamente una stringa ricevuta da tastiera senza sapere quanto sarà lunga:
    codice:
    char* allocam(char*p)
    {
        int i=0;
        char *c,ci;
        c=(char*)malloc(sizeof(char));
        while(ci!=10)
        {
          ci=getchar();
          c[i]=ci;
          i++;
          c=(char*)realloc(c,sizeof(char)*i);
        }
        return c;
    }
    Il vantaggio del puntatore è che puoi allargare l' area di memoria a cui punta,voglio usare la minima memoria possibile.

  6. #16
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Sono andato avanti nel progetto,e mi sono fermato nella fase di gestione del file.
    Ho già provato a scrivere su dei file,ma il mio dubbio ora è su come gestire un file che:
    -Ha dimensioni variabili;
    -Ogni elemento ha un numero indeterminato di note;

    Il mio problema è su come gestirlo,per i valori fissi come il giorno,la data non ci sono porblemi.
    Riconducendo il tutto a una caso semplice dove per comodità uso la struttura:
    codice:
    typedef struct 
    {
        int giorno;
        char *note;
    }gg;
    Un esempio del contenuto del file può essere:
    codice:
    14
    ciaocomestai,ecc...
    Il problema è che se leggo volta per volta le righe del file,potrbbe capitare una nota che ha dimensioni maggiori di una riga,poi un altro problema è che non so il numero di note.
    Generalmente,seperando le nota da \n riesco a capire cosa sto leggendo perchè conto le righe,ma se per esempio ho 3 note (e non so da prima quante ne ho),come faccio a leggere il file a a generare n stringhe senza sapere quante saranno?
    Riesco a farlo solo se so da prima le dimensioni.

  7. #17
    Le possibilità sono 2:

    1. imposti campi di dimensioni costanti: 10 per le date (xx/xx/xxxx), 90 per le note; in questo caso se ti ritrovi 6 elementi avrai 600 caratteri

    2. usi dei particolari token, ovvero dei caratteri/stringhe di riconoscimento prima e dopo i tuoi valori, come nell'esempio: #10/10/2010@Ecco la tua nota..@#
    Dopo caricamento del file in una variabile, usi la strtok con delimitatore "#"; per ogni record trovato riapplichi la strtok con delimitatore "@": a questo punto i primi 10 caratteri rappresentano la data, i restanti la nota.

    Voglio precisare che per un'agenda, quindi di dimensioni non proibitive, può bastare tale approccio, altrimenti bisognerebbe utilizzare altri strumenti.


    Ciao

  8. #18
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ciao MdE,mi eri mancato
    Sto provando a farlo usando la newline come token.
    Il problema è che mi legge solo la prima struttura,poi se passo a leggere la seconda,il programma letteralmente si blocca.
    Forse sarebbe meglio scriverlo in binario,non sono convinto che funzioni bene.
    Ho dovuto anche fare una funzione "correggente" che se trova il terminatore nella prima riga sposta in avanti il cursore di 1,sennò mi era impossibile leggere correttamente il file
    Ecco qua come sto provando a leggerlo:
    codice:
    #include"ramy.h"
    
    typedef struct
    {
        int data [4];                                                   /* contenuto: mese,giorno,ora,minuti */
        char *oggetto;
        char *testo;
    }nota;
    
    
    typedef struct
    {
        int par[2];                                                     /* parametri di ricerca di una nota */
        char *parole_chiave;
    }parametri;
    
    
    void nota_write (FILE *fp,nota *ptr);
    nota *nota_read(FILE*fp,nota *ptr);
    int num_line(FILE*fp);
    char* get_string(FILE *fp,char*ptr);
    
    
    int main()
    {
        nota *ptr;
        FILE *fp;
        fp=fopen("prova.txt","r");
        ptr=nota_read(fp,ptr);
        nota_write(stdout,ptr);
        free(ptr);
        ptr=nota_read(fp,ptr);
        nota_write(stdout,ptr);
        fclose(fp);
        return 0;
    }
    
    nota *nota_read(FILE*fp,nota *ptr)
    {
        char *p;
        int i;
        ptr=(nota*)malloc(sizeof(nota));
        for(i=0;i<4;i++)
        {
            p=get_string(fp,p);
            (*ptr).data[i]=atoi(p);
            free(p);
        }
        (*ptr).oggetto=get_string(fp,(*ptr).oggetto);
        (*ptr).testo=get_string(fp,(*ptr).testo);
        return ptr;
    }
    
    
    void nota_write (FILE *fp,nota *ptr)
    {
        fprintf(fp,"%d\n%d\n%d\n%d\n",(*ptr).data[0],(*ptr).data[1],(*ptr).data[2],(*ptr).data[3]);
        puts((*ptr).oggetto);
        puts((*ptr).testo);
    }
    
    int num_line(FILE*fp)
    {
        int c,line=1;
        do
        {
            c = fgetc (fp);
            if (c == '\n')
              line++;
        }while (c != EOF);
        rewind(fp);
        return line;
    }
    
    
    char* get_string(FILE *fp,char*ptr)
    {
        ptr=(char*)malloc(sizeof(char));
        int i=1;
        char ci;
        fflush(stdin);
        ci=fgetc(fp);
        if(ci!='\0')
          fseek(fp,-1,SEEK_CUR);
        while(ci!=10)
        {
            ptr=(char*)realloc(ptr,i*sizeof(char));
            ci=fgetc(fp);
            if(ci!=10)
              ptr[i-1]=ci;
            else
              ptr[i-1]='\0';
            i++;
        }
        fflush(stdin);
        return ptr;
    }
    Mi stampa la prima struttura correttamente (letta da file),ma poi il programma si ferma,il debugger non segna alcun errore ma il programma si "congela".Vedo anche da gestione attività che sto usando la cpu al 50-70%

  9. #19
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ah,finalmente ho risolto !!!!!!
    Avevo dimenticato che a fine file bisogna andare accapo sennò non smette di leggere.
    Ho risistemato la get_string.
    Ecco qua:
    codice:
    #include"ramy.h"
    
    typedef struct
    {
        int data [4];                                                   /* contenuto: mese,giorno,ora,minuti */
        char *oggetto;
        char *testo;
    }nota;
    
    
    typedef struct
    {
        int par[2];                                                     /* parametri di ricerca di una nota */
        char *parole_chiave;
    }parametri;
    
    
    void nota_write (FILE *fp,nota *ptr);
    nota *nota_read(FILE*fp,nota *ptr);
    int num_line(FILE*fp);
    char* get_string(FILE *fp,char*ptr);
    
    
    int main()
    {
        nota *ptr;
        FILE *fp;
        char *p;
        fp=fopen("prova.txt","r");
        ptr=nota_read(fp,ptr);
        nota_write(stdout,ptr);
        free(ptr);
        ptr=nota_read(fp,ptr);
        nota_write(stdout,ptr);
        free(ptr);
        ptr=nota_read(fp,ptr);
        nota_write(stdout,ptr);
        fclose(fp);
        free(ptr);
        p=get_string(stdin,p);
        puts(p);
        return 0;
    }
    
    nota *nota_read(FILE*fp,nota *ptr)
    {
        char *p;
        int i;
        ptr=(nota*)malloc(sizeof(nota));
        for(i=0;i<4;i++)
        {
            p=get_string(fp,p);
            (*ptr).data[i]=atoi(p);
            free(p);
        }
        (*ptr).oggetto=get_string(fp,(*ptr).oggetto);
        (*ptr).testo=get_string(fp,(*ptr).testo);
        return ptr;
    }
    
    
    void nota_write (FILE *fp,nota *ptr)
    {
        fprintf(fp,"%d\n%d\n%d\n%d\n",(*ptr).data[0],(*ptr).data[1],(*ptr).data[2],(*ptr).data[3]);
        fputs((*ptr).oggetto,fp);
        fprintf(fp,"\n");
        fputs((*ptr).testo,fp);
        fprintf(fp,"\n");
    }
    
    int num_line(FILE*fp)
    {
        int c,line=1;
        do
        {
            c = fgetc (fp);
            if (c == '\n')
              line++;
        }while (c != EOF);
        rewind(fp);
        return line;
    }
    
    
    char* get_string(FILE *fp,char*ptr)
    {
        ptr=(char*)malloc(sizeof(char));
        int i=1;
        char ci;
        if(fp==stdin)
          fflush(fp);
        else
        {
            ci=fgetc(fp);
            if(ci!='\0')
              fseek(fp,-1,SEEK_CUR);
        }
        while(ci!=10)
        {
            ptr=(char*)realloc(ptr,i*sizeof(char));
            ci=fgetc(fp);
            if(ci!=10)
              ptr[i-1]=ci;
            else
              ptr[i-1]='\0';
            i++;
        }
        fflush(stdin);
        return ptr;
    }

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 © 2026 vBulletin Solutions, Inc. All rights reserved.