[C con Clase] problema con punteros

Ariel Romero aromero en cenatav.co.cu
Jue Nov 1 14:50:17 CET 2007


Hola a todos:
Tengo un problema que llevo tiempo por resolverlo, tiene que ver con la 
memoria.
Estoy trabajando con eclipse sobre windows usando cywin, estoy haciendo 
un ejercicio de la escuela que es un programa en ansi C que analiza 
textos y saca los terminos del texto por cada fichero y debe encontrar 
por cada fichero la todas las secuencias de palabras de dos, pero el 
problema es que estoy analizando una base de datos de 200 textos cada 
uno como promedio tiene 200 palabras es decir tengo 200*200 =40 000 
palabras en total, cuando analizo este texto con mi programa para 
encontrar los terminos de cada fichero y por cada fichero encontrar 
todas las secuencias pares: por ejemplo en un texto que diga "brasil va 
a la copa" las secuencias pares serian "brasil va" "va a" "a la" "la 
copa" cuando corro el programa que me hace esto me da un 
error:"2208_cygtls::handle_exceptions: Exception: =
STATUS_ACCESS_VIOLATION" he tenido cuidado en liberar cada memoria que 
reservo pero no sé que ocurre, todo lo almaceno en memoria tengo una 
lista enlazada para los ficheros que cada elemento tiene una estructura
con el nombre del fichero, los terminos de ese fichero en una lista 
enlazada y sus pares de palabras tambien en una lista enlazada.

Si algunos de ustedes me puede ayudar y darme un norte de lo que puede 
estar ocurriendo se lo agradecería.
Aqui les pongo algunas de las funciones:

/*Devuelve un puntero a la lista enlazada con los terminos de
    *una cadena separados por cualquiera de los caracteres invalidos:
    *espacio,nueva linea,retorno ...
    */
    Element* getOrderedTermsFromStringCad(char* stringCad){
        int cantChar = strlen(stringCad);
        int i;
        char* word = (char*) malloc(sizeof(char*));
        word[0]=0;
        char str2[2];
        str2[1] = '\0';
        Element *head = NULL;
       
        int offset = 0;
        for (i = 0; i < cantChar; ++i) {
            if (isCharacterValid(stringCad[i])!=0){
                str2[0]= stringCad[i];               
                word = realloc(word, sizeof(char*)*(i-offset +1));
                strcat(word, str2);
                }
            else {
                offset = i;
                if ((strlen(word)>0)){
                   
                    if (isStopWord(word)==0){
                        head = addElement(head,strdup(word));
                        }
                    word = (char*)calloc(1,sizeof(char));
                    word[0]='\0';//Hay que inicializarlo para concatenar 
bien
                    }
                }
            }
        if (strlen(word)!=0){
            if (isStopWord(word)==0){
                head = addElement(head,strdup(word));
                }
            }
        //free(word);
        return head;
        }


/*
* Devuelve la cadena de texto completa de un fichero para analizarla
*/
    char* getStringCadFromFile(char* fileName){
        FILE *fp1;
        char line[BUFSIZ];
        char *c, *stringCad;       
        fp1 = fopen(fileName, "r");
        if (fp1 == NULL){
            perror("Error al abrir el archivo \n");
            exit (EXIT_FAILURE);
            }       
        stringCad = malloc(sizeof(char*));
        stringCad[0]=0;
        do{           
            c = fgets(line, BUFSIZ, fp1); /* Obtiene una linea del 
archivo */
            if (c != NULL){
                stringCad = realloc(stringCad, 
((sizeof(char*))*(strlen(line)+strlen(stringCad)+1)));
                //Antes le restaba 1 en vez de sumarselo
                strcat(stringCad, line);               
                }
            } while (c != NULL);
        fclose(fp1);   
        return stringCad;
        }

    char* stringToLowerCase(char* string){
        //char* result = (char *) calloc(strlen(string)+1, sizeof(char));
        int max = strlen(string);
        int i;
        for (i = 0; i < max; ++i) {
            string[i] = tolower(string[i]);           
        }
        //free(string);
        return string;   
    }
   
    /* Devuelve 1 si es sotpword 0 si no lo es*/
    int isStopWord(char* word){       
        if (headStopwords!=NULL){
            Element *cursorStopWords = headStopwords;
            while(cursorStopWords){
                if (strcmp(cursorStopWords->val,strdup(word))==0){
                   
                    return 1;
                }
                cursorStopWords = cursorStopWords->next;           
            }
        }
        return 0;//0 es que no es stopword
    }
   
    //Valida si un caracter además de ser alfanumerico es ñ o tiene 
tilde no importa si es mayúscula o minuscula
    // por terminar
    int isCharacterValid(int c){       
        char validLetters[14] = "ñáéíóúàèìòù";
        int max = strlen(validLetters);       
        int i;
        for (i = 0; i < max; ++i) {
            if (c==tolower(validLetters[i])){
                //printf("%c \n",c);
                return 1;
            }                           
        }
        return isalnum(c);
    }



    void processFile(char* filename){           
        char* cad = getStringCadFromFile(filename);//char* cad = 
strdup(getStringCadFromFile(filename));
        cad = stringToLowerCase(cad);
        Element* item = getOrderedTermsFromStringCad(cad);
        printf("%s:  ", filename);
        addTermsToDistinctTermsOfAllDocs(item);
        Sequence* sequence = getPairsFromSeparateTerms(item);
        showSequencesWithSpace(sequence);       
        printf("\n");
        headFileDocs = addFiledocsWithPairsSecuences(headFileDocs, 
sequence, filename);
        //free(cad); da error en este caso
    }
   
    void loadFilesFromDirectory(char* directory){
        DIR *dip;
        struct dirent   *dit;
       
        if ((dip = opendir(directory)) == NULL){
            perror("loadFilesFromDirectory");
            }       

        while ((dit = readdir(dip)) != NULL){
            if 
((strcmp(dit->d_name,".")!=0)&&(strcmp(dit->d_name,"..")!=0)){
                char* filename = (char*) calloc((strlen(directory) + 
strlen(dit->d_name)+1),(sizeof(char)));//(char*) 
malloc((strlen(directory) + strlen(dit->d_name)+1)* (sizeof(char)));  
//malloc(sizeof(directory) + sizeof(dit->d_name));
                sprintf(filename,"%s/%s",directory,dit->d_name);
                processFile(filename);
                //free(filename);
                }
            }
               
        if (closedir(dip) == -1){
            perror("closedir");
            }
    }




Salu2




Más información sobre la lista de distribución Cconclase