[C con Clase] [Bulk] problema con punteros

ZeLion Zelion_cracking en yahoo.es
Vie Nov 2 08:36:12 CET 2007


Hola Ariel.
Acabo de llegar al trabajo, y no tengo mucho tiempo de ver tu codigo ahora,
pero asi por encima e visto un posible problema a tu codigo.

En la parte:

>/*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*));		<== Aqui
estas asignando memoria dinamica para solo 4Bytes que forman el puntero.

Suele dar lugar a confusion el operador sizeof en este aspecto ya que he
visto muchos problemas similares.

Si te das cuenta todos los punteros en 32bits son 4bytes o sea un int,
aunque ese puntero apunte a un carácter siempre un puntero es de 32Bits.

Luego vuelves a reasignar memoria del mismo modo:
word = realloc(word, sizeof(char*)*(i-offset +1)); <== reasignas otra vez
4Bytes

Eso es lo mimo que si haces:
Sizeof(int);	
Ya que los punteros son enteros que contienen una direccion de memoria.

Entonces, debes de tener en cuenta que para saber el tamaño de char* con una
cadena debes de hacerlo con la funcion strlen(), del mismo modo que lo haces
en la linea:
int cantChar = strlen(stringCad);

por ejemplo:
char* word = (char*) malloc(lenght(variable));


Haber si solventando estos casos se corrige el error, y si no esta tarde le
hecho una ojeada con mas tiempo al codigo.

Un saludo.


.: ZeLion :.
>-----Mensaje original-----
>De: cconclase-bounces en listas.conclase.net [mailto:cconclase-
>bounces en listas.conclase.net] En nombre de Ariel Romero
>Enviado el: jueves, 01 de noviembre de 2007 14:50
>Para: cconclase en listas.conclase.net
>Asunto: [Bulk] [C con Clase] problema con punteros
>
>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
>
>_______________________________________________
>Lista de correo Cconclase Cconclase en listas.conclase.net
>http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ





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