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;
}
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;
}