• Domingo 5 de Mayo de 2024, 03:51

Autor Tema:  ¿Arreglos o archivos?  (Leído 3176 veces)

tambor

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
¿Arreglos o archivos?
« en: Miércoles 15 de Diciembre de 2010, 07:58 »
0
muchas gracias de antemano para el que se tome el trabajo de ayudar.

Mi cuestión va por este lado. estoy haciendo un programa que debe generar algo así como 10.000 puntos en R3. es decir una matriz de tres filas y 10.000 columnas.
o al revés. se que puedo usar un vector multi-dimensional algo como  **vector o vector[ ][ ] ; pero mi inquietud pasa porque preferiría que el programa guarde el vector en el disco duro. después otra función debe poder acceder al archivo y moverse en el como si fuera una matriz, e identificar con facilidad que valor corresponde a cada punto para cada coordenada; me parece que esto es mucho mas fácil manejándolo como **vector, y realmente no se muy bien como hacerlo trabajando como un archivo en el disco. alguien me puede tender una manito, botar unas pistas.

Alegrías para todos.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: ¿Arreglos o archivos?
« Respuesta #1 en: Miércoles 15 de Diciembre de 2010, 08:44 »
0
Primero, si es tridimensional sería vector[][][] o vector***. Segundo, vector[][][] y vector*** es exactamente lo mismo en C.

Si la pregunta es si debes guardarlo en un fichero o no, es obvio que si el programa va a terminar necesitas guardar dichos datos en algún lugar, de lo contrario se perderán en cuanto el programa termine. Por tanto no es una pregunta, sino que sí o sí los debes guardar, aunque yo lo haría en una tabla de base de datos, con por ejemplo 3 columnas y todos los registros que desees. Después para recuperar la tabla completa o acceder simplemente a ciertos valores puedes usar SQL.

Saludos

morfus_bedxhed

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: ¿Arreglos o archivos?
« Respuesta #2 en: Miércoles 15 de Diciembre de 2010, 18:13 »
0
Estoy de acuedo con lo que dice moskito, utilizar una bd para realizar es  mejor además de las facilidades de manipulación de los registros es más facil con sql y te ahorras un buen de cógido en eso; mi punto es moskito ¿no sería más satisfactorio hacerlo con archivos y manipular el archivo desde c sin código sql? aunque lo mejor amigo es hacerlo con una bd persi puedes hacerlo de las dos formas mejor...

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: ¿Arreglos o archivos?
« Respuesta #3 en: Jueves 16 de Diciembre de 2010, 10:14 »
0
¿Cómo "satisfactorio"?

morfus_bedxhed

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: ¿Arreglos o archivos?
« Respuesta #4 en: Jueves 16 de Diciembre de 2010, 21:16 »
0
o sea, que siendo c un lenguaje tan permisivo se podría programar el programa usando solo c y mandando la info en archivos y manipular la info desde es santo lenguaje sin incursión de sql.

tambor

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: ¿Arreglos o archivos?
« Respuesta #5 en: Viernes 17 de Diciembre de 2010, 04:52 »
0
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

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: ¿Arreglos o archivos?
« Respuesta #6 en: Viernes 17 de Diciembre de 2010, 05:12 »
0
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

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: ¿Arreglos o archivos?
« Respuesta #7 en: Viernes 17 de Diciembre de 2010, 05:21 »
0
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
The sweet smell of a great sorrow lies over the land.


m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: ¿Arreglos o archivos?
« Respuesta #8 en: Viernes 17 de Diciembre de 2010, 10:52 »
0
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
  1. #define TAM_VECTOR 10000
  2.  
  3. typedef struct
  4. {
  5.     float x;
  6.     float y;
  7.     float z;
  8. } tPuntoR3;
  9.  
  10. tPuntoR3 vector[TAM_VECTOR];
  11.  
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
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.
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.
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
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).
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
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?
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

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: ¿Arreglos o archivos?
« Respuesta #9 en: Sábado 18 de Diciembre de 2010, 05:59 »
0
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.

tambor

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: ¿Arreglos o archivos?
« Respuesta #10 en: Sábado 18 de Diciembre de 2010, 06:02 »
0
PD: ¿de donde sacan ese formato tipo cuaderno donde se ven las lineas de código y que es más cómodo para el lector?

morfus_bedxhed

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: ¿Arreglos o archivos?
« Respuesta #11 en: Sábado 18 de Diciembre de 2010, 06:35 »
0
Cita de: "tambor"
PD: ¿de donde sacan ese formato tipo cuaderno donde se ven las lineas de código y que es más cómodo para el lector?

solo le pones al inicio del código entre corchetes code=c ycierras entre corchetes /code

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: ¿Arreglos o archivos?
« Respuesta #12 en: Sábado 18 de Diciembre de 2010, 11:11 »
0
Eso es porque estás reasignando la memoria mal y posiblemente te quedes sin memoria. Estás haciendo malloc() por todos lados, pero no veo ni un free() en todo tu código. Además, malloc() no es para reasignar un trozo de memoria, sino para reservar uno nuevo. realloc() es para agrandar uno reservado previamente.

A todo esto, yo no veo R3 por ningún lado...  :huh:  :wacko:

Y en cuanto al resaltado de código: viewtopic.php?f=1&t=35955

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: ¿Arreglos o archivos?
« Respuesta #13 en: Sábado 18 de Diciembre de 2010, 11:25 »
0
Como dice m0skit0, estas siempre reservando nueva memoria para el mismo vector, y nunca la liberas.

Podrias porbar con realloc. Aunque puede traer problemas,hace un tiempo en un programa tenia un realloc en un ciclo bastante grande y llegaba un punto que el sistema se cansaba de darme memoria :P Aunque en ese caso mi buffer era de unos 50 megas,si te llega a pasar algo asi podes ir reservando de a bloques.
Por ejemplo al inicio reservas 10000*4 bytes. Y llevas un contador de cuento ocupaste.
Cuando usas toda esa memoria con un realloc le das un tamaño de 10000*4*2 bytes. Y asi sucesivamente.

Saludos
The sweet smell of a great sorrow lies over the land.


m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: ¿Arreglos o archivos?
« Respuesta #14 en: Sábado 18 de Diciembre de 2010, 12:41 »
0
Cita de: "Epa"
Podrias porbar con realloc. Aunque puede traer problemas,hace un tiempo en un programa tenia un realloc en un ciclo bastante grande y llegaba un punto que el sistema se cansaba de darme memoria
Eso normalmente es debido a la fragmentación de la memoria, y posiblemente no había más trozo contiguo para añadirle. Personalmente nunca me ha pasado en Linux  ^_^