Problemas con printf();

Iniciado por soyloqbuskas, 19 Octubre 2015, 04:36 AM

0 Miembros y 1 Visitante están viendo este tema.

soyloqbuskas

¡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:

void cargaListaPalabras(char* codigo,char* listaPalabras[]){
 
 char palabra[100]="";
 int posPalab=0;
 int posCodigo=0;
 int posListaPalabras=0;
 
 
 printf("codigo: %s\n",codigo);
 
 while(posCodigo<strlen(codigo)){
   while( ((esLetra(codigo[posCodigo])>0) || (esNumero(codigo[posCodigo])>0)) && (codigo[posCodigo]!='\0')){
     //lee letras y numeros hasta formar una palabra
     palabra[posPalab]=codigo[posCodigo];
     posPalab++;
     posCodigo++;
   }
   palabra[posPalab]='\0';                                    //finaliza la palabra
   listaPalabras[posListaPalabras]=palabra;        //guarda palabra en listaPalabra
   printf("%s\n",listaPalabras[posListaPalabras]);   //imprime bien
   posListaPalabras++;
   posPalab=0;
     
   while( (esLetra(codigo[posCodigo])==0) && (codigo[posCodigo]!='\0') ){
     //lee caracteres (comillas, puntos, coma) para guardarlos como una palabra individualmente
     palabra[posPalab]=codigo[posCodigo];
     palabra[posPalab+1]='\0';
     posCodigo++;
     posPalab=0;
     listaPalabras[posListaPalabras]=palabra;   //guarda el caracter en listaPalabras
     printf("%s\n",listaPalabras[posListaPalabras]);   //imprime bien
     posListaPalabras++;
   }

 }
 listaPalabras[posListaPalabras]="@fin@";  //palabra de fin de codigo.
 printf("%s\n",listaPalabras[posListaPalabras]);   //imprime bien
}


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...


  char* listaPalabras[1000000];
  int posListaPalabras=0;  

 cargaListaPalabras(codigoTraductor,listaPalabras);
 
 while(strcmp(listaPalabras[posListaPalabras],"@fin@")!=0){
   
   printf("%s\n",listaPalabras[posListaPalabras]);   //imprime mal....
   posListaPalabras++;
   
 }


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

Gracias por las respuestas.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

Seyro97

Tendrías que poner en vez de 'char palabra[100]="";', 'static char palabra[100]="";'
Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!

do-while

#2
¡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:

listaPalabras[posListaPalabras]=palabra;


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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

soyloqbuskas

#3
Gracias por la ayuda, pero no me funciona...incluso lo del strcpy...

probe a sustituir:
CitarlistaPalabras[posListaPalabras]=palabra;
por esto:
Citarstrncpy(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: for(i=0;i<longListaPalabras;i++) { listaPalabras[i]=""; }  y compila pero tampoco funciona....

no se porque strncpy() me da fallo de segmentacion...¿Alguna idea?
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

soyloqbuskas

#4
vaaaaaleeee!!! ya di con la solucion. Tenia que utilizar el strncpy() e inicializar listaPalabras con un calloc()

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

muchas gracias a todos por la ayuda!
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw