Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Declarar array de struct sin conocer la cantidad de elementos [C]

Estas en el tema de Declarar array de struct sin conocer la cantidad de elementos [C] en el foro de C/C++ en Foros del Web. Hola gente. El programa que estoy construyendo tiene una búsqueda por fecha pero desconozco cuantos movimientos van a coincidir con la fecha a buscar.- Si ...
  #1 (permalink)  
Antiguo 12/04/2015, 08:55
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Declarar array de struct sin conocer la cantidad de elementos [C]

Hola gente.
El programa que estoy construyendo tiene una búsqueda por fecha pero desconozco cuantos movimientos van a coincidir con la fecha a buscar.-
Si esto tiene que ver con memoria dinámica no lo puedo seguir porque si bien me falta muy poco para finalizar con el capítulo archivos memoria dinámica es el siguiente.-
Desconozco si se puede crear la estructura y luego en cualquier función declarar un array del tipo struct, tal vez esa sea una solución pero no quiero practicar con esto porque si me funciona seguramente me estaré perdiendo alguna manera más funcional, no me tomen como vago es que quiero (en lo posible) aprender lo máximo del lenguaje.-

Pongo algo de código.-

Código:
.........................
#define MENSAJE printf( "\n\n Pulse [Enter] para continuar..." ); getchar();

typedef struct{
	char b;
	char fecha[11];
	float verduras;
	float almacen;
	char nota[101];
}Super;

Código:
void buscar(FILE *ptrFile, Super *super, int tamStructSuper){
	char pBuscar[11], *p = NULL;
	int ch, ok;
	
	do{
		printf( "\n\n Ingrese fecha a consultat (formato ==> 11/04/2015)....: " );
		fgets(pBuscar, 11, stdin);
		if((p=strchr(pBuscar, '\n'))){
			*p='\0';
		}
		else{
			while((ch = getchar()) !='\n' && ch!=EOF);
		}
		ok = strlen(pBuscar);
		if( ok != 10 || pBuscar[2] != '/' || pBuscar[5] != '/'){			
			ok = 0;
		}
	}while(!ok);

	ok=0;
	rewind( ptrFile);
	while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
		if( strstr(pBuscar, super->fecha) != NULL){
			ok++;
		}
	}
	if( ok > 0){
		printf("\n Hubo %d coincidencias", ok);getchar();
	}else{
		printf( "\n\n No existe..." );
		MENSAJE;
	}
}
Saludos.-
Daniel
  #2 (permalink)  
Antiguo 12/04/2015, 13:06
 
Fecha de Ingreso: febrero-2015
Mensajes: 400
Antigüedad: 4 años, 5 meses
Puntos: 3
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

si no sabes el numero de miembros tendras que usar memoria dinamica (listas enlazadas) o si no, leer desde un archivo de uno en uno (archivo secuencial).
  #3 (permalink)  
Antiguo 12/04/2015, 13:11
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 924
Antigüedad: 5 años, 10 meses
Puntos: 38
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Eso ya son listas simples o listas abiertas, o otros tipos por supuesto. Y también memoria dinámica claro.
Otra cosa es que sabes que mas de 100 estructuras no vas usar y las declaras, a lo mejor no las uses todas, pero eso es desperdiciar memoria.
  #4 (permalink)  
Antiguo 13/04/2015, 07:33
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Hola.
Aguml, un gusto conocerte y decirte que voy a adoptar tú última sugerencia, sólo que lo voy hacer con esta función que acabo de descubrir.-

Código:
FILE *tmpfile( void );
Vangodp, tú sugerencia la pensé pero quería saber si habría otra manera.-

Daniel
  #5 (permalink)  
Antiguo 13/04/2015, 09:22
 
Fecha de Ingreso: febrero-2015
Mensajes: 400
Antigüedad: 4 años, 5 meses
Puntos: 3
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

esa funcion no la conozco pero es lo mismo que usar fopen. ¿Pensaste en usar sqlite, misql, oracle...? Para bases de datos normalitas yo uso sqlite que es muy sencillo.
  #6 (permalink)  
Antiguo 13/04/2015, 10:26
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 924
Antigüedad: 5 años, 10 meses
Puntos: 38
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Si estuvieras en C++ te diria que utilizara las STL, contenedores vamos. Pero en C ni idea, creo que no se puede.
  #7 (permalink)  
Antiguo 13/04/2015, 11:15
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Hola Aguml.
muchas gracias por el aporte y me das pie para escribir aquí cual es la meta que me impuse al estudiar C, desde que aprendí a programar en fox para Windows me intrigaron las tablas/bases de datos, y me impuse crear/construir mis propias bases de datos, ya sé que van a decirme como me ocurrió en otros lugares que está todo inventado, que como te vas a poner a competir con misql y tantas otras, debo aclarar que a mis 63 años ya no me interesa hacerme un futuro con esto ni competir con nadie es sólo que cuando uno siente dentro suyo algo especial como yo siento por el tema debe darle riendas sueltas y los resultados seguramente llegarán, es algo que siento que debo intentar.-
Si te preguntaras porque C y no otro lenguaje es porque leí que algunas bases de datos están desarrolladas en C.-
Espiritualmente espero la ayuda de Dios, humanamente la de Uds.

