Problemas programando en c bajo linux

BRaDoLH

Buenas,
Llevo dos dias con este programa y no consigo sacar el error.
El programa compilandolo en windows con turbo C funciona a la perfección, en linux... todo lo contrario.

El programa es el juego del 21 de las cartas (ningun jugador puede pasar de 21)

Aquí el código:
http://pastebin.es/1887

El problema creo que está en el paso de valores a las funciones, o en el almacenamiento de las propias variables del main..
Un ejemplo..
La variable jugada_turno aveces pasa -1232323 sin sentido o la variable numero_jugadores se pone en 0 cuando esta inicializada a 2... por arte de magia vamos..
Esto es lo que he podido deducir después de hacer miles de debuggs con ddd.
Repito que en windows funciona a la perfección..

Explico el programa por si os interesa.

La función conseguir_carta hace un random de 1 a 13 y devuelve un entero.

La funcion asignar_carta, asigna el número anterior a una jugada de un jugador en concreto.Ej:Jugada 1 jugador 0 = 8.

La funión operaciones_matematicas solo controla que ningun jugador se pase de 21 y cuando alguno lo haga devuelva el numero de jugador que lo ha echo para asi en el main ponerle en el array plantado[numero_jugador] un 1 para asi saber que este jugador no juega más.

La función acabar comprueba que todos los jugadores del array plantado esten a 1, si lo están devuelve resultado=1 y acaba el programa..

Si algun me echa una mano se lo agradecería mucho

gF

He estado leyendo el código y he visto cosas que me parece que no son correctas. Por ejemplo la variable jugada_turno no se pone a 1 cuando pasas a un nuevo jugador si no que hace siempre jugada_turno++, con lo cual puede tomar cualquier valor y por tanto en las funciones en las que pasas esa variable y la utilizan para acceder a posiciones de memoria, estas accediendo a posiciones de memoria que no son correctos. Por ejemplo en la funcion "asignar_carta" haces "jugadas[jugada_turno-1][jugador].numero=11;" si jugada_turno vale por ejemplo 15 ya la has cagao pq reservaste espacio para 10...

Otra cosa que me he fijado es que no controlas que una carta pueda repetirse, simplemente generas al azar el nº y el palo. Así es posible que la misma carta le salga varias veces al mismo jugador, lo cual no lo veo correcto.

En cuanto al estilo de programacion, veo cosas que no me gustan, por ejemplo pasas la variable "struct baraja jugadas[10][5]" a diferentes funciones y la recibes como "struct baraja jugadas[][5]" ?¿? pq?¿ no es mas facil "struct baraja **jugadas" ?¿?¿

#
int conseguir_carta()
#
{
#
int carta=0;
#
carta = rand() % 13+1;
#
return carta;
#
}

no seria mejor:

#
int conseguir_carta()
#
{
return rand() % 13+1;

}

En fin no me creo que el programa te funcione en windows mas que nada por el primer error que te comenté, el valor de jugada_turno se incrementa sin cesar.

Esto es lo que he visto leyendomelo por encima, ni siquiera lo he compilado, es posible que haya mas errores.

BRaDoLH

Bueno lo primero gracias en molestarte en mirar el código,

A ver te intento explicar , ya que es bastante difícil pero bueno lo intento.

jugada_turno en teoría nunca pasara de 10, porque?
pues porque tendrían que juntarse todos los planetas para que en todos los rands de 1 a 13 saliese 2..
En operaciones_matemáticas controlo que ningún jugador supere los 21, y claro por cada jugada_turno mínimo son 2, si lo multiplicas por 10, son 20.. no se si me explico..

Lo de las cartas, tienes razón, se repiten, pero es que nuestro profesor nos lo dijo así, que había muchas barajas por lo cual se podían repetir cartas.

y lo de el struct pues la verdad que seguro que tienes razón pero este es mi segundo año programando y es como me lo enseñaron. pero mersi por la aportación.

También decir que esto es solo una parte del programa, no esta acabado ni mucho menos, pero como tú mismo podrás comprobar , si lo compilas en windows funciona perfectamente, es fallo exclusivo de linux.

He estado investigando un poco más .. lo que pasa es lo siguiente,

llamo a la funcion asignar_Carta

asignar_carta(jugadas,carta,jugador,jugada_turno);

