Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Drumpi on March 13, 2011, 01:28:36 AM

Title: Caso raro de retorno de funciones
Post by: Drumpi on March 13, 2011, 01:28:36 AM
Hola a todos:

Os planteo un caso misterioso. Os adjunto un código cuya misión es devolver una lista enlazada de nodos con información de los ficheros que hay en una carpeta. El caso es que debería devolverla ordenada y no lo hace.

El fallo lo he localizado y es muy raro, ya que la función STRING_COMPARE (fichero functions/class_string) funciona bien, y asigna al valor de salida lo que tiene que devolver: -1, 0 o 1.
Pero el valor que lee su función padre, FILELIST_GET_ORDERED_LIST (fichero functions/filelist.inc), no es el mismo. Si STRING_COMPARE devuelve -1, el padre recibe 4294967295.

Sin embargo, si camibio la declaración de STRING_COMPARE por:
function int STRING_COMPARE (string sc1, string sc2)
Devuelve el valor correctamente. Es como si por defecto devolviese un unsigned int.

He intentado reproducir el error con el siguiente código:
[code language="bennu"]program test;

global
    int dato;
begin
    dato=devolver();
    say("Se obtuvo el valor "+dato);
end

function devolver()
begin
    return(-1);
end[/code]
Pero no he podido duplicar el error. Sin embargo, con:
[code language="bennu"]program test;

global
    int dato;
begin
    //dato=devolver();
    //say("Se obtuvo el valor "+dato);
    say("Se obtuvo el valor "+devolver());
end

function devolver()
begin
    return(-1);
end[/code]
Sí ha sucedido. O sea, que devuelve un unsigned int, pero si se asigna a un int, el valor se ve correcto.

¿Es un fallo o es que se cambió el valor devuelto por defecto de int a unsigned int y no me he enterado?

He usado la versión r228 para windows, en formato RAR.
Title: Re: Caso raro de retorno de funciones
Post by: SplinterGU on March 13, 2011, 02:03:55 AM
es correcto lo que te pasa, declara bien los tipos de las funciones que retornan valor al escribirlas y listo.
Title: Re: Caso raro de retorno de funciones
Post by: Drumpi on March 13, 2011, 02:12:38 AM
¿Pero entonces es que se ha cambiado el valor devuelto por defecto? Antes era int (con signo).

Aprovecho para preguntar ¿finalmente pueden retornar strings las funciones?
Y otra relacionada con los arrays de string: se que dan problemas, y que se desaconsejan en favor de una lista enlazada con tipos definidos que incluyan una string. Pero ¿qué pasa con funciones como SPLIT?
Title: Re: Caso raro de retorno de funciones
Post by: SplinterGU on March 13, 2011, 02:32:22 AM
no ha cambiado nada, depende tambien de que funcion recoge el parametro, autodeclaraciones, y puede que alguna otra cosa que me olvide.

si, pueden retornar string las funciones, pero debe ser declarada como string.

no entiendo que decis del array de strings y de split...
Title: Re: Caso raro de retorno de funciones
Post by: Drumpi on March 13, 2011, 04:25:07 PM
Pues te digo yo que, por defecto (al menos, desde Fenix) las funciones devuelven enteros en caso de que no se definieste el tipo de salida.

Y respecto a SPLIT, este comando devuelve un array de string (lo que hace es dividir una string en varias según la cadena de separación que se le diga por parámetro), por lo que si los array de strings no funcionan bien, esta función dará muchos problemas ¿no?
De momento ya estoy trabajando en mi propia "clase" de manejo de listas de STRINGs, en cuanto la termine os la subo por si alguien la quiere usar.
Title: Re: Caso raro de retorno de funciones
Post by: SplinterGU on March 13, 2011, 05:04:53 PM
no me has entendido lo que dije, pero nada, devuelven lo mismo que fenix... un int signed si lo recibis en una variable unsigned o como parametro de algo que espera unsigned, sera unsigned.

se bien lo que hace split, solo que no te entendi que decias...

no, los arrays de strings funcionan, salvo que creo que esas strings no se liberaran al morir el proceso...