Daniel
  #8 (permalink)  
Antiguo 13/04/2015, 11:48
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Hola.
Evidentemente hoy voy a estar casi todo el día conectado a este foro (si no me tiran la oreja antes), en definitiva voy a optar por esta alternativa, cuando sepa la cantidad de coincidencias en la búsqueda la tendré guardada en una variable y con ella sabré la cantidad de elementos que contendrá el array de estruct y no desperdiciare memoria, la contra es que voy a tener que repetir el bucle y a favor que si no se utiliza la estructura no ocupa memoria, sólo lo hace cuando se declara la variable estructura (espero no equibocarme).-

Código:
#include <stdio.h>

typedef struct{
	int va;
	float vb;
}Temp;

void fa( void );

int main(void){
	fa();

	return 0;
}

void fa( void ){
	int vfa = 10;
	Temp temp[vfa];

	temp[0].va = 10;
	temp[0].vb = 12.59;
	printf(" \n \"va\" vale -> %d == \"vb\" vale -> %.2f", temp[0].va, temp[0].vb); getchar();
}

Daniel
  #9 (permalink)  
Antiguo 13/04/2015, 11:52
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 924
Antigüedad: 5 años, 10 meses
Puntos: 38
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

C++ apenas es un "C Con Clases"XD. No es crimen aprovechar lo que te ofrece C++ solo por que te has formado la idea de que C es mejor o sea lo que sea que pienses. Te aseguro que las bondades de java sí que no las vas poder usar.

Si tanto te gustan las bases de datos y estas necesitando objetos dinámicos, hay 2 salidas. O tomas la opción A que se traduce en aprender lo que es memoria dinámica en C, y luego después las listas, colas pilas etc etc, o B, te guardas el ficherito como C++ y te despreocupa de eso, usando las contenedores STL claro. En ninguno de los casos va serte fácil y por supuesto eso no quiere decir que quizás no haya un camino C, D, E.... Pero yo realmente desconozco.

Te aconsejo que aparques lo que estés haciendo y te pegues con memoria dinámica. Quizás en una o 2 semanitas estés ya afilado con memoria dinámica que es el único requisito para aprender listas dinámicas.

Ya tu verás donde quieres llegar. Ayuda por supuesto que la tienes aquí, si no para que estamos entonces. XD

Si ya sabes funciones, punteros, estructuras, y todo lo básico, disculpe pero creo que ya lo que te queda es memoria dinámica y los contenedores no crees.

Suerte con los estudios, por cierto, tengo ya 40 años y no hago eso por que vaya trabajar para googles XDD. Hago por que me gusta.

Suerte!
  #10 (permalink)  
Antiguo 14/04/2015, 01:32
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 4 años, 10 meses
Puntos: 204
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Cita:
Iniciado por rdv316 Ver Mensaje
desde que aprendí a programar en fox para Windows me intrigaron las tablas/bases de datos, y me impuse crear/construir mis propias bases de datos, ya sé que van a decirme como me ocurrió en otros lugares que está todo inventado, que como te vas a poner a competir con misql y tantas otras
No creo que se trate de competir con nadie... Lo que sucede es que embarcarse en el proyecto de crear un motor de bases de datos no es algo trivial. Este proyecto exige una cantidad de conocimientos bastante importante; conocimientos no sólo de programación, sino de bases de datos, gestión de la memoria, funcionamiento del sistema operativo, paralelismo...

No pongo en duda que no sea un proyecto interesante y emocionante, que lo es, pero para disfrutarlo antes hay que currarse una buena base.

Cita:
Iniciado por rdv316 Ver Mensaje
Si te preguntaras porque C y no otro lenguaje es porque leí que algunas bases de datos están desarrolladas en C.
Dado que no buscas competir con nadie, si tu nivel en programación no destaca por su maestría, tienes dos opciones:

* Elijes un lenguaje de más alto nivel. Esta opción te abstrae de las complejidades del sistema operativo y del hardware, lo que te permite centrarte en la idea que tienes en mente, que es desarrollar un motor de bases de datos.

* Mejoras tu formación a bajo nivel. Esta opción es más laboriosa pero te permitirá crear un sistema más robusto, funcional y eficiente. Además, sabrás qué sucede en todo momento, lo cual ayuda bastante y mejora la satisfacción final.

Mi consejo es que, como dice @vangodp aparques temporalmente tu proyecto y mejores, al menos, tus habilidades gestionando la memoria dinámica y el uso de diferentes tipos de listas y árboles. En el fondo va a ser indiferente si usas C o C++... la mayor diferencia estriba en que C++ es un lenguaje que te "permite proporcionar" un mayor nivel de abstracción y eso puede suponer una ayuda importante.

Un saludo.
  #11 (permalink)  
Antiguo 14/04/2015, 07:11
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Hola amigos.
Voy a tener muy en cuenta sus consejos los estoy leyendo y releyendo, sólo que me tardare una semanita más para terminar el tema de los archivos y el mini programa de gestión comercial que tengo pendiente.-



