[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