elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con matrices y paso por parametro
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con matrices y paso por parametro  (Leído 7,220 veces)
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda con matrices y paso por parametro
« Respuesta #20 en: 24 Abril 2014, 15:27 pm »

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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define FIL   4
  5. #define COL   3
  6. #define   N   0 /*prueba y dale un valor positivo o negativo inferior a COL
  7.                  y observa que si es positivo de COL te vas mas alla de las
  8.                  direcciones que estaban reservadas, malo, malo, y si es
  9.                  negativo observa como sobreescribes las posiciones
  10.                  ateriores del array*/
  11.  
  12.  
  13. void matriz ( int a0[]/*[FIL]*/[COL-N]){ /* dos opciones*/
  14.  int i=0, j;
  15.  printf ("\n\t\tFUNCION COL(%d)-N(%d)=%d\n\n",COL,N,COL-N);
  16.  for (i=0;i<FIL;i++){
  17.    for (j=0;j<COL;j++){
  18.      printf ("a0[%d][%d]=%2d  &=%d  ",i,j,a0[i][j],/**(a0+i)+j*/(int)&a0[i][j]);
  19.    }
  20.    putchar('\n');
  21.  }
  22. }
  23.  
  24. void matriz1 ( int **a1){
  25.  int i=0, j;
  26.  puts ("\n\t\tFUNCION 1\n");
  27.  for (i=0;i<FIL;i++){
  28.    for (j=0;j<COL;j++){
  29.      printf ("a1[%d][%d]=%2d  &=%d  ",i,j,a1[i][j],(int)&a1[i][j]);
  30.    }
  31.    putchar('\n');
  32.  }
  33. }
  34.  
  35. void matriz2 ( int *a2[COL]){
  36.  int i=0, j;
  37.  puts ("\n\t\tFUNCION 2\n");
  38.  for (i=0;i<FIL;i++){
  39.    for (j=0;j<COL;j++){
  40.      printf ("a2[%d][%d]=%2d  &=%d  ",i,j,a2[i][j],(int)&a2[i][j]);
  41.    }
  42.    putchar('\n');
  43.  }
  44. }
  45.  
  46. int main(){
  47.  int i=0, j,k=0,**a_ ,a[FIL][COL];
  48.  puts ("\n\t\tMAIN DECLARACION\n");
  49.  puts ("\n\t1 Direcciones en MAIN Estatico\n");
  50.  for (i=0;i<FIL;i++){
  51.    for (j=0;j<COL;j++)
  52.      printf ("\t&=%d  ",(int)&a[i][j]);
  53.    putchar('\n');
  54.  }
  55.  a_ = malloc( FIL * sizeof *a_ );
  56.  for( i = 0; i < FIL; i++ )
  57.    a_[i] = malloc( COL * sizeof **a_ );
  58.  
  59.  puts ("\n\t2 Direcciones en MAIN Dinamico\n");
  60.  for (i=0;i<FIL;i++){
  61.    for (j=0;j<COL;j++)
  62.      printf ("\t&=%d  ",(int)&a_[i][j]);
  63.    putchar('\n');
  64.  }
  65.  putchar('\n');
  66.  printf ("\n\t\tMAIN RELLENO COL=%d\n\n",COL);
  67.  for (i=0;i<FIL;i++){
  68.    for (j=0;j<COL;j++,k++){
  69.    a[i][j]=k;
  70.    printf ("a[%d][%d]=%2d  &=%d  ",i,j,a[i][j],(int)&a[i][j]);
  71.    }
  72.    putchar('\n');
  73.  }
  74.  putchar('\n');
  75.  for (i=0;i<FIL;i++){
  76.    for (j=0;j<COL;j++,k++){
  77.    a_[i][j]=k;
  78.    printf ("a_[%d][%d]=%2d  &=%d  ",i,j,a_[i][j],(int)&a_[i][j]);
  79.    }
  80.    putchar('\n');
  81.  }
  82.  matriz (a);
  83.  putchar('\n');
  84.  matriz1 (a_);
  85.  putchar('\n');
  86.  matriz2 (a_);
  87.  for( i= 0; i<FIL; ++i )
  88.    free(a_[i]);
  89.  free(a_);
  90.  a_ = NULL;
  91.  return 0;
  92. }

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! ..... !!!!





« Última modificación: 24 Abril 2014, 16:01 pm por leosansan » En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Duda con matrices y paso por parametro
« Respuesta #21 en: 24 Abril 2014, 17:08 pm »

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


En línea

Páginas: 1 2 [3] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Paso de flujos por parametro
Programación C/C++
darkvidhack 3 2,475 Último mensaje 17 Mayo 2011, 22:48 pm
por satu
Paso de parametro por referencia
Programación C/C++
abad023 5 3,087 Último mensaje 6 Diciembre 2011, 08:21 am
por x64core
duda del parametro -d en iptables
Seguridad
sancakoky 2 2,409 Último mensaje 23 Marzo 2012, 12:12 pm
por adastra
sfml paso por parametro de window
Programación C/C++
patilanz 0 1,589 Último mensaje 18 Octubre 2014, 19:24 pm
por patilanz
Problema con Paso de Tablas Bidimensionales como parámetro
Programación C/C++
jamatbar 1 2,060 Último mensaje 10 Diciembre 2014, 16:21 pm
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines