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.
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.
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
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.
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
nunca se pudo, partiendo del hecho de que el stack es muy chico en bennugd y lo mismo en fenix.
Entonces puede ser que lo que recuerde es haber retornado punteros de esta forma?:
mytipo pointer function ()
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.
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?
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.
Vaaaaale, que no hay una variable referenciando a una clase.
(Aunque a eso en mi pueblo es un puntero, apunta ;D).
no es un puntero... que tu lo quieras ver como tal es otra cosa, pero no lo es...
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.
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.
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.
Quote from: Mr Matsusaka on April 25, 2011, 06:37:35 AM
Por ejemplo,
static int ms_iArrayInts [];
Es un array de punteros en si.
En el momento que hacemos lo siguente:
ms_iArrayInts = new int [4];
Estamos creando 4 ints en memoria y asignando sus posiciones al array.
eso no significa ni son punteros, olvidate de lo que haga internamente, porque si pensamos en lo interno, entonces todos los lenguajes tienen punteros e incluso todos los lenguajes usan y tienen GOTO.
uno debe y puede decir que un lenguaje tiene o cual caracteristica si la tiene de cara al usuario, y que este pueda hacer uso de esta caracteristica con todas sus propiedades libremente.
A mi me llaman Drumpi por aquí, Carlos en casa, pero sigo siendo un hombre :D
Lo de los arrays es un caso raro: más que array de punteros es un puntero a un tipo sin un espacio de memoria reservado (al menos, su equivalente en C). Se le puede asignar en cualquier momento un tamaño, y a partir de ahí es inamovible (aunque pensándolo bién, yo lo he hecho en C).
Pero si el array tiene dos dimensiones, ahí sí que entramos en terremo más allá de lo desconocido, porque entonces sí que es un array a punteros, y cada puntero puede generar un array o vector de un tamaño distinto. En C se pueden declarar arrays de 3x2, de 5x8 y de 9x4, y todas las filas tienen el mismo número de columnas, pero en Java, podemos tener un array de 5 posiciones, en las que la posición 1 tenga 3 valores, la 2 tener 5, la 3 tener 9... ;D
Vamos, como los array de strings de Bennu, pero sin problemas, y con un tamaño fijo una vez definido :D :D :D
Ya lo dije, java tiene un tratamiento de la memoria muy raro, todo es memoria dinámica y sin embargo no tiene sintaxis de punteros ;D
que un array no es un puntero...
insisten en confundir como internamente se maneja a lo que el dato es en si.
si nos ponemos asi, entonces podemos afirmar que todo lo que se guarde internamente en memoria es un puntero, y eso es un gran error, porque ahi todo, incluso cada variable de cualquier tipo se guarda en memoria... deberian entender que lo que haga un lenguaje internamente a Uds no les importa, lo que le debe importar a un programador es la parte visible y controlable, y en base a esa parte visible y controlable se puede decir que tiene y que no tiene.
si alguien me muestra que puedo acceder a cuaquier area de memoria o puedo con una variable recorrer las areas de memoria de otra variable (no solo el contenido), entonces ahi pueden decir que tiene punteros.
repito, java no tiene punteros.
e insisto, el caracteristica de que java no tiene punteros, si bien es un limitante en cuanto a potencia, es uno de sus fuertes en cuanto a estabilidad, que puede ocasionar una mala programacion de un usuario descuidado.
A ver a ver, que nadie dice que un array sea un puntero. Lo que digo (al menos yo) es que "los arrays en Java son arrays de punteros"
Recuerdas el primer ejemplo que te he dado?
Si copiamos un array A a un array B, y luego cambiamos algun dato del array B tambien sera automaticamente cambiado en A.
Porque? Porque tanto A como B son arrays de punteros que señalan una parte de la memoria que el interprete de Java se encarga de gestionar el mismo.
Puede que no le definamos el signo * a los arrays al declararlos, pero si se comportan como punteros y se usan como punteros, pues son punteros.
Por cierto Dumpi, los arrays en Java (como buenos arrays de punteros que son) si pueden cambiar de tamaño si les hacemos un new o si les asignamos otro array, aunque eso desechara toda la informacion antigua, claro esta.
Para entender bien los arrays en Java veanse este link:
http://pages.cs.wisc.edu/~cs368-1/JavaTutorial/NOTES/Java_vs.html