Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Matrices Un Poco Raras

Iniciado por shephiroth, 09 de Junio de 2004, 10:09:22 AM

« anterior - próximo »

shephiroth

 Muy buenas. El tema de hoy, matrices, pero un poco raras. Veamos, en mi proyecto estoy pensando hacer una matriz un poco rara (por lo menos para mi). Veamos, yo se hacer una matriz de todo numeros, todo texto, o todo bool.............pero como hago una matriz que combine???

Basicamente quiero hacerme una minibase de datos. Para windows no tendría problemas, podría usar el .net y usar los DATASET y conectarlo con bases de access. Pero para llevarlo a otras plataformas, jodida esta la cosa.

Por esta razon me voy a crear una clase a la medida xDD. Para esto necesitaré muchas matrices, pero claro, una matriz (una tabla) puede tener valores numericos, texto o booleanos (entre otros, aunque estos son los q mas interesan).

Como puedo crear estas matrices?? Por ejemplo, una matriz de 3 columnas, la primera numerica, la segunda booleana, y la tercera de texto(50 caracteres)

GRACIAS ^^

DraKKaR

 Si eres tu el que creas la clase MatrizRara no veo porque no ibas a poder meter lo que quisiras. A mí se me ocurre lo siguiente:

Tenemos la clase MatrizRara, cuyos elementos deben ser de tipo ElemRaro.

Tenemos la clase ElemRaro, que no guarda información alguna.

De ElemRaro heredan las clase ElemEntero, ElemBooleano y ElemString, que sobrecargan lo que haya que sobrecargar de la clase padre (ElemRaro) para almacenar el dato del tipo que sea.
De esta forma la MatrizRara solo guardará elementos de tipo ElemRaro, pero que por el polimorfismo, podrán especializarse en los tipos de datos que necesites...


Se entiende?

shephiroth

 Nononono, yo no quiero hacer la clase MatrizRaro...........yo quiero hacer una matriz......una normal, de las de toda la vida. Pero quiero saber como se hace para q me permita tener diferentes tipos, es decir, combinar numeros, texto y valores booleanos.

Lo de la clase que quiero hacer era una explicacion............esta me va a servir como "mini base de datos" xDD

Perdona si lo explique mal  (nooo)  (nooo)  

vicho

 yo voto por hacer las cosas usando estructuras o clases o da igual
total todo es a la imaginacion del programador

Douch

 shephiroth, creo (y solo creo) que lo que dices no se puede hacer. La única solución que se me ocurre (oye, que puede que haya otras) es crear una tabla de 1 columna x n filas para cada tipo de dato, y acceder a cada elemento con el mísmo indice.  Éste método, siendo un poco bruto, lleva su curro para evitar errores de desligación (toma palabro) de datos. Con desligación me refiero a la pérdida de integridad en la base de datos. Por ejemplo, si decides ordenar de forma creciente la columna 1, tendrás que estar seguro de que los cambios en el orden de dicha columna se lo transmites también a la 2 y a la 3.

Ej: 3 columnas con diferentes tipos de datos

(1)Numero  
(2)Booleano
(3)Texto

<>1 2 3 (3 tablas de 1 x n)
1>[] [] []
2>[] [] []
3>[] [] []
4>[] [] []
5>[] [] []
.
.
.



Espero haberte ayudado en algo.

shephiroth

 .....estructuras valdría si solo fuera a utilizar un tipo de tabla. Pero cuando quiero intentar que el usuario (mejor dicho el programador) elija que dato y en q orden, pues la cosa cambia. Por eso preguntaba si había alguna forma de crear una matriz de las de toda la vida, pero que permitiera esa compatibilidad de tipos.

No se si me explico. Veamos, a ver si con un ejemplo se ve mas claro. En prncipio el juego va dirigido a un rpg. Esta clase la quiero utilizar para guardar toda la lista de objetos que hay en el juego, toda. Pero dandole un poco de sentido y darle un buen uso. Si en vez de solo para eso introduzco las tiendas en una tabla, y relaciono esa tabla con una tercera para decirle que objeto esta en cada tienda, pues gano mucho. Si al mismo tiempo tengo una tabla en la q tengo las ciudades, y otra juntando ciudades con tiendas, puedo llegar a tener un tio, que me diga un objeto, en que ciudades se puede comprar......y asi pasaría con todo.

