Devolver tipo creado por mi.

Started by Drumpi, April 20, 2011, 12:54:55 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:

Pues nada, aprovechando que en las clases estoy viendo C con mayor libertad que en la universidad, haciendo las "barbaridades" que no me dejaban hacer, como pasar arrays, estructuras y diversos punteros a "cosas raras", he querido probar a devolver una variable de un tipo definido por mi en Bennu. Supuestamente se puede hacer pero por alguna razón el compilador se me queja.

He creado este código supersimplificado de lo que estoy haciendo:

[code language="bennu"]program open_save_test;

type map_systeminfo
    string dir_file;
    string dir_name;
    string name;
    int fpg;
    int modificado;
    int map_error;
end

GLOBAL
    int graficos1;
    int graficos2;
    int graficos3;
    int fuentes1;
    int fuentes2;
   
    string lista_lang;
   
    map_systeminfo mi_mapa;
END


function map_systeminfo system_load_tilemap (int file1, int file2, int file3, int slt_fnt1, int slt_fnt2
                                             string slt_label_list)
private
    map_systeminfo slt_info;
begin
    slt_info.dir_file="It works.";
    slt_info.dir_name="It don't works.";
    slt_info.name= "Barely works?";
    slt_info.fpg=1;
    slt_info.modificado=2;
    slt_info.map_error=3;
   
    return slt_info;
end

BEGIN
    full_screen=false;
    set_mode(800,600,16);
    set_fps(50,0);
   
    mi_mapa=system_load_tilemap(graficos1,graficos2,graficos3,fuentes1,fuentes1,lista_lang);
   
    write(0,0,0,0,mi_mapa.dir_file);
    write(0,0,10,0,mi_mapa.dir_name);
    write(0,0,20,0,mi_mapa.name);
    write(0,0,30,0,mi_mapa.fpg);
    write(0,0,40,0,mi_mapa.modificado);
    write(0,0,50,0,mi_mapa.map_error);
   
    while (!key(_esc)) frame; end
   
    let_me_alone();
    delete_text(all_text);
   
END[/code]

Sin embargo, con mi versión actual de Bennu, al compilar me suelta lo siguiente:

return_type.prg:45: error: Struct required, found ")"

En la linea donde asigno el valor a "mi_mapa". Sin embargo, si suprimo la asignación, dejando sólo la llamada a "system_load_tilemap", se ejecuta perfectamente.
¿Veis algún error que yo no vea?

PD: mi versión actual de Bennu es la r228.
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)

SplinterGU

quien te dijo que se pueden devolver tipos definidos por el usuario? no se pueden, al menos no por valor, si puedes devolver punteros a esos tipos de datos, pero el tipo de dato en si, no.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

proba con este codigo, y por favor, pone los imports cuando pongas un ejemplo... :)


program open_save_test;
import "mod_screen";
import "mod_text";
import "mod_key";
import "mod_video";
import "mod_proc";
type map_systeminfo
   string dir_file;
   string dir_name;
   string name;
   int fpg;
   int modificado;
   int map_error;
end

GLOBAL
   int graficos1;
   int graficos2;
   int graficos3;
   int fuentes1;
   int fuentes2;

   string lista_lang;

   map_systeminfo mi_mapa;
END


function system_load_tilemap (int file1, int file2, int file3, int slt_fnt1, int slt_fnt2, string slt_label_list, map_systeminfo *slt_info)
begin
   slt_info.dir_file="It works.";
   slt_info.dir_name="It don't works.";
   slt_info.name= "Barely works?";
   slt_info.fpg=1;
   slt_info.modificado=2;
   slt_info.map_error=3;
end

BEGIN
   full_screen=false;
   set_mode(800,600,16);
   set_fps(50,0);

   system_load_tilemap(graficos1,graficos2,graficos3,fuentes1,fuentes1,lista_lang,&mi_mapa);

   write(0,0,0,0,mi_mapa.dir_file);
   write(0,0,10,0,mi_mapa.dir_name);
   write(0,0,20,0,mi_mapa.name);
   write(0,0,30,0,mi_mapa.fpg);
   write(0,0,40,0,mi_mapa.modificado);
   write(0,0,50,0,mi_mapa.map_error);

   while (!key(_esc)) frame; end

   let_me_alone();
   delete_text(all_text);

END

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Pensaba que poniendo el tipo antes del nombre de la función se podía devolver cualquier cosa.

Pues nada, si no se puede, volveremos a los punteros, no problem (es más, en este programa rizo el rizo y uso punteros a punteros :D).

Muchas gracias. Aprovecho para darte uno de los karmas que te debo ;)

PD: perdón por los includes, estoy acostumbrado a usar el bgdc.import, y para este tipo de pruebas uso uno universal. El original es más específico, pero aun así tiene imports que no se usan en este código.
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)

