PDA

Ver la versión completa : wave vuelvo a ser pesado, ayuda con codigo



(_=*ZaXeR*=_)
16/07/2004, 00:57
Hola wave tengo un problemilla desde hace un tiempo con este codigo, ab que puedes hacer:

char sprite[256];
char *sprite;
--------codigo-------
if (Flag_anda==0){gp_str_func.strcpy(sprite,"tranquilo");}
else{gp_str_func.strcpy(sprite,"anda");}
--------codigo-------
GpTransBlt(NULL,&gpDraw[nflip],x,y,58,51,(unsigned char*)sprite,frame*58,0,116,51,0xFF);
--------codigo-------

Bien el tema es que quiero que se muestre en pantalla un sprite u otro dependiendo del estado, si no uso gp_str_func.strcpy el codigo funciona perfectamente, osea que solo me falla al usar la funcion, pensaba que podia ser overflow por algun motivo extraño que afectaba a la gp32 virtual, por lo que cambie la declaracion de la variable sprite, pero el problema persiste y no se si el tema es por el IDE o que. Puedes darme una solucion o un trozo de codigo que funcione?

PD: la funcion GpTransBlt() los valores de los tamaños de los sprite logicamente cambian tambien segun el sprite que saquemos por pantalla aunque no lo haya especificado, osea que por ahi no va el tema.

Un saludo

Locke
16/07/2004, 01:18
No se si te vale mi ayuda o tiene que ser wave especificamente :D

En teoria el fallo que yo veo es que declaras dos variables iguales con el mismo nombre. Al declarar un vector en realidad lo que haces es reservar la memoria necesaria y obtener un puntero al primer elemento de ese vector.

Prueba a quitar la segunda linea del codigo ( char *sprite; ) a ver que tal.

Espero que sea ese el fallo :)

oankali
16/07/2004, 06:26
Lo extraño de este código es que el compilador no se queje, como mínimo con un warning ya que declaras sprite de dos maneras diferentes aunque en los dos casos acabes obteniendo un puntero.
Lo que pasa es que con sprite[256] declaras un puntero a una zona de memória de 256 bytes, mientras que con *sprite declaras un puntero y punto, no apunta a nada.
Supongo que el compilador debe de guardar la primera declaración que encuentra en el código.

Pero no entiendo bien tu código.
En la primera sección, lo lógico es utilizar la declaración sprite[256].
En la segunda sección, es más bien la declaración *sprite que está más acertada, siempre y cuando inicialices *sprite para que apunte a un bitmap.

Si me baso solo en lo que has puesto y prescindiendo de las declaraciones, lo que haces es meter texto en la cadena sprite, luego le pides a GpTransBlt() que te pinte el bitmap apuntado por el puntero sprite. Como que sprite en ese momento apunta a una cadena de carácteres, pues que no me extraña que no funcione.

Oankali.

(_=*ZaXeR*=_)
16/07/2004, 15:40
Vamos a ver, yo no uso las dos declaraciones de variables, uso unicamente una, pero he puesto las dos para que veais como las declaro y que ambas me fallan.

Vamos que os olvideis del tema del puntero.

Locke
16/07/2004, 19:11
Bueno, voy a probar suerte de nuevo, y asi de paso subo el tema a ver si lo ve alguien con un poco mas de idea :)

Si usas la primera declaracion (como vector) no deberia darte ningun problema siempre y cuando no te pases de la longitud que has asignado.

char sprite[256];
...
...
strcpy (sprite, "cadena");
...
...

Si utilizas la segunda declaracion, primero tienes que reservar la memoria necesaria.
Puedes hacerlo de dos maneras, la primera es con un numero constante de caracteres:

char *sprite;
...
...
sprite = malloc (256 * sizeof (char));
strcpy (sprite, "cadena");
...
...

La segunda manera es reservar solamente el numero de caracteres que necesites en cada momento:

