Lista de cadenas de texto

Started by Hola, October 23, 2011, 12:46:01 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Hola

Hola, uso fenix, y queria preguntar, se puede guardar una lista de cadenas de texto en un archivo y luego cargarlas nuevamente?
Probe con fputs y fgets, pero fgets solo me lee una linea, yo necesito que me cargue toda la lista que he grabado. Alguna idea?

Rein (K´)ah Al-Ghul

y si con cada gets extraes una linea de texto de tu lista??
osea haces tantos gets como elementos tenga tu cadena...

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

KeoH

si solo necesitas guardar en un archivo una cadena de texto puedes hacerlo asi:


global
    string mi_cadena[2]=("Texto a guardar celosamente 1","y texto 2", "y un tercero");
end

function guarda_cadena()
begin
      save("archivo.sav", mi_cadena);
end

function carga cadena()
begin
     load("archivo.sav", mi_cadena);
end


Esta es a mi modo de ver la manera mas facil, aunq se complica un poco si quieres guardar mas variables en el archivo y no solo la cadena xD. El nombre del archivo y la extensión puede ser la que quieras. El archivo no tiene formato de texto plano (como un txt), así que no se puede abrir desde el Bloc de Notas, por ejemplo.

Drumpi

Pues eso, usa un bucle: cada vez que ejecutas FGETS obtienes una cadena distinta, en el mismo orden que están escritas, hasta que se llega al final de fichero, que es cuando empieza a devolverte cadenas vacías (aunque antes de llegar sigquiera a eso, recomiendo el uso de FEOF).

La pega es saber si tienes suficientes variables String para almacenarlas, por lo que recomiendo usar una lista enlazada con nodos que contengan una String.
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)

Hola

Hola, ya he conseguido lo que queria, gracias por las respuestas. Una ultima cuestion, nada que ver con el tema anterior: tengo algo asi en mi programa:


PROGRAM ejemplo;
GLOBAL
tabla[8][8];
pointer t;


....
...


(dentro de un proceso tengo lo siguiente):


//..
t = &tabla[0][0];
t[0][1]=9;
..


Pero resulta que me da error, me sale Invalid Sentence "[",  en t[0][1]..
Si pongo t[0]=9; ahi sí se ejecuta, pero necesito que sea de la otra forma, tipo bidimensional.


Tambien probé en vez de poner "pointer t", poner "pointer pointer t" y ahi me da otro tipo de error: Values are of incompatible type "]"


Alguien sabe como puedo solucionar esto?

Drumpi

No me hagas mucho caso, pero es posible que sea porque en la línea anterior debías poner:

t = tabla;

Ahora, si no indicas los índices, el compilador te toma la variable como un puntero a esa dirección de memoria (antes era lo mismo que poner tabla[0]).

Tammbien puede ser porque Bennu no reconoce los punteros como un array bidimensional, por lo que sñolo puedes poner un índice, que es el desplazamiento de memoria respecto al valor al que apunta. Se puede calcular la posición en memoria de un array bidimensional fácilmente: (pos_y*n_columnas)+pos_x.
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

ni bennugd ni ningun lenguaje reconoce los punteros como arrays de mas de 1 dimension.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HaCkZJuaNN

Quote from: SplinterGU on October 26, 2011, 08:53:58 PM
ni bennugd ni ningun lenguaje reconoce los punteros como arrays de mas de 1 dimension.

Esto que suena muy nazi ( ;) ) es porque para poder direccionar un array de dos dimensiones con dos direcciones, tiene que ser estático y el programa tener información accesible sobre el tamaño del array.

No obstante, si haces los arrays bidimensionales como un array de punteros que apuntan a arrays, sí que podrías hacer algo así.

SplinterGU

exacto, pero necesitarias un array de punteros, donde cada uno de los items de array apunte a una dimension, pero eso ya no es un puntero, sino un array... no es la idea me parece.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Bueno, un array de punteros a un array, cuando escribes el código para acceder a la dirección de memoria queda de una forma similar a un array bidimensional... salvo que hay que poner unos paréntesis en medio :D

Ahora, saber qué método es más rápido ni idea: usando matemáticas hay una multiplicación y una suma, con el doble puntero es un triple acceso a memoria: consulta de la primera dirección, consulta de la segunda, y obtención del dato, unos 21 ciclos.

Vale, ya estoy desvariando ;D
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 entendi que has dicho... pero si estas diciendo que un array de punteros es lo mismo en memoria que un [][], te digo que no es asi.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HaCkZJuaNN

Quote from: Drumpi on October 31, 2011, 07:25:49 PM
Bueno, un array de punteros a un array, cuando escribes el código para acceder a la dirección de memoria queda de una forma similar a un array bidimensional... salvo que hay que poner unos paréntesis en medio :D

Ahora, saber qué método es más rápido ni idea: usando matemáticas hay una multiplicación y una suma, con el doble puntero es un triple acceso a memoria: consulta de la primera dirección, consulta de la segunda, y obtención del dato, unos 21 ciclos.

Vale, ya estoy desvariando ;D

Es más lento el doble puntero. Pero es que son cosas radicalmente distintas.

Los arrays bidimensinales estáticos siempre son en una sola lista (porque es mucho más eficiente y fácil para el intérprete, no tiene sentido implementar un array estático con un doble puntero). Los dinámicos los puedes hacer tú como quieras (como si quieres hacerlos con una lista enlazada o con un arbol binario de búsqueda). En una sola lista, te facilita el acceso y operaciones en bloque; pero con doble puntero te permite una mayor abstracción que puede ser interesante en determinados casos.

Drumpi

Splinter: no, me refiero a que para acceder a un array bidimensional se hace mi_array[1][2], mientras que si usas punteros es (mi_array[1])[2] (si no he metido la pata).

Hackzjuann: no, me refiero a doble puntero vs. puntero simple almacenando los mismos datos que un puntero doble.
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

mi_array[1][2] != ((puntero)[1])[2]

supongamos que tenemos un dimesionado array[2][2] (3 elementos por dimension, 9 elementos), esto es lo mismo que tener definido mi_array[8]  (9 elementos), cada dimension seria 3 elentos de ese vector unidemensional.

en el caso de punteros, como lo pones asi, seria un vector de punteros y cada puntero dentro de ese vector apuntaria a un vector de 3 elementos.

cosa que en memoria no es para nada lo mismo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

No he dicho que sea lo mismo, sino que se escriben de forma similar :D

Es más, hace unos pocos días subí el código del último motor, en el que uso un puntero (único) a modo de array bidimensional ;)
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)