Visualizzazione dei risultati da 1 a 10 su 17

Hybrid View

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

    Ciao

    Ciao , invece di aiutarti , perchè ci sono persone competenti che possono farlo in maniera ottimale , vorrei chiederti io di aiutarmi a capire il tuo codice .

    Vorrei sapere cosa fa questo spezzone di codice ???

    codice:
    int z =0;
        while((fgets(buffer,sizeof(buffer), f))!=NULL)
            z++;     // QUI CONTI LE RIGHE DEL FILE , MA BUFFER COSA CONTIENE A FINE CICLO  ?????
        accesso db[z];
        int d;
        for(d=0; d<z; d++){// QUI ESEGUI SSCANF PER IL NUMERO DI RIGHE FILE , MA BUFFER NON E' LA STESSA STRINGA ??????
        sscanf(buffer,"%d:%d:%d %s %d",&db[d].hh,&db[d].mm,&db[d].ss, db[d].C,&db[d].user); 
        
    Ultima modifica di torn24; 11-07-2014 a 08:03
    Tecnologia

  2. #2
    Utente di HTML.it L'avatar di fedrock
    Registrato dal
    Jun 2009
    residenza
    Milan
    Messaggi
    342
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    Ciao , invece di aiutarti , perchè ci sono persone competenti che possono farlo in maniera ottimale , vorrei chiederti io di aiutarmi a capire il tuo codice .

    Vorrei sapere cosa fa questo spezzone di codice ???

    codice:
    int z =0;
        while((fgets(buffer,sizeof(buffer), f))!=NULL) 
            z++;     // QUI CONTI LE RIGHE DEL FILE , MA BUFFER COSA CONTIENE A FINE CICLO  ?????
        accesso db[z];
        int d;
        for(d=0; d<z; d++){// QUI ESEGUI SSCANF PER IL NUMERO DI RIGHE FILE , MA BUFFER NON E' LA STESSA STRINGA ??????
        sscanf(buffer,"%d:%d:%d %s %d",&db[d].hh,&db[d].mm,&db[d].ss, db[d].C,&db[d].user); 
        
    Caspita hai ragione, li c'è un errore logico non me ne ero accorto
    Mi serviva il numero delle righe per stabile la dimensione dell'array di strutture accesso ecco perché tutto quel casino...
    Quindi il codice giusto dovrebbe essere;
    codice:
    int z =0;
        while((fgets(buffer,sizeof(buffer), f))!=NULL) {
            z++;
    }
        accesso db[z];
       while((fgets(buffer,sizeof(buffer), f))!=NULL) {
        sscanf(buffer,"%d:%d:%d %s %d",&db[d].hh,&db[d].mm,&db[d].ss, db[d].C,&db[d].user);
    }
    C'è comunque qualcosa che non mi convinge... Non ho usato puntatori (perché non li so usare bene) però mi ricordo che all'esame molti l'hanno fatto con i puntatori (quelli che l'hanno passato)

    I SHOULD TELL YOU SOMETHING NEW:
    don't want you here.


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

    Ciao

    Ciao ,se ti può essere utile ? capire bene i puntatori forse è complesso , ma usare un array dinamico nella pratica è abbastanza semplice .
    http://www.cplusplus.com/reference/cstdlib/realloc/

    codice:
    accesso *db=NULL; //puntatore che non punta a nessuna locazione di  memoria 
    
    int z=0;
    while((fgets(buffer,sizeof(buffer), f))!=NULL) 
    {
          z++;   
         db=(accesso *)realloc(db,sizeof(accesso)*z);    
          /*se db è NULL , realloc si comporta come malloc , 
             successivamente   rialloca memoria aumentandola di sizeof(accesso) ,
             db si usa come un normale array  db[0] 
           */
          sscanf(buffer,"%d:%d:%d %s %d",&db[z-1].hh,&db[z-1].mm,&db[z-1].ss, &db[z-1].C,&db[z-1].user);
    }
    Ultima modifica di torn24; 11-07-2014 a 15:27
    Tecnologia

  4. #4
    Utente di HTML.it L'avatar di fedrock
    Registrato dal
    Jun 2009
    residenza
    Milan
    Messaggi
    342
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    Ciao ,se ti può essere utile ? capire bene i puntatori forse è complesso , ma usare un array dinamico nella pratica è abbastanza semplice .
    http://www.cplusplus.com/reference/cstdlib/realloc/

    codice:
    accesso *db=NULL; //puntatore che non punta a nessuna locazione di  memoria 
    
    int z=0;
    while((fgets(buffer,sizeof(buffer), f))!=NULL) 
    {
          z++;   
         db=(accesso *)realloc(db,sizeof(accesso)*z);    
          /*se db è NULL , realloc si comporta come malloc , 
             successivamente   rialloca memoria aumentandola di sizeof(accesso) ,
             db si usa come un normale array  db[0] 
           */
          sscanf(buffer,"%d:%d:%d %s %d",&db[z-1].hh,&db[z-1].mm,&db[z-1].ss, &db[z-1].C,&db[z-1].user);
    }
    Ciao grazie per l'aiuto, seguendo il tuo consiglio ho riscritto da capo il programma:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct
    {
        int hh, mm, ss;
        char C;
        int user;
    }accesso;
    
    
    void carica_dati(char filename[])
    {
        FILE *f;
        f = fopen(filename, "r");
           if(f==NULL) 
        { perror("File input error"); 
          fclose(f);
          exit(1); }
        accesso *db = NULL;
        char buffer[50];
            int z = 0; 
            /*FILE *new;
        new = fopen("newfile.txt", "w+"); */
           while((fgets(buffer, sizeof(buffer), f))!=NULL)
        {
         z++;   
             db=(accesso *)realloc(db, sizeof(accesso)*z);    
             sscanf(buffer,"%d:%d:%d %s %d", &db[z-1].hh, &db[z-1].mm, &db[z-1].ss, &db[z-1].C, &db[z-1].user);
         /*fprintf(new, "[%d]%d:%d:%d %c %d\n", z, db[z-1].hh, db[z-1].mm, db[z-1].ss, db[z-1].C, db[z-1].user);*/
        }
        int i, g;
        accesso dbIU[sizeof(db)/2];
        for(i=0; i<(z/2); i++)
        {
            for(g=0; g<z; g++)
            {
                if(db[i].user==db[g].user)
                {
                    if(db[i].C=='U')
                    {
                                
    }
    
    
    
    int permanenza(accesso dati)
    {
        int hI, mI, sI, hU, mU, sU;
        hI = dati.hhI;
        mI = dati.mmI;
        sI = dati.ssI;
        hU = dati.hhU;
        mU = dati.mmU;
        sU = dati.ssU;
        int h, m, s;
        h = hU-hI;
        m = mU-mI;
        s = sU-sI;
        int stot;
        stot = (h*3600) + (m*60) + s;
        return stot;
    }
    
    int main(int argc, char *argv[])
    {
        carica_dati(argv[1]);
        
    
    
    
    
    
        return 0;
    }
    Ora stavo provando a creare una struttura di tipo accesso che sia ordinata nel contenere sia l'ingresso che l'uscita in modo da passarla all'altra funzione "permanenza" (si può fare in quel modo oppure la struttura dentro "carica_dati" non è visibile fuori?) ma non riesco a trovare l'argoritmo giusto... stavo pensanto di fare prima una sort del file rispetto all'user in modo da trovarmi l'user in due righe "adiacenti" (azzo lo spiego ) cosi da semplificare la ricerca la ricerca dell'argoritmo ma non so se sia il massimo come idea...

    Ammetto di non aver capito a cosa diavolo serve l'allocazione dinamica nonostante il link e altre robe che ho cercato, sono così limitato, ho come un blocco che mi impedisce di capire la malloc e i puntatori e mancano 5 giorni all'esame

    I SHOULD TELL YOU SOMETHING NEW:
    don't want you here.


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.