Título: fallo de segmento por (manipulacion de ) char* Publicado por: eduardosufan en 10 Junio 2013, 02:16 am hola a todos, estoy haciendo una funcion en c que recibe un nombre de un archivo del tipo "nombre archivo. numero de red", por ejemplo:
matriz.0 Esto que indica que matriz tiene asociado un codigo, por ejemplo el numero 1, y el 0 es el numero de red. Es decir que debo generar un codigo numerico con ese 1 y 0 y devolverlos en un int. La funcion, esta bien codificada y funciona si la utilizo por separado en otro programa en c, pero luego de añadirlo al programa principal he notado que la manipulacion de cadenas char* genera el fallo. Debido a que si comento las 3 lineas en la funcion: nombrearchivo = strtok( cadena, "." ); red = strtok( NULL, "." ); codigored=atoi(red); El segmentation fault desaparece. He probado asignar memoria e inicializar todas las variables pero el error persiste, alguien puede ayudarme asi encuentro el error? muchas gracias. El siguiente es el codigo de la funcion en c: int generasubPalabra(char* nombre) // recibe el nombre del archivo y devuelve el codigo de archivo, para ser incluido en la palabra { char *nombrearchivo=NULL; //nombre de archivo a ser cargado int codigoarchivo=0; //codigo del archivo char *red=NULL; //char con la red, a ser casteado int codigored=0; //entero final con el codigo de red int subpalabra=1; //palabra retornada de 12 bits (3 datos hexa) //allocar memoria a los char* nombrearchivo = (char*) malloc (sizeof(char)*50); //se alloca para 50 caracteres, es decir que el nombre del //archivo no puede superar ese numero red = (char*) malloc (sizeof(char)*4); char cadena[strlen(nombre)+1]; strcpy(cadena, nombre); //se copia el nombre en cadena para ser manipulada sin modificar la ruta //ACA ESTA EL ERROR: alguna de las 3 funciones, o las 3, genera una violacion de segmento //romper cadena en nombre - nro de red //Primera llamada => Primer token (primer elemento hasta el punto, es el nombre del archivo) nombrearchivo = strtok( cadena, "." ); printf( "nombre del archivo %s\n", nombrearchivo ); //Segunda llamada => Segundo token (segundo elemento, desde el punto, es el nro de red) red = strtok( NULL, "." ); printf( "numero de red %s\n", red ); codigored=atoi(red); //obtengo el entero correspodiente a la red (cast) printf( "codigo de red %d\n", codigored ); //con la siguiente secuencia se traduce el string contenido en nombrearchivo, al codigo correspondiente para la palabra //no se puede hacer con case en c if (strcmp(nombrearchivo,"matriz_incidencia")==0) { codigoarchivo=1; } else if (strcmp(nombrearchivo,"matriz_brazos_inhibidores")==0) { codigoarchivo=2; } else if (strcmp(nombrearchivo,"matriz_prioridades_red")==0) { codigoarchivo=3; } else if (strcmp(nombrearchivo,"matriz_relacion_disparos_distribuidos")==0) { codigoarchivo=4; } else if (strcmp(nombrearchivo,"matriz_prioridades_disparos_distribuidos")==0) { codigoarchivo=5; } else if (strcmp(nombrearchivo,"vector_marcado_inicial")==0) { codigoarchivo=6; } else if (strcmp(nombrearchivo,"vector_cotas_plazas")==0) { codigoarchivo=7; } else if (strcmp(nombrearchivo,"vector_transiciones_automaticas")==0) { codigoarchivo=8; } else if (strcmp(nombrearchivo,"vector_transiciones_noinformadas")==0) { codigoarchivo=9; } else if (strcmp(nombrearchivo,"vector_mascara_interrupciones")==0) { codigoarchivo=10; } else if (strcmp(nombrearchivo,"vector_cola_entrada")==0) { codigoarchivo=11; } else if (strcmp(nombrearchivo,"vector_consulta_disparo_especifico")==0) { codigoarchivo=12; } else if (strcmp(nombrearchivo,"vector_consulta_plaza")==0) { codigoarchivo=13; } else { codigoarchivo=31; //se retorna el ultimo valor posible (5bits =11111) printf("No existe el archivo, verifique ubicacion y permisos \n"); } printf( "codigo de archivo %d\n", codigoarchivo ); //se concatena en los 5 bits mas significativos la red, y en los siguientes 5 bits mas significativos el codigo de archivo subpalabra = 0x000; subpalabra+= 0x080*codigored; //red subpalabra+= 0x004*codigoarchivo; //codigo de archivo printf("la subpalabra generada es: %x\n", subpalabra); return subpalabra; } Título: Re: fallo de segmento por (manipulacion de ) char* Publicado por: leosansan en 10 Junio 2013, 06:14 am Prueba con este formato:
Salida: Código
Código: Código
Saluditos! .... .. (http://st.forocoches.com/foro/images/smilies/aaaaa.gif) Título: Re: fallo de segmento por (manipulacion de ) char* Publicado por: eduardosufan en 10 Junio 2013, 16:20 pm hola, he añadido tu codigo pero da segmentation fault apenas ingresa a la funcion.
Necesito obtener por separado, el nombre del archivo para obtener el codigo y el numero que sigue al punto, para obtener el codigo de red tu respuesta no separa, sino que usa la variable pch para ello. no puedo utilizar la siguiente linea: char cadena[] ="matriz.0"; debido a que el nombre del archivo viene como parametro a la funcion, como char *nombre. lo que hice es lo siguiente: char *pch; strcpy(cadena, nombre); pch = strtok (cadena,"."); // luego de esta sentencia deberia poner los if else anidados y obtener el //codigo de red while (pch != NULL ) { printf ("%s ",pch); pch = strtok (NULL, "."); codigored=atoi(pch); } Título: Re: fallo de segmento por (manipulacion de ) char* Publicado por: leosansan en 10 Junio 2013, 17:09 pm Creo haberte entendido mejor esta vez. Buscas una salida como:
Código
Donde se pasa a una función matriz.0 y la función debe separarla en dos. ¿O.K?. Si es como digo el código que me hace lo anterior es: Código
Espero te sirva de algo esta vez y si no machaca nos con tus dudas. ;) Saluditos! .... ..(http://st.forocoches.com/foro/images/smilies/bonk.gif) Título: Re: fallo de segmento por (manipulacion de ) char* Publicado por: eduardosufan en 11 Junio 2013, 19:23 pm porque para tomar el siguiente token se hace strtok (NULL, "."); ??
es decir, el siguiente token (y ultimo) es el numero de red por otro lado, como hago para ver si el nombre del archivo que viene a la funcion, contiene el /0 al final? me dijeron que ese puede ser un problema Título: Re: fallo de segmento por (manipulacion de ) char* Publicado por: leosansan en 12 Junio 2013, 07:27 am porque para tomar el siguiente token se hace strtok (NULL, "."); ?? es decir, el siguiente token (y ultimo) es el numero de red Porque la siguiente cadena estará entre el "." y el final de la cadena, alias NULL. por otro lado, como hago para ver si el nombre del archivo que viene a la funcion, contiene el /0 al final? me dijeron que ese puede ser un problema ¡Manda tela la preguntita!. Una forma de asegurarse el nulo al final es inicializando la cadena a cero, es decir: *cadena ={0}, o bien cadena[256]={0}. Saluditos! .... (http://st.forocoches.com/foro/images/smilies/aaaaa.gif) |