[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