Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Hola on October 23, 2011, 12:46:01 AM

Title: Lista de cadenas de texto
Post by: Hola on October 23, 2011, 12:46:01 AM
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?
Title: Re: Lista de cadenas de texto
Post by: Rein (K´)ah Al-Ghul on October 23, 2011, 01:14:57 AM
y si con cada gets extraes una linea de texto de tu lista??
osea haces tantos gets como elementos tenga tu cadena...
Title: Re: Lista de cadenas de texto
Post by: KeoH on October 23, 2011, 03:16:22 AM
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.
Title: Re: Lista de cadenas de texto
Post by: Drumpi on October 23, 2011, 07:49:30 PM
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.
Title: Re: Lista de cadenas de texto
Post by: Hola on October 23, 2011, 09:35:36 PM
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?
Title: Re: Lista de cadenas de texto
Post by: Drumpi on October 26, 2011, 07:45:11 PM
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.
Title: Re: Lista de cadenas de texto
Post by: SplinterGU on October 26, 2011, 08:53:58 PM
ni bennugd ni ningun lenguaje reconoce los punteros como arrays de mas de 1 dimension.
Title: Re: Lista de cadenas de texto
Post by: HaCkZJuaNN on October 29, 2011, 12:13:49 PM
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í.
Title: Re: Lista de cadenas de texto
Post by: SplinterGU on October 29, 2011, 04:41:51 PM
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.
Title: Re: Lista de cadenas de texto
Post by: 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
Title: Re: Lista de cadenas de texto
Post by: SplinterGU on November 01, 2011, 01:19:01 AM
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.
Title: Re: Lista de cadenas de texto
Post by: HaCkZJuaNN on November 01, 2011, 02:36:31 PM
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.
Title: Re: Lista de cadenas de texto
Post by: Drumpi on November 01, 2011, 07:18:32 PM
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.
Title: Re: Lista de cadenas de texto
Post by: SplinterGU on November 02, 2011, 12:07:19 AM
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.
Title: Re: Lista de cadenas de texto
Post by: Drumpi on November 04, 2011, 08:27:30 PM
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 ;)
Title: Re: Lista de cadenas de texto
Post by: SplinterGU on November 05, 2011, 01:47:06 AM
drumpi... mostra el ejemplo, porque si lo usas apuntas a un area bidimensional y luego lo accedess con un puntero usando puntero[10][2], queriendo acceder a la fila [10][2], entonces no solo lo estas haciendo mal, sino que tambien hay un bug, porque eso no deberia permitirte hacer.

ya que un puntero no conoce los limites de cada dimension, entonces no puede calcular cuanto saltar en cada dimension...
Title: Re: Lista de cadenas de texto
Post by: Drumpi on November 10, 2011, 08:38:36 PM
Que noooooooo, que yo a la posición (X,Y) de un único puntero accedo así:

puntero[(n_columnas*y) + x] = 7;





Pero en el hipotético caso de que tuviese un puntero a punteros

int pointer pointer puntero = alloc(5);
for (i=0;i<5;i++) {
puntero[ i ] = alloc(20);
end

Accedería así: (puntero[ x ])[ y ] = 13;
Sólo digo que esto último, repito, esto último, SE PARECE a como se accede a UN ARRAY BIDIMENSIONAL NORMAL: array[ x ] [ y ] = 13;
Title: Re: Lista de cadenas de texto
Post by: SplinterGU on November 10, 2011, 09:08:29 PM
ok, aclarado, pero no es lo mismo, porque asi no se accede internamente a la memoria de un array bidimensional... y como lo has dicho puedes generar confusion en los novatos.
Title: Re: Lista de cadenas de texto
Post by: KeoH on November 10, 2011, 11:39:42 PM
Quote from: SplinterGU on November 10, 2011, 09:08:29 PM
... y como lo has dicho puedes generar confusion en los novatos.

Yo cuando leo array .. directamente se me nubla la vista xD