Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: soyloqbuskas en 19 Octubre 2015, 04:36 am



Título: Problemas con printf();
Publicado por: soyloqbuskas en 19 Octubre 2015, 04:36 am
¡Buenas a todos!

Estoy haciendo un pequeño "compilador". Lo que debe hacer es traducir de mi lenguaje a lenguaje C para linux. El caso es que al cargar las palabras en un arrayList de char* lo carga bien dentro de la funcion cargaListaPalabras(codigoTraductor,listaPalabras); e imprime correctamente las palabras de listaPalabras, pero cuando  intento imprimir las palabras de listaPalabras fuera de cargaListaPalabras(); no imprime nada....

Este es el codigo de cargaListaPalabras que funciona correctamente:
Código
  1. void cargaListaPalabras(char* codigo,char* listaPalabras[]){
  2.  
  3.  char palabra[100]="";
  4.  int posPalab=0;
  5.  int posCodigo=0;
  6.  int posListaPalabras=0;
  7.  
  8.  
  9.  printf("codigo: %s\n",codigo);
  10.  
  11.  while(posCodigo<strlen(codigo)){
  12.    while( ((esLetra(codigo[posCodigo])>0) || (esNumero(codigo[posCodigo])>0)) && (codigo[posCodigo]!='\0')){
  13.      //lee letras y numeros hasta formar una palabra
  14.      palabra[posPalab]=codigo[posCodigo];
  15.      posPalab++;
  16.      posCodigo++;
  17.    }
  18.    palabra[posPalab]='\0';                                    //finaliza la palabra
  19.    listaPalabras[posListaPalabras]=palabra;        //guarda palabra en listaPalabra
  20.    printf("%s\n",listaPalabras[posListaPalabras]);   //imprime bien
  21.    posListaPalabras++;
  22.    posPalab=0;
  23.  
  24.    while( (esLetra(codigo[posCodigo])==0) && (codigo[posCodigo]!='\0') ){
  25.      //lee caracteres (comillas, puntos, coma) para guardarlos como una palabra individualmente
  26.      palabra[posPalab]=codigo[posCodigo];
  27.      palabra[posPalab+1]='\0';
  28.      posCodigo++;
  29.      posPalab=0;
  30.      listaPalabras[posListaPalabras]=palabra;   //guarda el caracter en listaPalabras
  31.      printf("%s\n",listaPalabras[posListaPalabras]);   //imprime bien
  32.      posListaPalabras++;
  33.    }
  34.  
  35.  }
  36.  listaPalabras[posListaPalabras]="@fin@";  //palabra de fin de codigo.
  37.  printf("%s\n",listaPalabras[posListaPalabras]);   //imprime bien
  38. }
  39.  

Los printf() de la funcion anterior imprimen el codigo correctamente. Pero cuando en la funcion main() escribo lo siguiente y no funciona el printf() y saca un salto de linea por palabra...

Código
  1.   char* listaPalabras[1000000];
  2.   int posListaPalabras=0;  
  3.  
  4.  cargaListaPalabras(codigoTraductor,listaPalabras);
  5.  
  6.  while(strcmp(listaPalabras[posListaPalabras],"@fin@")!=0){
  7.  
  8.    printf("%s\n",listaPalabras[posListaPalabras]);   //imprime mal....
  9.    posListaPalabras++;
  10.  
  11.  }
  12.  

¿porque el printf() del bucle while() no me imprime lo mismo que los printf() de la funcion cargaListaPalabras()?

Gracias por las respuestas.


Título: Re: Problemas con printf();
Publicado por: Seyro97 en 19 Octubre 2015, 05:53 am
Tendrías que poner en vez de 'char palabra[100]="";', 'static char palabra[100]="";'


Título: Re: Problemas con printf();
Publicado por: do-while en 19 Octubre 2015, 11:58 am
¡Buenas!

Aunque declares la variable palabra como static no vas a conseguir que listaPalabras contenga ningún dato últil fuera de la funcion. Tu error está en la línea de código 19:
Código
  1. listaPalabras[posListaPalabras]=palabra;
  2.  

Lo que estás haciendo con esta sentencia es asignar la dirección de memoria de palabra a una de las palabras que quieres almacenar en la lista (es una asignación entre punteros), es decir, todas las palabras están apuntando a la misma variable. Si quieres almacenar el contenido de la cadena y no su dirección de memoria tienes dos opciones:

1. Asignar una longitud de forma estática a cada elemento de listaPalabras en el momento en el que la declaras.
2. Si no has hecho lo anterior listaPalabras solo será un vector de punteros, así que tendrás que asignar la memoria necesaria para almacenar la cadena de caracteres de forma dinámica dentro de propia función cargarListaPalabras.

Una vez que sepamos que cada una de los elementos de listaPalabras tiene memoria suficiente para almacenar las cadenas tendrás que hacer un strcpy o strncpy (si has declarado la cantidad de memoria de cada una de las cadenas en el momento de la declaración te recomiendo ésta segunda función para asegurarte de que no vas a sobrepasar el límite establecido) para almacenar el contenido de la variable palabra en la posición que corresponda dentro de listaPalabras.

Si vas a asignar la memoria dinámicamente asegurate de liberarla antes de que la variable que corresponde se con listaPalabras en la lista de parámetros salga de su ámbito.

¡Saludos!

Por cierto, cometes el mismo error en las líneas 30 y 36.

¡Saludos!


Título: Re: Problemas con printf();
Publicado por: soyloqbuskas en 20 Octubre 2015, 00:22 am
Gracias por la ayuda, pero no me funciona...incluso lo del strcpy...

probe a sustituir:
Citar
listaPalabras[posListaPalabras]=palabra;
por esto:
Citar
strncpy(listaPalabras[posListaPalabras],palabra,strlen(palabra));

Y esto compila de maravilla pero cuando ejecuto el programa me da fallo de segmentacion...

listaPalabras la tengo declarada asi: char* listaPalabras[1000000];
y palabra la tengo declarada asi: char palabra[100]="";

He probado a inicializar listaPalabras con un bucle:
Código
  1. for(i=0;i<longListaPalabras;i++) { listaPalabras[i]=""; }
  y compila pero tampoco funciona....

no se porque strncpy() me da fallo de segmentacion...¿Alguna idea?


Título: Re: Problemas con printf();
Publicado por: soyloqbuskas en 20 Octubre 2015, 00:57 am
vaaaaaleeee!!! ya di con la solucion. Tenia que utilizar el strncpy() e inicializar listaPalabras con un calloc()

forma correcta de inicializarlo:
Código
  1. for(i=0;i<longListaPalabras;i++) { listaPalabras[i]=(char*)calloc(100,1); }

muchas gracias a todos por la ayuda!