Programación General > C/C++

 ¿Arreglos o archivos?

<< < (2/3) > >>

tambor:
Muchas gracias moskito y morfhus por responder.
Realmente no conocía sql, y en tanto estoy en cero.....
pero estuve mirando rápidamente algo de la información que hay por todos lados.....y descubrí que es un lenguaje de programación pensado para manejar bases de datos.....etc etc etc....
en todo caso me surgen inquietudes:
me explicó:
*El programa debe crear vectores en R3. ciertamente muchos vectores en R3.
      si uso **vector para crear una matriz de 3 filas y n columnas la cosa va muy bien,
      aunque usa todos los recursos de memoria. yo quiero liberarla para hacer otras cosas y después volver a usar ese conjunto de vectores.
      incluso he pensado que sería interesante que la función que crea a **vector, dentro de su bucle escribiera directamente sobre un archivo cada vez que crea un nuevo trió  
     de números, un vector de R3.
      digo que las funciones de c permiten hacer esto.

    ahora si después quiero utilizar el vector, tengo que cargar el archivo y lograr moverme cómodamente por entre las diferentes posiciones. identificando cada componente de      
   cada distinto vector

             acuando lo hago por el método ** vector es fácil para mi acceder a cualquier posición de la matriz. solo necesito usar un
             
             /* vector[a] */ para acceder a la fila A columna B de mi matriz. (en eso tiene moskito una confusión).

            luego en el archivo no es tan sencillo. aunque de nuevo c tiene algunas funciones..... pero no estoy seguro como usarlas,
           ¿ hay una función que me permita dentro del archivo ir hasta el siguiente espacio, es decir que cuente 100 espacios desde el comienzo del documento?      
           con una función de ese estilo podría resolver mi problema.

alguien que me de nuevas luces,
Gracias muchachos.

tambor:
me falto agregar, que a lo mejor todo esto lo puedo hacer muy fácil con sql, pero me pregunto como hago para que mi programa alterne entre c y sql, ¿que compatibilidad hay?

Epa:
Buenas.

con fseek() podes posicionarte en un lugar cualqueira de un archivo.

Aunque sinceramente, y en mi opinion, me parece que trabajar con esa cantidad de datos desde un archivo no es muy practico. Yo en tu lugar trabajaria en memoria y guardaria a dico cuando sea necesario.
Suponiendo que estas trabajando bajo una arquitectura de 32 bits, tu vector va a ocupar (dependiendo el tipo de datos que uses)como muhco 78 KB de memoria, lo que no me parece mucho considerando que tenes poco menos de 4 GB disponibles para tu programa. Yo no me preocuparia tanto por la memoria que ocupa tu proceso, ya que el SO se encarga de administrar eso.

Saludos

m0skit0:
Disculpa, ahora lo vuelvo a leer y veo que lo que quieres guardar son 10.000 puntos en R3. Para eso tu mejor opción en mi opinión es hacerlo así:


--- Código: C ---#define TAM_VECTOR 10000 typedef struct {    float x;    float y;    float z;} tPuntoR3; tPuntoR3 vector[TAM_VECTOR]; Y un vector tridimensonal es vec[][][] y no vec[][]. No tengo ninguna confusión al respecto, pero vamos, no es la estructura que necesitas.

Ahora que lo pienso, realmente lo puedes hacer con un fichero como indican los compañeros de foro. Si sólo vas a usar la BD para esto no merece la pena. Si piensas que en un futuro vas a tener que manejar más cantidad de datos, entonces sí te conviene.


--- Cita de: "tambor" ---descubrí que es un lenguaje de programación pensado para manejar bases de datos
--- Fin de la cita ---
No, no es un lenguaje de programación. Es un lenguaje de consulta y manejo de bases de datos. Insisto, SQL no es programación. Hay variantes de SQL por cada fabricante que añaden funcionalidades realmente de programación, como PL/SQL en el caso de Oracle.


--- Cita de: "tambor" ---aunque usa todos los recursos de memoria. yo quiero liberarla para hacer otras cosas y después volver a usar ese conjunto de vectores.
--- Fin de la cita ---
Realmente no necesitas liberar esa memoria porque tampoco es tanta, sobre todo para los equipos de hoy en día. Estás usando 4 x 3 x 10.000 bytes = 120.000 bytes ~ 117 KiB = una nimiedad.


--- Cita de: "tambor" ---cada vez que crea un nuevo trió de números, un vector de R3.
--- Fin de la cita ---
Si vas a tener una estructura dinámica no te aconsejo que uses vectores (arrays) porque son estáticos; deberías usar alocación dinámica de memoria para que sea una programación más correcta (usando malloc y demás). Aunque visto el máximo que manejas es pequeño, realmente no importa, pero aún así es mala programación.


