Taller
>> Taller >> Strings en Fenix by Danko

Puesto que más de uno habrá tenido problemas con el uso de strings en Fénix, he decidido crear un documento explicativo de cómo funcionan, cómo hay que usarlos y qué pueden y no pueden hacer. Empecemos…

En fénix hay dos tipos de cadenas: las de longitud variable y las de longitud fija. Las primeras permiten almacenar textos a nuestro gusto sin estar limitado por un máximo de caracteres y su declaración se realiza mediante string nombrevariable. Las segundas requieren que se indique el número máximo de caracteres que podrá tener el texto, es decir, que en realidad al declararlo lo que hacemos es declarar un array de n caracteres: char nombrevariable[numcaracteres]. También se puede emplear la sintaxis char nombrevariable[]=”texto”. Al hacer esto último se declara un array de tantos elementos como caracteres contenga el texto. En realidad el tipo char equivale a byte, pero posiblemente en futuras versiones del compilador no se permita la declaración de textos con la palabra byte.

El principal problema que confunde a la gente, sobre todo a los que habían programado bajo Div2, es que los strings de fénix no corresponden a los strings de Div. Son, sin embargo, los chars los que realizan la función de los strings de DIV. Es importante saber que si en fénix ponemos string mivar[3] no estamos creando un string de 3 caracteres máximo, sino un array de tres strings de longitud variable (podríamos poner mivar[2]=”este es el elemento dos del array”).

 

Lectura de las cadenas

Para leer el texto contenido en las cadenas solo hay que usar el nombre de la variable, por ejemplo write(0,100,100,0,mivar).

 

Lectura de caracteres individuales

La lectura no lleva consigo ninguna problemática en ninguno de los dos casos:

  • En las cadenas de longitud variable usaremos mivar[n] para leer el carácter que está en la posición n, por ejemplo, sea string mivar=”Mi nombre es Danko”, al usar mivar[1] obtendríamos la i (la primera letra corresponde con el 0). En caso de que la variable que tengamos sea un array de strings (definido como string mivar[4]) y queramos obtener un carácter de una de las cadenas del array usaremos mivar[num cadena][num carácter], como si de un array de dos dimensiones se tratase.
  • En las cadenas de longitud fija usaremos el mismo procedimiento para obtener los caracteres. La única pega es que puesto que las cadenas de tipo char son en realidad arrays de tipo byte, si queremos mostrar la letra en si y no su código asccii usaremos la función chr() que convierte el código ASCII en su equivalente carácter.

Puede parecer un poco difícil de entender a simple vista, pero es muy sencillo. Prueba el siguiente ejemplo:

......PROGRAM pruebas_str;

......PRIVATE
..........string mitexto = "Dinero";     // una cadena de longitud variable
..........char mitexto2[6] = "Juan";     // una cadena de 6 caracteres máx
..........string mitexto3[1] = "Casa", "Coche";     // tres cadenas de longitud variable
..........char mitexto4[1][5] = "Perro", "Marea";     // dos cadenas de 6 caracteres máx cada una

......BEGIN
..........set_mode(m640x480);
..........write(0,10,10,0,"Carácter 2 de mitexto es: " + mitexto[1]);
..........write(0,10,20,0,"Carácter 2 de mitexto2 es: " + chr(mitexto2[1]));
..........write(0,10,30,0,"Carácter 2 de la segunda cadena de mitexto3 es: " + mitexto3[1][1]);
..........write(0,10,40,0,"Carácter 2 de la segunda cadena de mitexto4 es: " + chr(mitexto4[1][1]));
..........LOOP FRAME; END
......END

 

Modificación de las cadenas:

Para modificar una cadena simplemente hay que usar micadena=”texto”. Ten en cuenta que si trabajas con una cadena de longitud fija no deberás sobrepasar el número máximo de caracteres o se producirá un error.

 

Modificación de caracteres individuales:

Esta es la parte que quizá sea más confusa, aunque sabiendo unas pocas cosas evitaremos muchos de los problemas que nos puedan surgir:

  • En las cadenas de longitud fija no es ningún problema la modificación de las letras, tan sólo usaremos mivar[n]=asc(“letra”). Es preciso utilizar asc() para obtener el código ASCII de la letra (justamente lo contrario que chr()).
  • En las cadenas de longitud variable no podemos acceder a los caracteres de igual modo, tendremos que hacer uso de substr y suma de cadenas: cadena=substr(cadena,0,pos-1) + “c” + substr(cadena,pos+1,len(cadena)). La función substr() toma la parte especificada de una cadena y devuelve un string (mirar el manual de referencia). Una vez que te acostumbras no es tan complicado.

 

Algunas consideraciones:

  • En las últimas versiones de Fénix ya se pueden guardar las variables string (las de longitud variable) debido a que se guarda un varspace de 4 bytes que indica la longitud de la cadena (para luego poder recuperarlas). De modo que una cadena de longitud fija (ej mitarray[]=”Casa”) y una cadena string con el mismo contenido no ocuparán lo mismo al guardarlas en un archivo (el string ocuparía 4 bytes más).
  • Las chars son más lentas y consumen más memoria que las cadenas string.
  • En las chars hay, obviamente, un límite de tamaño que no debes sobrepasar. Por motivos de rendimiento, los valores que asignes a estas cadenas no se truncan automáticamente y usar cadenas demasiado grandes puede provocar cuelgues o, aún peor, cambios imprevistos a otras variables en memoria.

FIN. Por favor, perdonen las faltas y si hay algún error comuníquenmelo.

 

 

ALGUNAS FUNCIONES DE CADENA
(como se muestra en la ayuda de Fénix)

find:

Busca una subcadena dentro de una cadena y devuelve la posición de la primera aparición de la subcadena (la primera posición de la cadena es 0). En caso de que la subcadena no exista en la cadena, find() devuelve -1.

int find(string cadena, string buscar)

Parámetros:
cadena: Cadena de texto sobre la que se realizará la búsqueda.
buscar: Texto a buscar.

substr:

Devuelve una sub-cadena, es decir, un fragmento de la cadena que recibe, ubicado entre las posiciones inicio y final, inclusive. Si una de las posiciones indicadas es menor que 0 se considera la posición a partir de la derecha de la cadena, por lo tanto, la posición -1 corresponderá al último carácter, -2 al penúltimo, y así sucesivamente.
Si el inicio es menor que el final se intercambian sus posiciones.
substr() devuelve una cadena nueva, por lo tanto no altera el contenido de la cadena original.

string substr( string cadena, int inicio, int final)

Parámetros:
cadena: Cadena de texto o una variable.
inicio: Número de carácter inicial.
final: Número de carácter final.

len:

Devuelve el número de caracteres de la cadena que se pasa como parámetro.

Int len(string cadena)

Parámetros:
cadena: Cadena de texto o una variable.

lcase:

Devuelve la cadena que se pasa como parámetro con todos los caracteres en minúscula. Para pasar una variable a minúsculas es preciso hacer: variable = lcase(variable); .

string lcase(string cadena)

Parámetros:
cadena: Cadena de texto o una variable.

ucase:

Devuelve la cadena que se pasa como parámetro con todos los caracteres en mayúscula. Para pasar una variable a mayúsculas es preciso hacer: variable = lcase(variable); .

string ucase(string cadena)

Parámetros:
cadena: Cadena de texto o una variable.