En un principio si me quedo en windows lo tendría muy facil, implemento el .net y utilizo conexion con base de datos mdb, de esta forma no necesito que este instalado nada (solo una dll que se puede adjuntar al archivo xDD). Pero la cosa se complica si quiero intentar hacer esto multiplataforma, pues en linux las mdb....como q se las trae floja xDD

Por eso me quiero montar una mini base de datos. Se que lleva muchas más complicaciones de las que estoy citando, lo sé, y no os preocupeis que la cosa saldrá adelante. Pero como siempre, la casa por los cimientos, no por el tejado, que sino se me caerá y como no uso casco me causará lession cerebral, y como soy autónomo no veo un duro  (twist) ................uff, perdon, se me fue la bola. Pues eso, lo primero las matrices, luego ya me buscaré la forma de hacerlo xDD

GRACIAS ^^

shephiroth

 Douch, comence a postear antes de ver el tuyo. Lo que me comentas dejando de lado la complejidad de la programación, no solo en la ordenacion sino que no hay solo 1 tabla, sino que el programa necesitaría entre 5 y 10 tablas, y aparte de estas se necesitan como 3/5 tablas mas para el trabajo propio de la bd (esto serían, relaciones, tablas, objetos, permisos.....). El problema esta cuando las tablas no son estáticas. Me explico, si yo o quisiera hacer para 1 programa perfecto, me lio la cabeza y hago que funcione ahi (dicese del "mal" programador......lo siento pero es la realidad).........el tema esta en conseguir que funcione para mas de un programa...............olvidandonos del programa, imaginate que yo necesito una tabla q tiene 2 numeros 1 bool y 1 string...............todo perfecto...............ahora imaginate que necesito una q tiene 5 numeros, 7 string y 2 bool..........he de cambiar todo el programa y readaptarlo........pq como tu dices al ordenar hay q ordenar todos de forma que no se pierda la veracidad de los datos. Ahi radica mi problema.

Vaya..........matrices no se pueden.................quizás les he puesto un nombre que no coresponde............veamos a mi me suena..............necesito un puntero, que contenga muchos punteros, pero claro...........dichos punteros pueden ser de diferentes tipos.................pensando rapido, valdría algo como:


