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

    Ennesimo problema malloc

    Ecco qui i due metodi indagati:

    In poche parole il primo metodo estrare le righe da un file txt in cui compare in lemma passato e le passa al secondo metodo che filtra le parole...La cosa strana è che funziona , per le prime righe, poi lancia un'eccezzione...dalle prove il problema è la malloc nel secondo metodo...ma perchè a volte funge e a volte no?

    codice:
    /* Metodo che rimuove dal file in input tutte le righe in cui compare il lemma passato */
    void delete_lemma_all(FILE *stream, char *lemma){
         FILE *tmp;
         tmp = fopen("./file_tmp.txt", "w+");
         char linea[512];
         int row=0;
         while(fgets(linea,512,stream) != NULL ){
              if(strstr(linea, lemma) == NULL) { fprintf(tmp,"%s",linea); }
              else {printf("%s\n",linea); delete_lemma_all_2(linea, row);}
              row++;
         }
         fclose(tmp);
         fclose(stream);
         remove("./file.txt");
         rename("./file_tmp.txt","./file.txt");
         stream = fopen("./file.txt", "r+");
    }
    
    /* Metodo che estrae dalla stringa passate tutti lemmi, in modo da aggiornare il database */
    void delete_lemma_all_2(char *linea, int row){
        int len = strlen(linea);
        char ch;
        char *lemma = NULL;
        int i=0;
        int k=0;
        lemma = (char*)malloc(sizeof(char)); /* DOPO UN PO SI IMPIANTA IN STA MALLOC!!! COME MAI? */
        if (lemma == NULL) { 
             printf("Errore nell'allocazione di memoria\n"); 
             exit (1); 
        }
        printf("Lunghezza linea: %d\n",len);
        /*while( (ch = linea[k]) != '\0' ){*/
        while(k<len){
              ch = linea[k];    
              if((((int)ch>64)&&((int)ch<91))||(((int)ch>96)&&((int)ch<123))){
                    lemma = (char*)realloc(lemma,(i+1)*sizeof(char));
                    if (lemma == NULL) { 
                       printf("Errore nell'allocazione di memoria\n"); 
                       exit (1); 
                    }
                    lemma[i]=ch;
                    i++;
              }else{
                    lemma[i]='\0';
                    if ((i>3)&&(i<MAX_LEMMA)) printf("->%s\n",lemma);
                    i=0;
                    free(lemma);
              }
              k++;
        }
        lemma[i]='\0';
        if ((i>3)&&(i<MAX_LEMMA)) printf("%s\n",lemma);
        free(lemma);
    }
    grazie mille, sono giorni che ci sto sbattendo la testa senza cavarci niente!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Mostra anche i dati su cui operi ... e' su quelli che va provato il codice per individuare piu' facilmente e velocemente il problema ...

  3. #3
    un semplice txt:

    prova come mai non va un belino
    prova come mai non va un belino
    prova come mai non va un belino
    prova come mai non va un belino
    prova come mai non va un belino
    prova come mai non va un belino
    prova come mai non va un belino
    prova come mai non va un belino

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481

    Re: Ennesimo problema malloc

    Il problema e' che, nel ciclo, esegui la realloc dopo che hai eseguito la free ...

  5. #5

    Re: Re: Ennesimo problema malloc

    Originariamente inviato da oregon
    Il problema e' che, nel ciclo, esegui la realloc dopo che hai eseguito la free ...
    ok ora provo a fare una malloc subito dopo la free


    grandissimo! ora va alla perfezione! e pensare che erano giorni che le provavo tutte

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Suggerisco come sempre di usare titoli significativi e, soprattutto, di indicare il linguaggio, come da Regolamento.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.