y cuando vuelve , aveces lo hace bien y otras veces todas las variables,arrays vienen con basura, esto no tiene sentido..

BRaDoLH

Más o menos esto es lo que pasa..

Llamo a esta función y le digo que antes que acabe imprima el resultado, lo hace bien. pero cuando vuelve al main le digo que imprima lo mismo y tachán! basura en todas las variables. raro verdad?

int asignar_carta(struct baraja jugadas[][5],int carta,int jugador,int jugada_turno)
{
int numero_palo=0;
char palos[4][2]={"C","P","B","T"};
char letras[4][2]={"A","Q","J","K"};
char juntar[3]="";
numero_palo=rand() % 4;
if(carta==1)
{
jugadas[jugada_turno-1][jugador].numero=11;
strcat(juntar,letras[0]);
strcat(juntar,palos[numero_palo]);
strcpy(jugadas[jugada_turno-1][jugador].jugada,juntar);
}
else
{
if(carta>10 && carta<14)
{
jugadas[jugada_turno-1][jugador].numero=10;
strcat(juntar,letras[carta-10]);
strcat(juntar,palos[numero_palo]);
strcpy(jugadas[jugada_turno-1][jugador].jugada,juntar);
}
else
{
if(carta>1 && carta<=10)
{
jugadas[jugada_turno-1][jugador].numero=carta;
sprintf(juntar,"%i",jugadas[jugada_turno-1][jugador].numero);
strcat(juntar,palos[numero_palo]);
strcpy(jugadas[jugada_turno-1][jugador].jugada,juntar);
}
}
}
printf("Numero de carta ANTES %i\n",jugadas[jugada_turno-1][jugador].numero); --> 9 por ejemplo
printf("JUGADA TURNO ANTES %i \n",jugada_turno); --> 2
printf("CARTA ANTES%i\n",carta); --> 9
}

main()

asignar_carta(jugadas,carta,jugador,jugada_turno);
printf("JUGADA TURNO DESPUES %i \n",jugada_turno); --> -3432423424234
printf("CARTA DESPUES%i\n",carta); --> -12123123 o aveces 0
printf("Numero de carta DESPUES de devolver %i\n",jugadas[jugada_turno-1][jugador].numero); --> -12312312

Ahora creo que queda más claro..

MTX_Anubis

Si tienes basura en las variables es porque la función no está modificando las variables, así de simple xD

en C++ deberías de pasar los argumentos de la función por referencia (int& carta, por ejemplo), lo que estás haciendo es pasarle una copia de su valor, no la variable en sí. Creo que en C sería lo mismo, sino busca un tutorial xD

Por último, usad los debuggers y dejar eso de imprimir resultados xD.

BRaDoLH

Todas las variables están inicializadas a 0 o a su respectivo número, es más tengo una funcion que limpia la basura de las arrays y las inicializa a "" o 0 segun su tipo, lo que pasa es que ahí he puesto un resumen del código.
como ya dije lo he debuggeado miles de veces, de ahí he llegado a la conclusión que he puesto arriba, y si según tú las funciones no modifican las variables entonces deberian conservar el mismo valor.

Creo que lo mejor será hacerlo con ficheros.

MTX_Anubis

Cierto, es verdad, es que no me había fijado que lo habías puesto en pastebin, ya me parecía raro xD Además carta y demás no se tienen que modificar

Pues no sé tío, si el ubuntu no se me quedara petado a los 5 min de usarlo, lo probaría a ver xD

BRaDoLH

Ya lo encontré!

char=juntar[3]=""; --> char=juntar[4]="";

if(carta>1 && carta<=10)
{ jugadas[jugada_turno-1][jugador].numero=carta; sprintf(juntar,"%i",jugadas[jugada_turno-1][jugador].numero);
strcat(juntar,palos[numero_palo]); strcpy(jugadas[jugada_turno-1][jugador].jugada,juntar);

                    }

Cuando por rand salía un 10 ,el sprintf llenava las 4 posiciones, no se porque, pero es así, entonces al concatenar con palos, se volvia todo loco. Aumentando juntar a 4 posiciones todo va correctamente.
lo raro es que en windows no hace falta hacer esto.
Me quedao con dudas pero bueno, ya está solucionado,.

Usuarios habituales

  • BRaDoLH
  • MTX_Anubis
  • gF