void ** mimatriz;
mimatriz=malloc(sizeof(void*)*5);
mimatriz[0]=(int*)malloc(sizeof(int)*20;
mimatriz[1]=(String)malloc(sizeof(String));
....


algo asi no dejaría???

GRACIAS  

sés

 Limítate a crear una tabla de punteros (void *) que tengan o apunten al valor de la celda en cuestión. Luego haces el "cast" cuando vayas a leer y listo:

void *tabla[n][m];

= Escribir =
Entero: *((int *)&tabla[10][4]) = 12345;
Tipo cualquiera: tabla[5][5] = &tipo_cualquiera;

= Leer =
Entero: (int)tabla[10][4];
Tipo cualquiera: (tipo *)tabla[5][5];


Bueno... lo estoy haciendo a pelo, seguramente  haya escrito algo mal. Espero que por lo menos se entienda la idea.
Soy indeciso... ¿o no?

Mars Attacks

 A mí me parecería más simple usar un vector de structs donde cada struct se compone de lo que quieras que tenga.

sés

 Y a mí, pero según dice (o yo entendí), no es lo que quiere.

No le veo mucho sentido, sencillamente porque es imposible crear un array que pueda tener distintos tipos de datos. Los arrays son de un tipo, lo único que puedes hacer con cada posición es tratarlo de distinta forma... nada más.

Solo veo dos soluciones lógicas (y sencillas):
- Clase base de la que hereda cada tipo.
- Estructura tipo "variant", que pueda contener varios tipos con una "union" o algo similar.
Soy indeciso... ¿o no?

Douch

 El problema de usar un vector de structs es que se llega a repetir mucho la información (problema de redundancia). Tomemos por ejemplo un objeto denominado "poción curativa" cuya estructura es:

ciudad
tienda
curacion (cantidad de vida que repone)

Esta estructura sería pensando en un array de structs.


Ahora imagina que hay 20 ciudades, las cuales tienen 5 tiendas. Y cada una de éstas siempre tiene como poco una poción curativa (a lo mejor tiene 5, 10, 15,....). Ahora bien, ¿qué ocurriría si queremos cambiar "curacíón"?. Nos encontraríamos con que tendríamos que recorrer cada uno de las pociones de cada tienda y de cada ciudad, perdiendo una cantidad de tiempo considerable.  Bueno, ya sé que éste ejemplo es un poco tonto porque éstos valores se cambiarían fuera del juego, pero para la idea que quiero exponer creo que vale.

Aún así, la idea de los structs no está mal del todo si se aborda desde otro lado, aunque se alejaría de la idea de shephiroth.
De todas formas, lo pondré por si interesa. Tomando la idea de como se gestionan bases de datos, lo ideal sería que crearas un struct para cada elemento en el juego:

Struct para las ciudades.
Ej:
- ID
- Nombre

Struct para las tiendas.
EJ:
- ID
- Nombre

Struct para los objetos.
Ej:
- ID
- Nombre
- Características (las reunimos todas en un mismo concepto para evitar más confusion)

Y una última para realizar las interconexiones entre las anteriores estructuras
Struct conexiones
- ID1
- ID2

Luego crearíamos listas para cada uno de éstos elementos (lista de ciudades, de tiendas y de objetos) y para cada una de las interconexiones entre elementos. Ésto sería:

Struct ciudad_tienda
- ID1 (guardaría la ID de la ciudad)
- ID2 (guardaría la ID de la tienda)

Struct tienda_objeto
- ID1 (ID tienda)
- ID2 (ID objeto)



Una vez finalizado el proceso, todo tendrá una mayor consistencia. Ya no hay datos redundantes y las modificaciones se realizan de forma más rápida, ya que solo habría que modificar los valores en la estructura del elemento en sí (ciudad, tienda u objeto).


Bueno, puede que ésto no sea lo que buscas shephiroth, pero aquí lo dejo.

rafaware

 Lo mismo es una gilipollez pero bueno hay va :P
#define TIPO_INT 0
#define TIPO_STRING 1
#define  TIPO_FLOAT 2
#define TIPO_RARO 3

typedef struct {
   int  tipo; // Tipo de dato
   void * dato; // Puntero al dato
}columnaBD

entonces para hacer tu matriz "rara" haces como de costumbre: matrizRara = columnaBD[50][3];

Para hacer a los elementos:
if (columnBD[i][j].tipo == TIPO_INT) {
   valorInt = *(int *) columndaBD[i][j].valor; // No estoy seguro si es asi. Pero vamos necesitas el contenido de ese puntero (haciendo el casting a un puntero a int)
}
else if (columnBD[i][j].tipo == TIPO_STRING) {
   strcpy (valorStr, (char *) columndaBD[i][j].valor);
}
else ......

Para los tipos raros o estructuras tendrias que crearte tus propias funciones.

O tambien podrias hacer:

typedef struct {
   int  tipo; // Tipo de dato
   char * dato; // Puntero al dato
}columnaBD

y leer los ints con atoi, los float con atof, lo str con strcpy, ....

DraKKaR

 Pues yo sigo creyendo que la solución que he aportado antes es más elegante (me gusto aprovechar las clases, la herencia y todo esto) y perfectamente válida.
Es que ahora el código en C puto y duro me horroriza XDD (pero no le temo :P)

Mars Attacks

 De momento la idea de Douch me parece la más sensata y lógica. Ciertamente se parece al modelo relacional y sería fácil de manejar.
Pero volviendo a lo que pedías, que era una matriz con varios elementos, ¿no se podría hacer esto?:

typedef union {
int a;
char *b;
tralari c;
} cosarrara;

cosarrara matrizdecosasrraras[50][10];

(O como se use, nunca he tocado el union).

sés

 Cuando dije "union o similar" me refería a esto o a lo que dice rafaware (que creo que es como yo lo haría).
Soy indeciso... ¿o no?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.