Caso raro de retorno de funciones

Started by Drumpi, March 13, 2011, 01:28:36 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

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

es correcto lo que te pasa, declara bien los tipos de las funciones que retornan valor al escribirlas y listo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

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

Drumpi

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