Holas, me podríais contar, aunque sea un poquillo, de que va el :
ERROR: Runtime error in PROC_RUEDA(65539) - Mnemonic 0xAD0 not implemented
Me salta en el códico cuando uso cos() o sin(), he hecho varias pruebas hasta dar con que el código sólo corre cuando elimino estás funciones.
Las uso así, no le veo a la línea nada de raro, así que no se que pasa. x=coche4ruedas[n_coche]._id.x+(cos(angulocoche)*x0);
Con la línea así no hay problema. x=coche4ruedas[n_coche]._id.x+x0;
En un principio pense que pisaba algo de memoria, pero para nada me lo parece, la x es la variable local del proceso.
Luego que tal vez alguna incompatibilidad entre operaciones float y byte (byte x0), pero al cambiarlo y poniendo int x0 me ocurre lo mismo.
ya me fijo que puede ser... gracias!
podes poner todos los tipos de cada variable?
Curioso bug si.. haber si se descubre la causa, sin y cos con de las imprescindibles.
Quote from: SplinterGU on June 05, 2013, 01:56:37 AM
podes poner todos los tipos de cada variable?
Te comento ahora sin problema :)
globalstruct coche4ruedas[0]
struct rueda[3]
byte x0,y0; //centro de gravedad de la rueda
int _id; //identificador de la rueda
end
byte x0,y0; //centro de gravedad del coche
int _id; //identificador del coche
endprocess proc_rueda(byte n_coche,byte x0,byte y0
)
privateint angulocoche;
begin angulocoche=coche4ruedas[n_coche]._id.angle;
x=coche4ruedas[n_coche]._id.x+(cos(angulocoche)*x0);
y=coche4ruedas[n_coche]._id.y+(sin(angulocoche)*y0);
....
end
lo revisare, se que significa el opcode, pero me extraña que se genere eso.
supongo que estas con la ultima version, cierto?
gracias.
Versión 21 de Noviembre de 2012, supongo que es la última. Por cierto, estoy usando la IDE de bennupack que viene el notepad++ adaptado, no se si tendrá algo que ver, aunque creo que no.
Soy el único que tiene este problema :( ?
He estado haciendo diferentes pruebas y he visto que solo falla cuando haces una operación con arrays. Curiosamente con una variable, que pertenece a un proceso, no falla.
UHHHHHHHHHHHHHHHLALAAAAAAAAAA. Tenía el array como un conjunto de bytes, al cambiarlo a integer ya no me salta el error ¿?
Por curiosidad ¿qué módulo matemático estás usando? ¿mod_math o mod_mathi?
Es posible que tengas problemas por usar mod_math, cuyas funciones trigonométricas usan floats. Mod_mathi funciona como se hacía antes, con enteros. A ver si es un bug de conversión de datos.
Sólo por probar.
Si, uso el mod_math, no conozco el mathi XD. Pues tiene toda la pinta, desde que me di cuenta de que cambiando los datos por los que opera por integer, ya no salta ese error.
me podes mandar el programita por mail, asi lo reviso en algun momento? me olvide completamente de esto... disculpas.
No tengo tu correo Splinter :-[ . Dejo el código aquí, ok?
import "mod_grproc"
import "mod_key"
import "mod_map"
import "mod_math"
import "mod_proc"
import "mod_say"
import "mod_video"
GLOBAL
int fpg_sprites;
struct coche4ruedas[0]
struct rueda[3]
byte x0,y0;
int _id;
end
byte x0,y0; //centro de gravedad
int _id;
end
BEGIN
set_mode(640,480,32,MODE_FULLSCREEN);
set_fps(60,0);
fpg_sprites=load_fpg("FPG\sprites.fpg");
coche4ruedas[0]._id=proc_coche(0,320,240);
repeat
frame;
until(key(_esc))
let_me_alone();
exit("",0);
END
/////////////////////
PROCESS proc_coche(byte n,x,y);
BEGIN
file=fpg_sprites;
graph=1;
coche4ruedas[0].rueda[0].x0=12;
coche4ruedas[0].rueda[0].y0=0;
coche4ruedas[0].rueda[1].x0=12;
coche4ruedas[0].rueda[1].y0=30;
coche4ruedas[0].rueda[2].x0=37;
coche4ruedas[0].rueda[2].y0=0;
coche4ruedas[0].rueda[3].x0=37;
coche4ruedas[0].rueda[3].y0=30;
coche4ruedas[0].x0=25;
coche4ruedas[0].y0=15;
angle=45000;
say("Se ha rellenado la estructura del primer coche");
frame;
crearuedas(4,0);//numero de ruedas a crear, numero del coche al que crear las ruedas
loop
frame;
end
END
////////////////////////
FUNCTION crearuedas(byte numruedasacrear,byte numcocheaponerruedas)
PRIVATE
byte turno;
begin
for(turno=0;turno<numruedasacrear;turno++)
coche4ruedas[numcocheaponerruedas].rueda[turno]._id=proc_rueda(numcocheaponerruedas,coche4ruedas[numcocheaponerruedas].rueda[turno].x0,coche4ruedas[numcocheaponerruedas].rueda[turno].y0);
end
END
////////////////////////////////
PROCESS proc_rueda(byte n_coche,byte x0,byte y0)
PRIVATE
angulocoche;
begin
file=fpg_sprites;
graph=2;
say("Se crea el proceso de la rueda");
loop
angulocoche=coche4ruedas[n_coche]._id.angle;
say(angulocoche);
say("Ángulo del coche tomado");
x=coche4ruedas[n_coche]._id.x+(cos(angulocoche)*x0);
say("x calculada");
y=coche4ruedas[n_coche]._id.y+(sin(angulocoche)*y0);
say("se calculan las coordenadas de la rueda");
frame;
end
END
el problema no esta en la estructura, sino en los parametros de la funcion... no estaba soportado pasar de byte a float (necesario para la multiplicacion con COS y SIN).
este codigo tambien falla
import "mod_math";
import "mod_say";
local
float x, y;
byte z;
BEGIN
z = 255;
x = 10.0 * z;
say(x);
END
ya lo solucione, ahora lo commiteo, pero no puedo generar binarios, tengo roto el entorno por culpa de la libpng, hasta no solucionar (genericamente) el tema de la deteccion no puedo generar binarios, si quieres generarlos tu, adelante.
sino, reemplaza los bytes por int en los parametros de la funcion y ahi funcionara.
Perfecto, así haré. De lo demás no se de qué me hablas :(, me centraré en utilizar int y listo.