JaViS

Es mi memoria que esta fallando o es un feature que en algun momento si duncionaba?

si mal  no recuerdo, yo podia devolver tipos definidos por el usuario con mis funciones, o al menos recuerdo haber declarado funciones que devolvian tipos definidos por mi, aunque quizas estaba trabajando con punteros. La verdad es q hace mucho que no toco nada de esto
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

nunca se pudo, partiendo del hecho de que el stack es muy chico en bennugd y lo mismo en fenix.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

Entonces puede ser que lo que recuerde es haber retornado punteros de esta forma?:


mytipo pointer function ()


Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

Quote from: JaViS on April 21, 2011, 12:51:15 PM
Entonces puede ser que lo que recuerde es haber retornado punteros de esta forma?:


mytipo pointer function ()




eso es posible.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Siempre y cuando el contenido haya sido creado con alloc ¿no? porque si el puntero señala a una variable privada o pública, al acabar el proceso/función, dicho espacio de memoria se libera ¿o es como java y detecta que hay un puntero señalando y la mantiene?
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)

SplinterGU

Quote from: Drumpi on April 22, 2011, 05:02:33 PM
Siempre y cuando el contenido haya sido creado con alloc ¿no? porque si el puntero señala a una variable privada o pública, al acabar el proceso/función, dicho espacio de memoria se libera ¿o es como java y detecta que hay un puntero señalando y la mantiene?

claro, creado con alloc...

y nuevamente, java no tiene puntero.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Vaaaaale, que no hay una variable referenciando a una clase.

(Aunque a eso en mi pueblo es un puntero, apunta ;D).
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)

SplinterGU

no es un puntero... que tu lo quieras ver como tal es otra cosa, pero no lo es...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Mr Matsusaka

En Java en determinadas ocasiones las variables son tratadas internamente como punteros.

Por ejemplo, si asignamos un array de datos no constante a otro array vacio, este ultimo se convertira un array de punteros, y no copiara realmente los datos del primer array. Para que los datos sean duplicados se deben copiar los datos uno a uno con un for o utilizar la funcion arraycopy.

Aun con todo en su sintaxis Java no tiene punteros, con lo que en este caso creo que Splinter esta un poquito mas cerca de tener razon, aunque Drumpi tambien tiene su punto.

SplinterGU

Quote from: Mr Matsusaka on April 24, 2011, 08:14:20 PM
En Java en determinadas ocasiones las variables son tratadas internamente como punteros.

Por ejemplo, si asignamos un array de datos no constante a otro array vacio, este ultimo se convertira un array de punteros, y no copiara realmente los datos del primer array. Para que los datos sean duplicados se deben copiar los datos uno a uno con un for o utilizar la funcion arraycopy.

Aun con todo en su sintaxis Java no tiene punteros, con lo que en este caso creo que Splinter esta un poquito mas cerca de tener razon, aunque Drumpi tambien tiene su punto.

estas seguro de eso? y que pasa si modificas uno de los valores en el nuevo array copiado? se modifica tambien en el original? dudo mucho eso, y eso si asi fuera podes decir que es un puntero... no confundas reutilizar los datos con punteros, eso no son punteros. Pero incluso si asi fuera, que internamente use punteros (cosa que no pongo en duda) no significa que el lenguaje tenga punteros, lo que ofrece de cara al usuario es lo que se dice que tiene.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Mr Matsusaka

Quote from: SplinterGU on April 25, 2011, 05:04:16 AM
estas seguro de eso? y que pasa si modificas uno de los valores en el nuevo array copiado? se modifica tambien en el original? dudo mucho eso, y eso si asi fuera podes decir que es un puntero...

Pues si, si alteras cualquier dato del segundo array se modifica el original tambien, te lo digo por experiencia. Por eso existe la funcion arraycopy, para duplicar en memoria el array.

Por otra parte te voy a dar un dato sorprendente:
Cualquier array vacio que definas en Java, es por naturaleza un array de pointers.

Por ejemplo,
[code language="bennu" options="singleline"]static int ms_iArrayInts [];[/code]

Es un array de punteros en si.
En el momento que hacemos lo siguente:

[code language="bennu" options="singleline"]ms_iArrayInts = new int [4];[/code]

Estamos creando 4 ints en memoria y asignando sus posiciones al array.

Quote from: SplinterGU on April 25, 2011, 05:04:16 AMPero incluso si asi fuera, que internamente use punteros (cosa que no pongo en duda) no significa que el lenguaje tenga punteros, lo que ofrece de cara al usuario es lo que se dice que tiene.

Claro, en sintaxis Java no tiene punteros. En eso tienes toda la razon.