char *sprite;
...
...
sprite = malloc ( (strlen ("cadena") + 1 ) * sizeof (char));
strcpy (sprite, "cadena");
...
...

Tienes que reservar siempre un espacio mas para incluir el /0, caracter de terminacion de cadena, que es un fallo muy comun olvidarlo. En este segundo caso cuando quieras asignar una nueva longitud a la cadena tendras que usar la funcion realloc ().

No se si habra maneras mas sencillas de hacerlo, porque eso se va aprendiendo a medida que tiras lineas y yo tampoco tengo demasiadas a mis espaldas...

De todas maneras, si estas seguro de que el fallo es ahi, haz un mini programa de prueba solo con esas lineas y un printf ("%s", sprite); a ver si te funciona. El tema esta en aislar el fallo.

La funcion GpTransBlt (...) no se que parametros recive ni para que sirve, asi que no te puedo ayudar en eso, de todas maneras supongo que el septimo argumento sera el nombre de algun archivo, porque si no no me explico para que tanto lio...

Y si puedes copiar el error que te da... eso suele ayudar mucho.

Un saludo, y lo siento por el rollazo, pero es que me aburro xD

(_=*ZaXeR*=_)
17/07/2004, 10:09
Bueno voy a explicarme un poco mejor porque creo que no ta la cosa mu clara con lo que he escrito. El problema no se encuentra en el codigo, esta todo perfecto, tanto cuando uso char *sprite, como cuando uso char sprite [256], el problema se encuentra en que el visual c++ cuando compila y me muestra la GP32virtual que ejecuta el codigo, cuando lo abro me muestra los sprites mal, y como es una animacion, cuando los frames van avanzando, llega un punto en el que da un error y se cierra, mostrandome la tipica pantalla de windows xp que te informa del error y te pregunta si quieres enviar el mismo para comunicarselo a microsoft.

En resumidas cuentas, el codigo que he puesto no es el que tengo escrito, porque como vereis no coincide mucho no solo en la declaracion sino en los parametros de GpTransBlt(), solo lo he puesto para que sepais que es lo que quiero hacer, y lo he explicado un poquito con el tema de que quiero que cambie el sprite con el estado y tal. Basicamente todo esto es una explicacion para que me deis una solucion equivalente a lo que quiero hacer o que me deis algo funcional, no para que corrijais ese codigo porque no se corresponde con la realidad. Es probable que solucione el tema con un arbol, puesto que tengo que hacer unas cuantas de cosas mas como IA y asi de paso aprobecho.

(_=*ZaXeR*=_)
17/07/2004, 16:16
Tema solucionado, no hace falta codigo, ya lo he apañado, lo que no entiendo es como antes me sacaba algo en pantalla, el sprite deformado, porque por lo que he podido ver no deberia.

Gracias por la ayuda.

oankali
19/07/2004, 06:13
Lo que te hemos puesto te ha servido de alguna cosa, o no tenía nada que ver?

(_=*ZaXeR*=_)
20/07/2004, 17:06
Si me baso solo en lo que has puesto y prescindiendo de las declaraciones, lo que haces es meter texto en la cadena sprite, luego le pides a GpTransBlt() que te pinte el bitmap apuntado por el puntero sprite. Como que sprite en ese momento apunta a una cadena de carácteres, pues que no me extraña que no funcione.

Mas o menos iba por ahi la cosa, mire todo el codigo que tenia, la funcion que estaba en un .h y el main, y me di cuenta que la funcion no recibia lo que necesitaba como decias, pero yo estaba convencido de que si puesto que me mostraba un sprite en pantalla deformado, osea que creia que el codigo estaba bien, pero no. Creo que lo de sacar el sprite debe de ser porque mostraba el contenido de la direccion de memoria que tenia el puntero que le pasaba a la funcion desde el main, y al no estar reservado el espacio de memoria limitado, me sacaba todo lo que habia desde ese punto hacia delante y daba la casualidad que ahi habia algun sprite, que es la unica explicacion que le puedo dar.