Duda con matrices y paso por parametro

Iniciado por patilanz, 22 Abril 2014, 07:51 AM

0 Miembros y 2 Visitantes están viendo este tema.

leosansan

#20
Cita de: patilanz en 22 Abril 2014, 07:51 AM
Hola se que para pasar matrices hay que indicar la longitud de la columna pero no se porque ya que en la memoria están organizados uno a continuación del otro. Mi pregunta es como sabe c++ o el compilador el tamaño de las filas ?


El tamaño de las filas no lo sabe el compilador ¡!!¡. Como indicó eferion, es problema del programador atenerse a las dimensiones que previamente se han introducido y, por lo tanto los bloques de memoria que se han reservado para el array,  bien de forma estática o dinámica.

Aquí me surge una duda con el código que pongo a continuación y en el que las posiciones de memoria son consecutivas en el caso de una matriz estática, pero no así con una matriz dinámica. Además la diferencia de 16  es para este compilador, ya que en otros me da 24. ¿Es normal o estoy haciendo algo mal?:


Citar

               MAIN DECLARACION


       1 Direcciones en MAIN Estatico

       &=2686688       &=2686692       &=2686696
       &=2686700       &=2686704       &=2686708
       &=2686712       &=2686716       &=2686720
       &=2686724       &=2686728       &=2686732

       2 Direcciones en MAIN Dinamico

       &=4069016       &=4069020       &=4069024
       &=4069040       &=4069044       &=4069048
       &=4069064       &=4069068       &=4069072
       &=4069088       &=4069092       &=4069096


Y el código dedicado al amigo vangodp con el paso a una función de una matriz estática, observa que tengo dos posibilidades, y de una matriz dinámica, también con dos posibilidades. Tiene la impresión de las direcciones de memoria, con una opción variable, para aclarar ¿? como por un lado se reservan las direcciones de memoria, con la sola declaración de la matriz, y por otro lado como esas posiciones justamente son las que se rellenan y siempre que nos atengamos a las dimensiones correctas en el relleno, si no nos podemos ir más allá de las posiciones de memoria reservadas o machacar las posiciones anteriores de la matriz:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

#define FIL   4
#define COL   3
#define   N   0 /*prueba y dale un valor positivo o negativo inferior a COL
                 y observa que si es positivo de COL te vas mas alla de las
                 direcciones que estaban reservadas, malo, malo, y si es
                 negativo observa como sobreescribes las posiciones
                 ateriores del array*/


void matriz ( int a0[]/*[FIL]*/[COL-N]){ /* dos opciones*/
 int i=0, j;
 printf ("\n\t\tFUNCION COL(%d)-N(%d)=%d\n\n",COL,N,COL-N);
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++){
     printf ("a0[%d][%d]=%2d  &=%d  ",i,j,a0[i][j],/**(a0+i)+j*/(int)&a0[i][j]);
   }
   putchar('\n');
 }
}

void matriz1 ( int **a1){
 int i=0, j;
 puts ("\n\t\tFUNCION 1\n");
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++){
     printf ("a1[%d][%d]=%2d  &=%d  ",i,j,a1[i][j],(int)&a1[i][j]);
   }
   putchar('\n');
 }
}

void matriz2 ( int *a2[COL]){
 int i=0, j;
 puts ("\n\t\tFUNCION 2\n");
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++){
     printf ("a2[%d][%d]=%2d  &=%d  ",i,j,a2[i][j],(int)&a2[i][j]);
   }
   putchar('\n');
 }
}

int main(){
 int i=0, j,k=0,**a_ ,a[FIL][COL];
 puts ("\n\t\tMAIN DECLARACION\n");
 puts ("\n\t1 Direcciones en MAIN Estatico\n");
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++)
     printf ("\t&=%d  ",(int)&a[i][j]);
   putchar('\n');
 }
 a_ = malloc( FIL * sizeof *a_ );
 for( i = 0; i < FIL; i++ )
   a_[i] = malloc( COL * sizeof **a_ );

 puts ("\n\t2 Direcciones en MAIN Dinamico\n");
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++)
     printf ("\t&=%d  ",(int)&a_[i][j]);
   putchar('\n');
 }
 putchar('\n');
 printf ("\n\t\tMAIN RELLENO COL=%d\n\n",COL);
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++,k++){
   a[i][j]=k;
   printf ("a[%d][%d]=%2d  &=%d  ",i,j,a[i][j],(int)&a[i][j]);
   }
   putchar('\n');
 }
 putchar('\n');
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++,k++){
   a_[i][j]=k;
   printf ("a_[%d][%d]=%2d  &=%d  ",i,j,a_[i][j],(int)&a_[i][j]);
   }
   putchar('\n');
 }
 matriz (a);
 putchar('\n');
 matriz1 (a_);
 putchar('\n');
 matriz2 (a_);
 for( i= 0; i<FIL; ++i )
   free(a_[i]);
 free(a_);
 a_ = NULL;
 return 0;
}


Espero no haber metido la pata, al menos he logrado que  no me lance ningún warning y si no ha sido así comprensión por vuestro lado que  la intención ha sido la mejor. ;)


¡¡¡¡ Saluditos! ..... !!!!




vangodp

voy a estudiarlo leo =D
que fiera jeje, me has dedicado un tutorial entero  ;-)
¡Luego te lo comento muchas gracias!