Espero que este capítulo cubra en parte lo que Uds. Proponen.-


Daniel
  #12 (permalink)  
Antiguo 14/04/2015, 08:11
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Cita:
Iniciado por rdv316 Ver Mensaje
Código:
#include <stdio.h>

typedef struct{
	int va;
	float vb;
}Temp;

void fa( void );

int main(void){
	fa();

	return 0;
}

void fa( void ){
	int vfa = 10;
	Temp temp[vfa];

	temp[0].va = 10;
	temp[0].vb = 12.59;
	printf(" \n \"va\" vale -> %d == \"vb\" vale -> %.2f", temp[0].va, temp[0].vb); getchar();
}
Hola;
Un comentario: estos VLA (Variable Length Array) van a crearse en la stack (la pila, donde se crean las variables locales de duración automática), y que tiene un tamaño muy limitado, así que en general conviene poner algún control para que no vaya a desbordarse.
  #13 (permalink)  
Antiguo 14/04/2015, 09:59
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Hola a todos.
Lareto, como toda cosa nueva me cuesta un tanto entenderla buscando en la web, más que nada porque parecería que siempre lo más profundo se encuentra en inglés.-

Cita:
así que en general conviene poner algún control para que no vaya a desbordarse.
¿Podrías explayarte en este concepto?

Tengo una consultita más:
Esto es correcto, puedo declarar 2 variables de la estructura Super sin conflictos, el compilador no me tira ningún error pero quisiera estar seguro que esto no me ocasionara problemas, desconozco todavía como actúa en memoria.-

Código:
typedef struct{
	char b;
	char fecha[11];
	float verduras;
	float almacen;
	char nota[101];
}Super;

.............
	Super super = {0};
.............
if( ok > 0){
		Super tSuper[ok];
	}else{
		printf( "\n\n No existe..." );
		MENSAJE;
	}
.............
Daniel
  #14 (permalink)  
Antiguo 14/04/2015, 10:41
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Hola Daniel.

Y sí, yo te diría que es casi una regla universal, la información de mejor calidad está en inglés (por lo menos para los que no leemos ruso o chino, que no podría saberlo). Por ejemplo, el libro que estás leyendo fue escrito en inglés, y después un traductor hizo lo mejor que pudo para que podamos leerlo en castellano.

La idea más básica es que las variables de duración automática (de esas que se declaran dentro de una función) se crean en la pila (stack), que tiene un tamaño limitado (puede ser 1 MB o más, depende del compilador y sus seteos --que entre paréntesis dentro del paréntesis, mira de qué manera abominable estamos hablando...)
Y entonces, como la stack tiene una capacidad bastante pobre, comparada con el heap (el "montículo" dio libre y guarde), que es donde se crean las variables con malloc, por ejemplo, y que no tiene esa limitación.
Una u otra forma de creación tienen sus pros y sus contras, que para no decir de apuro y mal, te paso la dirección de un documento donde lo explican muy prolijamente:
http://www.inf.udec.cl/~leo/teoX.pdf
y que lo escribe Leo Ferres del departamento de Ciencias de la Computación de la Universidad de Concepción, de Chile, en inglés, quizá para ser tomado en serio :)

Por lo que veo en el código
Código:
Super tSuper[ok];
tSuper se crea como un array de ok estructuras de tipo Super, con el mecanismo del VLA, o sea, en la stack. Decía eso de poner algún control, para que el tamaño de ese array no supere la capacidad de la stack (ese MB o 8 MB que puede tener por omisión ("por defecto", jé).
  #15 (permalink)  
Antiguo 15/04/2015, 09:38
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 7 años, 1 mes
Puntos: 28
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Si no vas a usar memoria dinámica, lo mejor esque crees un array inmensamente grande que abarque un uso normal.
  #16 (permalink)  
Antiguo 15/04/2015, 10:19
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Hola gente.
Realmente tenía intenciones de buscar por lo menos 2 días más en la web para obtener la solución por mí mismo, cosa que hasta el momento no pude lograr y créanme que desde que leí el mensaje de lareto:
Cita:
…. poner algún control, para que el tamaño de ese array no supere la capacidad de la stack…
Lo estoy haciendo de tiempo completo, pero nada.-
Bueno el mensaje de amchacon me animo y aquí estoy nuevamente pidiéndoles que me den una mano con esto y dejar aclarado que no utilizo memoria dinámica por caprichoso, simplemente porque es el próximo capítulo del manual y quiero antes terminar este programa.-

Daniel
  #17 (permalink)  
Antiguo 15/04/2015, 14:28
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 7 años, 1 mes
Puntos: 28
Respuesta: Declarar array de struct sin conocer la cantidad de elementos [C]

Si no vas a usar memoria dinámica, la mejor opción es la que te he dicho. Te creas un array de 1 millón de elementos y luego usas los que necesites.

Etiquetas: cantidad, char, conocer, declarar, elementos, funcion, int, memoria, programa, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:38.