Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: FreeYourMind on April 05, 2010, 08:42:52 PM

Title: Equivalente a strdel()
Post by: FreeYourMind on April 05, 2010, 08:42:52 PM
Existe una funcion equivalente a la de DIV strdel(cadena, 0, 1) que borra por ejemplo el último caracter de una cadena de texto ?
Title: Re: Equivalente a strdel()
Post by: SplinterGU on April 05, 2010, 09:26:27 PM
proba con

cadena = SUBSTR( cadena, 0, -1)
Title: Re: Equivalente a strdel()
Post by: FreeYourMind on April 05, 2010, 09:36:35 PM
Y ya que estamos, el equivalente a esto:

strdel(cadena1, 0, strlen(cadena2));
Title: Re: Equivalente a strdel()
Post by: SplinterGU on April 05, 2010, 09:42:53 PM
substr(cadena, 0, -strlen(cadena2))
Title: Re: Equivalente a strdel()
Post by: FreeYourMind on April 05, 2010, 09:44:53 PM
Grácias  :D
Title: Re: Equivalente a strdel()
Post by: FreeYourMind on April 05, 2010, 09:55:39 PM
Tengo otro problema, estoy capturando las teclas que presiono, o mejor dicho, escribo en tiempo real en la pantalla las letras que tecleo, pero Bennu en lugar de capturarme la letra me captura el código ascii de la letra, como hacer para que en lugar del código me devuelva la respectiva letra ?



string c0;

IF (scan_code<>0)
c0+=ascii;
name_text=write(0,100,200,3,c0);
END

Title: Re: Equivalente a strdel()
Post by: SplinterGU on April 05, 2010, 10:34:59 PM
el ascii es el codigo de la tecla, pero tenes que considerar ciertas cosas...

1) podes tener el mapeo incorrecto
2) no interpreta mayusculas como tampoco caracteres que surgan de la pulsacion de otra tecla adicional

no se si eso es lo que decias
Title: Re: Equivalente a strdel()
Post by: DCelso on April 05, 2010, 10:46:34 PM
sipo, tu ejemplo muestra 47 en vez de A y así con todas las teclas, eso es debido a que ascii es un int y al sumar a una cadena un int este se convierte en cadena. Tu necesitas insertar a la cadena un char en vez de un int. He intentado hacer castings de int a char pero bennu no me deja así que la solución la he encontrado usando una variable temporal de tipo char.
A ver, prueba este código para ver lo que te digo

PROGRAM capturatecla;

import "mod_screen"
import "mod_key"
import "mod_video"
import "mod_map"
import "mod_text"
import "mod_draw"
import "mod_math"
import "mod_proc"                           
import "mod_say"
import "mod_grproc"

global
string c0;
char value;
end

PROCESS main()
BEGIN
     full_screen=false;
set_mode(320,240,16);
     set_fps(60,0);
   
write_var(0,100,200,3,c0);

loop
         if (key(_esc)) break; end
IF (scan_code<>0)
value = ascii;
c0=c0+value;
END
         frame;
     end
     
     let_me_alone();
     exit(0,0);   
END

quizas sobren imports, puse unos copiados de otro ejemplo.
Title: Re: Equivalente a strdel()
Post by: FreeYourMind on April 05, 2010, 11:07:50 PM
Muchas grácias DCElso, te has ganado un karma, me funciona, sólo hay que poner la variable auxiliar declarada como char:

GLOBAL

char value;

....

BEGIN
....

string c0;

IF (scan_code<>0)
value=ascii;
c0+=value;
name_text=write(0,100,200,3,c0);
END

Title: Re: Equivalente a strdel()
Post by: SplinterGU on April 05, 2010, 11:45:38 PM
perdon, si que reconoce mayusculas y otras teclas con combinacion... no es necesario usar una variable temporal...


import "mod_key"
import "mod_say"
import "mod_video"
import "mod_string"

global
   string s;
   lascii=0;

begin
    while(!key(_ESC))
        if ( lascii != ascii )
            s += chr(ascii);
            lascii = ascii ;
            say ( s );
        end
        frame;
    end
end


Title: Re: Equivalente a strdel()
Post by: DCelso on April 05, 2010, 11:50:15 PM
anda, no me dio por probar chr, está claro que sabe más el diablo por viejo que por pellejo :D
Title: Re: Equivalente a strdel()
Post by: Drumpi on April 06, 2010, 12:23:03 AM
Cachis, he llegado tarde a todo ;D
Ten cuidado con los caracteres <32... o aprovéchalos para borrar, cambiar de cadena/linea, meter tabulaciones...
Title: Re: Equivalente a strdel()
Post by: DCelso on April 06, 2010, 04:54:24 PM
Pero SplinterGU, ¿ por qué no puedo hacer un simple ahormado como este?

s += (char) ascii;

En C/C++/JAVA/C# va canela en rama.
Title: Re: Equivalente a strdel()
Post by: SplinterGU on April 06, 2010, 05:20:12 PM
sera porque "s" es una string?
Title: Re: Equivalente a strdel()
Post by: Drumpi on April 06, 2010, 05:55:02 PM
¿Qué problema hay con