--- Cita de: "tambor" ---digo que las funciones de c permiten hacer esto
--- Fin de la cita ---
fopen fwrite fclose


--- Cita de: "tambor" ---solo necesito usar un /* vector[a] */ para acceder a la fila A columna B de mi matriz. (en eso tiene moskito una confusión).
--- Fin de la cita ---
Si sólo tiene columna y fila no es tridimensional, sino bidimensional. Creo que la confusión la tienes tú o bien no te has explicado correctamente. ¿O bien te refieres a una matriz de R3?


--- Cita de: "tambor" ---luego en el archivo no es tan sencillo
--- Fin de la cita ---
Sí lo es. Cargas todo el vector en memoria como dice Epa y ya accedes como dices.


--- Cita de: "tambor" ---que a lo mejor todo esto lo puedo hacer muy fácil con sql, pero me pregunto como hago para que mi programa alterne entre c y sql, ¿que compatibilidad hay?
--- Fin de la cita ---
No hay que alternar nada. Desde C te conectas a la base de datos y lanzas una consulta. Hay multitud de librerías sencillas para ello.

Saludos

tambor:
De nuevo gracias por la paciencia y el entusiasmo....jeje....

nos vamos acercando a la cuestión....

para la ilustrar mi dilema anexo a continuación  ( :blink:) un pequeño codigo
de un programa que escribí yo, y que debe ser parecido sino igual a otros, pues tiene como fin encontrar primos.
un algoritmo muy conocido, supongo. pero el programa tiene la particularidad que va guardando los primos en un vector, y usa ese vector para comprobar si los numeros son primos.  

esto fue lo que hice:

 
//
// Programa para contar y guardar primos


#include <stdlib.h>
#include <stdio.h>



int main()

{

int *primos, *primoscopia, i,j,k,m1,s,m2;
float d,d1;

m1=2;
m2=2;
s=1;
primos = (int *)malloc (m1*sizeof(int));                  ////asignando memoria para vector de enteros
primoscopia = (int *)malloc (m1*sizeof(int));          ///// copia del vector

primos[0] = 2;
primos[1] = 3;
primoscopia[0] = 2;
primoscopia[1] = 3;
i=4; j=0;                   ////////////////////////Condiciones iniciales
 
                   //////////////////////bucle principal
            while(i<100000)
                    {
                        do{
                           d=(float)i/primos[j];
                           d1= d-(int)d;
                           if(d1== 0){s=0;}
                           if(j == m1-1)
                                 {  printf("el numero %d es primon",i);
                                      m2 = m1+1;  
                                      primos = (int *)malloc (m2*sizeof(int));  /////////Reasignando memoria para el vector;
                                   
                                      primos[m1] = i;
                                      s=0;
                                 }
                           
                       
                           else { j++;}
                             

                           } while(s==1);


                           
                            if(m2==m1+1) {
                                   
                                       for(k=0;k<m1;k++) {
                                              primos[k]= primoscopia[k];                    
                                                         }
                                        primoscopia = (int *)malloc (m2*sizeof(int));   //////////reasignando memoria para el vector copia
                                   
                           for(k=0;k<m2;k++) {
                                                  primoscopia[k]= primos[k];
                                                          }

                                         }          
                      m1=m2;
                      j=0;
                      s=1;
                      i++;
                     }

        printf("%dn", m1);
}  

nota: fue después, hace muy poco que me entere de la existencia de a%b en c. (función residuo).


bueno la cuestión es que el programa funciona muy bien hasta 100.000. si se usa un numero mas grande sucede que por ahí en 130.000 el programa, ejecutándolo bajo terminal, es abortado. de echo en la terminal sale algo como "finalizado(killed)" y ya ni una coma más. en aquel momento pensé que la cuestión podía tener que ver con la memoria ram o algo por ese lado......ahí fue la primera vez que pensé usar un archivo.


pero entonces si ustedes dicen que la memoria sobra........y el vector en mi programa cuando llega a 130.000 no tendrá más de 13.000 números, entonces me surgen dudas, dudas.     ¿que es lo que pasa?.

me voy a poner a cacharrear un rato haber si consigo recuperar mi vieja idea de llevar este programa a su nueva versión archivo y de paso practico estas nuevas funciones en las que estoy incursionando.


Gracias, Muchas Gracias a todos, ayudenme a salir de dudas.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa