[C con Clase] Punteros arrays y memoria.

Daniel Dagnino ddagnino en gmail.com
Jue Ene 11 18:36:01 CET 2007


Buenas a todos,

antes de nada os comento que yo programaba en Fortran y me decidí a pasar a
C porque me dijeron que era mejor y a mi me interesa ya que trabajo haciendo
simulaciones numéricas. Lo que más me interesa ahora es el ahorro de memoria
cuando trabajo con matrices muy grandes. Mirando el manual de C con clase
 he visto como definir un puntero (ej: **A) que me permite crear una matriz
a mitad de programa con la dimensión que corresponda (y así no tener que
hacer dos programas, uno para calcular la dimensión y otro para trabajar con
las matrices), sin embargo resulta que los punteros ocupan memoria (N*M
espacios de memoria adicionales para los punteros) que no es necesaria
definiendo la matriz al inicio del programa (ej: A[N][M]) como un array de
dos dimensiones. Así que mi pregunta es si un  programa sencillo como



#include <iostream>
void funcion(int B[1][2]);

int main() {
    int A[1][2];

    A[0][0]=1; A[0][1]=2; A[0][2]=3;
    A[1][0]=4; A[1][1]=5; A[1][2]=6;

    funcion(A);
    printf("A =  %i  %i  %i \n",A[0][0], A[0][1], A[0][2]);
    printf("     %i  %i  %i \n",A[1][0], A[1][1], A[1][2]);

    getchar();
}

void funcion(int B[1][2]){
     B[0][0]=9; B[0][1]=9; B[0][2]=9;
     B[1][0]=9; B[1][1]=9; B[1][2]=9;
}

es más económico que

#include <iostream>

void funcion(int **B);
int main() {
   int i,n,m,**A;

   n=2; m=3;
   A=new int *[n];
   for (i=0;i<n;i++){A[i]=new int [m];}

   A[0][0]=1; A[0][1]=2; A[0][2]=3;
   A[1][0]=4; A[1][1]=5; A[1][2]=6;
   funcion(A);

   printf("A =  %i  %i  %i \n",A[0][0], A[0][1], A[0][2]);
   printf("     %i  %i  %i \n",A[1][0], A[1][1], A[1][2]);

   for (i=0;i<n;i++){delete[] A[i];}
   delete[] A;
   getchar();
}

void funcion(int **B){
   B[0][0]=9; B[0][1]=9; B[0][2]=9;
   B[1][0]=9; B[1][1]=9; B[1][2]=9;
}


Si ahora tengo una matriz simétrica (A[i][j]=A[j][i]) y quiero ahorrar la
memoria repetida lo que tendré es una "matriz triangular".  Mi pregunta
es si me creo una estructura para almacenar esto la estructura también
almacena punteros o no, ahorro  memoria con la estructura o es la misma que
creando un puntero con la forma de la estructura.

Una ultima preguntita más. Como puedo medir el tamaño de una estructura y
sus punter para ver si me paso de la memoria RAM de mi ordenador.

Al que me conteste estas preguntas ya de antemano le doy un millón de
gracias (10e6*gracias).
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20070111/a31f96bc/attachment.html>


Más información sobre la lista de distribución Cconclase