s+=chr(ascii)

siempre que ascii no valga menos de 32?
Title: Re: Equivalente a strdel()
Post by: Windgate on April 06, 2010, 07:37:34 PM
Quote from: Drumpi on April 06, 2010, 05:55:02 PM
¿Qué problema hay con

s+=chr(ascii)

siempre que ascii no valga menos de 32?

Supongo que al pusar una tecla te añadirá varias veces el mismo caracter, una por FRAME, probé una solución así en su día y tuve que meter un "filtro" para evitar interpretar la misma pulsación de tecla.

Lo que he echado siempre en falta en Bennu es una función para obtener una cadena de texto por teclado, una función sencilla, que la invoques y mantenga un proceso leyendo los caracteres que pulsas, de forma "normal" como en C...

Ahora no me digáis que ya hay algo así porque en su día tuve que hacer esa función a mano xD
Title: Re: Equivalente a strdel()
Post by: DCelso on April 06, 2010, 09:06:41 PM
Quote from: SplinterGU on April 06, 2010, 05:20:12 PM
sera porque "s" es una string?
No entendiste. Lo que no va es el casting de un int a char.
Ya se que s es un string, lo que se pretende en el ejemplo es sumar al string un char.
Si ves detenidamente el ejemplo verás que existe una variable valor de tipo char en el que le asignas el int ascii y ya sí te deja sumarlo al string.

global
  char valor;
end
  valor = ascii;
  s+=valor;
Title: Re: Equivalente a strdel()
Post by: SplinterGU on April 06, 2010, 09:13:26 PM
te entendi perfectamente... pero el sumar un char a una string es una excepcion... char es un dato numerico... y la excepcion no esta trasladada al cast...

habria que hacer algo al respecto.
Title: Re: Equivalente a strdel()
Post by: DCelso on April 06, 2010, 09:16:11 PM
va a ser que no , este ejemplo va perfertamente.

PROGRAM capturatecla;

import "mod_string"
import "mod_key"
import "mod_video"
import "mod_map"
import "mod_text"
import "mod_draw"
import "mod_math"
import "mod_proc"                           
import "mod_say"
import "mod_grproc"

global
string c0;
string c1;
string c2;
char value;
end

PROCESS main()
BEGIN
     full_screen=false;
set_mode(320,240,16);
     set_fps(60,0);
   
write_var(0,10,100,3,c0);
write_var(0,10,150,3,c1);
write_var(0,10,200,3,c2);

loop
         if (key(_esc)) break; end
IF (scan_code<>0)
c0=c0 + ascii;
value = ascii;
c1=c1 +  value;
while (scan_code<>0) frame; end

END
         frame;
     end
     
     let_me_alone();
     exit(0,0);   
END

Mientras que este otro no compila

PROGRAM capturatecla;

import "mod_string"
import "mod_key"
import "mod_video"
import "mod_map"
import "mod_text"
import "mod_draw"
import "mod_math"
import "mod_proc"                           
import "mod_say"
import "mod_grproc"

global
string c0;
string c1;
string c2;
char value;
end

PROCESS main()
BEGIN
     full_screen=false;
set_mode(320,240,16);
     set_fps(60,0);
   
write_var(0,10,100,3,c0);
write_var(0,10,150,3,c1);
write_var(0,10,200,3,c2);

loop
         if (key(_esc)) break; end
IF (scan_code<>0)
c0=c0 + ascii;
value = ascii;
c1=c1 +  value;
c2=c2 +  ( (char) ascii);
while (scan_code<>0) frame; end

END
         frame;
     end
     
     let_me_alone();
     exit(0,0);   
END

:D
Title: Re: Equivalente a strdel()
Post by: SplinterGU on April 06, 2010, 09:40:32 PM
y yo que te dije?

has comprobado lo que te dije... la excepcion (en el codigo del compilador) no esta trasladada al casteo.
Title: Re: Equivalente a strdel()
Post by: DCelso on April 06, 2010, 09:45:34 PM
ok, yo entendí que decías que no se podía sumar un char a un string y que estaba ahí el error y en el ejemplo anterior demostré que sí se podía y que el error estaba en el ahormado. No vi ninguna excepción pero si que al compilar veo esto
D:\devBennu\examples\mios\capturatecla\capturatecla.prg:37: error: Unsupported data type cast ("ASCII")
Title: Re: Equivalente a strdel()
Post by: SplinterGU on April 06, 2010, 09:48:56 PM
es lo que te digo... la excepcion es interna al compilador... o sea, una string y un numero por definicion no se pueden sumar... son diferentes tipos de datos... pero el lenguaje permite sumar un char a una string como si fuese una string de 1 caracter... pero esa excepcion no esta correcta en el caso de los casts... hay que meter eso...

se entendio ahora?
Title: Re: Equivalente a strdel()
Post by: DCelso on April 06, 2010, 10:04:53 PM
sipo,gracias por tus explicaciones.