Ayuda, declarar cadena(string) con longitud determinada

Started by alicesimu, December 02, 2016, 02:22:01 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

alicesimu

Buenas

Programando... Di por echo que me aceptaría cadenas con longitud máxima determinada por ejemplo
String nombre[7];

Aquí solo puede almacenar 8 caracteres.

La utilidad es para ahorrar memoria RAM y también de fichero de almacenamiento usando fopen...

Pero no lo permite compilar esto :(

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

panreyes

Y...

String nombre[7];

...crea un array unidimensional/vector de 8 strings.

alicesimu

Graciaaasss !! Desconocía el tipo char

Que bien que se permitan string multidimensionales!! Eso me recuerda las tablas
Byte Nombre[3][7] contendría cadenas 4 x 8 caracteres

Drumpi

¡¡CUIDADO!!
Las strings en realidad son un vector de tamaño variable, similar al que haces cuando usas
(char) palabra = alloc (n * sizeof(char));


Pero la diferencia es que su tamaño cambia cada vez que modificas la string, por lo que un array de STRING está desaconsejado, así como su uso en tipos definidos por el usuarios y estructuras (salvo que las declares como último campo, si las declaras al principio o en medio es posible que puedas sufrir desbordamientos de memoria, pero no si están al final, lo he comprobado).
La única forma segura que conozco de usar una lista de STRINGs es crear una lista enlazada de nodos que contengan una única string cada uno.

Si alguien se quiere ahorrar la molestia de tener que programarlo, puede usar el que me hice yo:
http://forum.bennugd.org/index.php?topic=2122.0
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)

alicesimu

solo me interesa declarar un STRING de una longitud determinada. ya probare eso de char....

tambien poderlos usar, con FOPEN, FPUTS,FGETS. es la intencion.

Creia que cuando se declara un dato STRING por default, son 255 caracteres(como lo hacia div2)...

Drumpi

Lo más seguro para longitud determinada son los CHAR, sin ninguna duda. Pero tencuidado con FPUTS y FGETS, no sé si hará conversión implícita a STRING y te lo dejará en tamaño variable (reducirías espacio en el fichero, y puedes leerlo sin ninguna pega, pero no van a tener exactamente el tamaño que tu le digas sino el tamaño del texto mas en terminador de linea, que ya no recuerdo si sólo era el fin de linea solo o también incorporaba el retorno de carro en entornos Windows). Compruébalo por si acaso con un editor hexadecimal.

No estoy seguro, pero creo que DIV tenía 255 caracteres como máximo (o me suena que 300 y pico). Ignoro si también era la memoria usada, si era fija o dinámica.
Lo que sí te aseguro es que Bennu (y Fenix, porque viene de allí) gestiona su tamaño de forma dinámica por lo dicho, que he tenido algun desbordamiento de pila que se ha arreglado al cambiarlo de posición en la declaración de TYPE. Aun así, son MUY útiles.
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)

alicesimu

Gracias por las aclaraciones...

Se puede escribir una cadena con fwrite,fread, como datos binarios(no ASCII)??

Cuando tenga un tiempo haré pruebas, ;)

Drumpi

Emmm, no, porque si usas datos binarios, el valor de cada caracter es su valor ASCII, por lo que cualquier cadena que añadas, bien con FPUTS o con FWRITE, al final, vas a poder leerlo como ASCII en cualquier editor de texto o hexadecimal :D
A menos que uses una codificación propia, todas las cadenas de texto se ven como texto, siempre, en cualquier lenguaje.

Ejemplo: "A" se guarda como un byte de valor 65 (h41). Si lo abres con un editor hexadecimal, aparece con su valor hexadecimal, pero en la columna ASCII se verá la A. Si lo abres con el notepad, también verás una A.
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)

alicesimu

Aaah vale, si eso me lo encontrado en algunos ficheros de datos.

La diferencia del sistema fwrite al fputs, que uno no añade el símbolo de salto de línea, y el otro si.

Bueno, algo así...

Drumpi

FPUTS escribe una cadena y añade el símbolo de fin de linea (y no sé si retorno de carro; tiempo ha, dependiendo de si era versión Windows o Linux lo hacía, creo que ya no, sólo fin de linea Linux style).
FWRITE escribe el contenido de una variable exactamente igual que está en memoria, con el mismo orden, mismo tamaño de bytes y mismo contenido. Nunca he usado FWRITE con una STRING, siempre con bytes, words, ints, algún char, y tipos propios. Alguna vez he metido alguna string en el fichero binario, pero siempre usando FPUTS/FGETS.
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)

alicesimu

Gracias por tu aclaraciones, eso me da confianza.
con gusto empezare a probar ^_^