Existe una funcion equivalente a la de DIV strdel(cadena, 0, 1) que borra por ejemplo el último caracter de una cadena de texto ?
proba con
cadena = SUBSTR( cadena, 0, -1)
Y ya que estamos, el equivalente a esto:
strdel(cadena1, 0, strlen(cadena2));
substr(cadena, 0, -strlen(cadena2))
Grácias :D
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
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
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.
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
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
anda, no me dio por probar chr, está claro que sabe más el diablo por viejo que por pellejo :D
Cachis, he llegado tarde a todo ;D
Ten cuidado con los caracteres <32... o aprovéchalos para borrar, cambiar de cadena/linea, meter tabulaciones...
Pero SplinterGU, ¿ por qué no puedo hacer un simple ahormado como este?
s += (char) ascii;
En C/C++/JAVA/C# va canela en rama.
sera porque "s" es una string?
¿Qué problema hay con
s+=chr(ascii)
siempre que ascii no valga menos de 32?
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
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;
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.
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
y yo que te dije?
has comprobado lo que te dije... la excepcion (en el codigo del compilador) no esta trasladada al casteo.
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")
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?
sipo,gracias por tus explicaciones.