usar local de un tipo de dato definido por mí como parámetro de un proceso

Started by Prg, February 14, 2010, 05:24:23 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Prg

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]
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

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...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Rein (K´)ah Al-Ghul

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

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Drumpi

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
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Prg

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 :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

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.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Prg

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...
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

DCelso

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


Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Prg

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.
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

cierto, veo que no se puede...

lo que deberia pensar es si es correcto o no.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

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")
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

y... si no incluis el modulo de video no vas a poder acceder a x, sin declararla como local (o publica).
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Rein (K´)ah Al-Ghul

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

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2