Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250

    [C/C++]Problema con istruzione free

    Ciao ragazzi,sono sempre io .Ho un problema con l'istruzione free,in particolare è come se non riuscisse a restituirmi lo spazio allocato.
    Ma veniamo al codice:
    codice:
    #include <iostream>
    #include <fstream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    using namespace std;
    int ContaParole(char* supporto);
    int* CreaCifra(char* supporto,int numeroparole);
    int main()
    {
        ifstream numeri;
        char supporto[256];
        int nparole;
        numeri.open("Somma.txt",ios::in|ios::out|ios::app);
        while(numeri.good())
        {
    
            numeri.getline(supporto,256);
            nparole = ContaParole(supporto);
            int* vet = (int*) calloc (nparole+1,sizeof(int));
            vet = CreaCifra(supporto,nparole);
            cout << vet[0];
            free(vet);
    
        }
    
         return 0;
        }
    int* CreaCifra(char* supporto,int numeroparole)
    {
        int i,k=0,posizione = 0,indicecifra;
        int* cifre = (int*) calloc(numeroparole,sizeof(int));
        char* cifra = (char*) calloc(8,sizeof(char));
        do
        {
            indicecifra = 0;
            for (i=k;((supporto[i]!=' ')&&(supporto[i]!='\0'));i++)
            {
                cifra[indicecifra++] = supporto[i];
                k++;
            }
                 cifra[i]='\0';
                 if (!strcmp("uno",cifra))
                    cifre[posizione++] = 1;
                 if (!strcmp("due",cifra))
                    cifre[posizione++] = 2;
                 if (!strcmp("tre",cifra))
                    cifre[posizione++] = 3;
                 if (!strcmp("quattro",cifra))
                    cifre[posizione++] = 4;
                    if (!strcmp("cinque",cifra))
                    cifre[posizione++] = 5;
                 if (!strcmp("sei",cifra))
                    cifre[posizione++] = 6;
                    if (!strcmp("sette",cifra))
                    cifre[posizione++] = 7;
                 if (!strcmp("otto",cifra))
                    cifre[posizione++] = 8;
                    if (!strcmp("nove",cifra))
                    cifre[posizione++] = 9;
                 if (!strcmp("zero",cifra))
                    cifre[posizione++] = 0;
                 k++;
                 for (int j=0;j<indicecifra;j++)
                    cifra[j]=0;
        }
        while(k<strlen(supporto));
    //    free(cifra);
        return cifre;
    }
    int ContaParole(char* supporto)
    {
        int i,j,k=0,nparole=0;
    
            for (i=0;supporto[i]!='\0';i++)
                if (supporto[i]==' ')
                    nparole++;
    
    
        return nparole;
    }
    Il problema sta nella funzione CreaCifra quando tento di deallocare la memoria occupata da 'cifra'.
    Poi ci sarebbe un altro problemarovando a commentare l'istruzione free(cifra) (ovvero non deallocando lo spazio) la funzione viene eseguita con successo ma l'esecuzione si blocca al main.
    Premetto che 'debuggando' funziona correttamente,ma quando tento di eseguirlo si pianta.
    Non riesco davvero a capirne il motivo
    Ah.. P.s.Il file "Somma.txt" è un file di testo contenente le seguenti righe
    codice:
    otto cinque nove stop
    due due stop
    sette zero sette stop
    Grazie delle risposte..

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,463
    Nel ciclo in cui assegni

    i=k

    k aumenta sempre di più e ti ritrovi il valore di i assegnato al vettore cifra[] molto più grande di 8 che è il suo massimo allocato ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Nel ciclo in cui assegni

    i=k

    k aumenta sempre di più e ti ritrovi il valore di i assegnato al vettore cifra[] molto più grande di 8 che è il suo massimo allocato ...
    Grazie!!Il problema era proprio quello ...ma come fa questo problema ad essere collegato a quello del main che ti avevo detto?

    Ad ogni modo grazie della risposta,come sempre gentilissimo.
    EDIT:
    P.s
    Qualora a qualcuno interessasse ho risolto dichiarando una variabile chiamata "terminatore"...ad ogni ciclo do la inizializzo a 0 mentre all'interno del ciclo for la faccio incrementare di 1...successivamente faccio
    codice:
    cifra[terminatore]='\0'

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,463
    Originariamente inviato da Marco1995
    ma come fa questo problema ad essere collegato a quello del main
    Con il problema dell'indice tu andavi a scrivere oltre l'area allocata con la malloc e la free si accorge dell'area "sporca"...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Con il problema dell'indice tu andavi a scrivere oltre l'area allocata con la malloc e la free si accorge dell'area "sporca"...
    Ahh..adesso ho capito...grazie mille . .a volte il C/C++ sa essere molto pericoloso. :/

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