hola, mi pregunta es cómo le hago para usar una variable local de una estructura de un tipo de dato declarado por mi al definir los parámetros que recibirá un proceso, más concretamente quiero que lo siguiente funcione (o al menos algo parecido).
[code language="bennu"]import "mod_say"
type mio;
int x9,y9,z9;
end
local
mio mix;
begin
it(5,mix);
frame;
say(son.mix.x9);
end
process it(int a, mio mix);
begin
mix.x9=3;
frame;
end[/code]
Si no funciona así como lo pones puedes probar a renombrar el parámetro, por ejemplo llamarlo mix_recibido.
Justo después del BEGIN haces:
mix = mix_recibido;
O asignas campo a campo para evitar problemas, ya que una struct se asigna como puntero, no como dato.
A ver si te sirve...
Si el valor dentro del proceso, al cambiar debe afectar a la estructura es mejor pasarlo como puntero.
si no afecta al orginal solo pasalo como mio.x9 cuando llamas al proceso...
import "mod_say"
type mio;
int x9,y9,z9;
end
local
mio mix;
begin
//caso que la variacion del parametro afecte a la estructura
it(5,&mix.x9);
//caso que la variacion del parametro no afecte a la estructura
it(5,mix.x9);
frame;
say(son.mix.x9);
end
process it(int a, int mix);
begin
mix=3;
frame;
end
process it2(int a,pointer int mix);
begin
*(mix) =3;
frame;
end
Es más o menos como dice Rein.
Tal como lo has hecho has pasado a IT una copia de los datos, es decir, los datos de la variable mix del proceso main se han copiado en la variable mix del proceso IT.
Por eso, si modificas los datos de la variable MIX de IT no afectan a los del MAIN porque SON DOS VARIABLES DISTINTAS.
Por eso, para modificar los datos debes:
-O pasar la estructura como puntero, como bien indica Rein.
-O modificar la variable del padre a través de FATHER, aprovechando que MIX es local (legible desde otros procesos:
process it(int a, mio mix);
begin
father.mix.x9=3;
frame;
end
ehm mi problema es que el código anterior no compila. me dice que mix no es del tipo correcto... aunque quizá como puntero se solucione... intentaré, gracias a todos :)
Prg, creo que el problema con tu código es que pones un parámetro llamado mix y ya hay una LOCAL con ese nombre, por eso te decía lo de cambiar el nombre del parámetro y asignarlo después, me pasó algo así con mi juego de droides.
Pero no debería dar problemas, porque estás asignando unos datos a una variable del proceso, igual que si pones en la declaracion de datos de entrada X, Y, o GRAPH.
Prueba quitando el tipo de mix, a lo mejor es que el compilador se confunde y cree que estás creando una nuva variable (y habría que mirarlo).
Por cierto, he mirado el código y, a menos que lo hayas modificado, está bien, debía tener la cabeza embotada, como estaba programando una lista enlazada... :P
Yo quitaría el ; del final de la linea del process.
QuotePrueba quitando el tipo de mix, a lo mejor es que el compilador se confunde y cree que estás creando una nuva variable (y habría que mirarlo).
creo que eso pasa, como dice windgate, si hago
[code language="bennu"]import "mod_say"
type mio;
int x9,y9,z9;
end
local
mio mix;
begin
mix.y9=5;
it(5,mix);
frame;
say(son.mix.x9);
say(son.mix.y9);
end
process it(int a, mio mix2);
begin
mix=mix2;
mix.x9=3;
frame;
end[/code]
en la consola sale:
Quote> Executing: C:\Program Files (x86)\ConTEXT\ConExec.exe "C:\BennuGD\bin\bgdi.exe" ejemplo
3
5
> Execution finished.
pero sinceramente no me gusta la idea de tener las estructuras dos veces y solo vaciar para luego dejar sin usarse...
prueba esto
import "mod_say"
type mio;
int x9,y9,z9;
end
local
mio mix;
begin
it(5,mix);
frame;
say(son.mix.x9);
end
process it(int a, mix)
begin
mix.x9=3;
frame;
end
Quote from: DCelso on February 15, 2010, 12:13:09 AM
prueba esto
import "mod_say"
type mio;
int x9,y9,z9;
end
local
mio mix;
begin
it(5,mix);
frame;
say(son.mix.x9);
end
process it(int a, mix)
begin
mix.x9=3;
frame;
end
lo anterior me arroja:
Quote> Executing: C:\Program Files (x86)\ConTEXT\ConExec.exe "C:\BennuGD\bin\bgdc.exe" "C:\Users\Orlando\Desktop\ejemplo.prg"
BGDC 1.0.0 (Jan 18 2010 05:02:47)
Copyright © 2006-2009 SplinterGU (Fenix/BennuGD)
Copyright © 2002-2006 Fenix Team (Fenix)
Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix)
Bennu Game Development comes with ABSOLUTELY NO WARRANTY;
see COPYING for details
C:\Users\Orlando\Desktop\ejemplo.prg:14: error: Parameter type invalid ("MIX")
> Execution finished.
cierto, veo que no se puede...
lo que deberia pensar es si es correcto o no.
un test con la variable x tampoco va.
Me da a mi la impresión que no se puede acceder desde el exterior a las variables "local" de un proceso (es decir, no funcionan con las public). Que alguien lo confirme.
program uso_local;
import "mod_say"
local
it id_it1;
it id_it2;
end
process it(int a, x)
begin
x=3;
frame;
end
process main()
begin
id_it1=it(5,2);
frame;
say(id_it1.x);
end
BGDC 1.0.0 (Oct 16 2009 22:00:31)
Copyright ® 2006-2009 SplinterGU (Fenix/BennuGD)
Copyright ® 2002-2006 Fenix Team (Fenix)
Copyright ® 1999-2002 JosÚ Luis Cebrißn Pag³e (Fenix)
Bennu Game Development comes with ABSOLUTELY NO WARRANTY;
see COPYING for details
C:\devBennu\examples\mios\uso_local.prg:19: error: Unknown identifier ("X")
y... si no incluis el modulo de video no vas a poder acceder a x, sin declararla como local (o publica).
Quote from: Windgate on February 14, 2010, 08:08:06 PM
Prg, creo que el problema con tu código es que pones un parámetro llamado mix y ya hay una LOCAL con ese nombre, por eso te decía lo de cambiar el nombre del parámetro y asignarlo después, me pasó algo así con mi juego de droides.
eso se me paso por alto XD
trabaje directamente sobre el codigo en el foro :P
QuotePor eso, para modificar los datos debes:
-O pasar la estructura como puntero, como bien indica Rein.
-O modificar la variable del padre a través de FATHER, aprovechando que MIX es local (legible desde otros procesos:
process it(int a, mio mix);
begin
father.mix.x9=3;
frame;
end
me queda una duda, si la variables es local porque no accederla directamente asi:
process it(int a);
begin
father.mix.x9=3;
frame;
end
el padre del proceso la tiene, no si es solo esa la que se va a modificar, para que pasarla por parametro??
cuidado, si se puede hacer con variables simples, pero no con estructuras...
supongo que esta bien que no se puede hacer asi, ya que al pasar una estructura por parametro se pasa como si fuera un puntero, pero dentro la variable es un dato no puntero...
hay que probar que pasa si la variable local es un puntero a una estructura, si lo permite pasar o no.
ups
No se, estoy intentando recordar, pero creo que en algún código sí que he podido pasar datos de un tipo definido por copia. Ahora mismo sólo se me vienen a la cabeza códigos en los que paso punteros a variables de tipos definidos, a ver si de casualidad encuentro alguno.
Ahora estoy con el proyecto y tengo la cabeza ida :P
olvidate por copia de estructuras no se puede, eso te lo aseguro...
lo que pasa es que si la estructura no es local, hace a los punteros apuntar a la misma pocisión
[code language="bennu"]import "mod_say"
type mio;
int x9,y9,z9;
end
local
mio mix;
end
begin
mix.y9=8;
say(mix);
it(mix);
frame;
say(son.mix.x9);
end
process it(mio max);
begin
say(max);
mix=max;
say(mix);
mix.x9=3;
say(mix.y9);
frame;
end[/code]
Quote> Executing: C:\Program Files (x86)\ConTEXT\ConExec.exe "C:\BennuGD\bin\bgdi.exe" ejemplo
0055D684
0055D684
021908AC
8
3
> Execution finished.
un ejemplo un tanto extraño pero comprensible
[code language="bennu"]
import "mod_say"
type mio;
int x9,y9,z9;
end
declare process it(mio mix,int a);
end
local
mio mix;
begin
mix.y9=8;
it(mix,5);
frame;
say(son.mix.x9);
end
process it( mio mix,int a)
begin
mix.x9=3;
say(mix.y9);
frame;
end[/code]
Quote> Executing: C:\Program Files (x86)\ConTEXT\ConExec.exe "C:\BennuGD\bin\bgdi.exe" ejemplo
8
0
> Execution finished.
el problema es cuando es local. aqui observamos que la mio en la que recibimos el parametro si se reciben los datos de la funcion que invoca (es el 8 que sale por consola), pero cuando queremos acceder desde otra funcion, la variable local esta vacia (el 0 que se imprime).
Bueno, con punteros quedaría así:
[code language="bennu"]import "mod_say"
type mio;
int x9,y9,z9;
end
local
mio mix;
end
begin
mix.y9=8;
it(&mix);
frame;
say(son.mix.x9);
end
process it(mio *max);
begin
mix=max;
mix.x9=3;
say(mix.y9);
frame;
end[/code]
Quote> Executing: C:\Program Files (x86)\ConTEXT\ConExec.exe "C:\BennuGD\bin\bgdi.exe" ejemplo
8
3
> Execution finished.
y asi si funciona.. creo que me quedare con esta opción. mejor tener un 3 punteros de memoria extra a 9 floats que solo se vacian y luego se dejan de usar :)
no tiene nada que ver con ser local o no... tiene que ver con el pasaje de parametros...
Quote from: SplinterGU on February 16, 2010, 06:48:46 AM
no tiene nada que ver con ser local o no... tiene que ver con el pasaje de parametros...
¿Pasaje? XD me ha recordado a una calle peatonal que une a otras dos calles XD.
pasaje, no se como explicarlo en español de españa...
"paso de parámetros" sería, la reconcha de la lora :D
sipo, si entenderlo lo entendí :D, simplemente fue una anotacion, un tanto en cuanto un poco est..pida, pero anotación al fin y al cabo :(
además, tu uso de la palabra corresponde con la primera acepción de la palabra en la rae :), osea que es correctísima en el español de españa, aunque yo no la he oído ni usado nunca para esto :D.
http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=pasaje
1. m. Acción de pasar de una parte a otra.
por el comentario pense que estaba hablando en otro idioma...