Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: crawler! en 23 Junio 2013, 23:02 pm



Título: [C] Devolver array bidimensional mediante una función
Publicado por: crawler! en 23 Junio 2013, 23:02 pm
¿es posible? Y si lo es, ¿cómo se hace? Soy bastante novato y me vendria bien una ayudita  ;D Saludos!


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: amchacon en 23 Junio 2013, 23:39 pm
No es posible devolver un array bidimensional (bueno en realidad hay un truquillo para hacerlo usando memoria dinámica pero no vale la pena).

Lo que se suele hacer es pasar el array a la funcion:

Código
  1. void Funcion(int Matriz[5][5])
  2. {
  3.  
  4.  // ...
  5.  
  6. }

La matriz conservará los cambios al finalizar la función ;)


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: crawler! en 24 Junio 2013, 00:09 am
Gracias por responder amchacon!

Quieres decir que cuando le pasas un array como parámetro se pasa automáticamente por referencia ¿no? ¿Así de simple? ¿no es necesario usar punteros ni nada? Yo habia pensado en utilizar

Código:
void Matriz(int *[10]);

void Matriz(int (*m)[10]) {
      (modificación de la matriz)
}

int main()
. . .
int mat[10][10];
Matriz(mat);
. . .

¿Existe alguna diferencia entre usar este código y usar el que me has dicho? A ver si me puedes aclarar esto por que el tema de los punteros no me acaba de quedar claro.

Saludos.


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: ThePinkPanther en 24 Junio 2013, 02:13 am
Código:
#include <iostream>
#include <vector>
#define longz 10
using namespace std;
void Matriz(int (*m)[10]) {

for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
    cout<<m[i][j];
}


}


int main()
{
int mat[10][10];
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
    mat[i][j]=j;
}
Matriz(mat);
}


Así anda. :P
y de la otra forma tambien, no se si existe una diferencia .
aunque no es necesario usar punteros,directamente se pasa por referencia , podes usar el modificador const para que no se modifique el array, si es que vas a realizar solo operaciones de lectura


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: crawler! en 24 Junio 2013, 02:43 am
Ese code no es de C++? De todos modos he utilizado el método que me ha dicho emchacon y funciona tal como deseaba :) Sólo queria saber si en este caso, cuando se trata de arrays, hay alguna diferencia entre utilitzar punteros o no, ya que diria que sólo es útil cuando trabajas con tipos de datos que se envian por valor, p.e. ints, chars, etc. Pero el problema está solucionado ;)


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: ecfisa en 24 Junio 2013, 03:03 am
Hola  crawler!.

Citar
¿Existe alguna diferencia entre usar este código y usar el que me has dicho?

Ambas formas son equivalentes:
Código
  1. // mat como arreglo de arreglos de 3 enteros
  2. void cargar1(int mat[][3], int rows)
  3. {
  4.  int c , r;
  5.  for(r = 0; r < rows; r++)
  6.    for(c = 0;c < 3; c++)
  7.      mat[r][c] = c + r;
  8.  
  9. }
  10.  
  11. // mat como puntero a un arreglo de tres enteros
  12. void cargar2(int (*mat)[3], int rows)
  13. {
  14.  int c, r;
  15.  for(r = 0; r < rows; r++)
  16.    for(c = 0;c < 3 ;c++)
  17.      mat[r][c] = c + r;
  18. }
  19.  

Otra forma de pasar el arreglo bidimensional por referencia (accediendo como C/C++ lo almacenan en memoria) es:

Código
  1. // mat como puntero al primer elemento del arreglo
  2. void cargar3(int *mat, int cols, int rows)
  3. {
  4. int c, r;
  5.  for(r = 0; r < rows; r++)
  6.    for(c = 0; c < cols; c++)
  7.      mat[r * cols + c] = r + c;
  8. }
  9.  

Saludos :)


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: ThePinkPanther en 24 Junio 2013, 03:41 am


Otra forma de pasar el arreglo bidimensional por referencia (accediendo como C/C++ lo almacenan en memoria) es:

Código
  1. // mat como puntero al primer elemento del arreglo
  2. void cargar3(int *mat, int cols, int rows)
  3. {
  4. int c, r;
  5.  for(r = 0; r < rows; r++)
  6.    for(c = 0; c < cols; c++)
  7.      mat[r * cols + c] = r + c;
  8. }
  9.  



esto es unidimensional.


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: ecfisa en 24 Junio 2013, 04:21 am
Citar
esto es unidimensional.

Hola ThePinkPanther.

La forma de acceso dentro de la función es lineal, pero el argumento enviado es un arreglo bidimensional y a eso me refiero en el mensaje anterior: 
Citar
Otra forma de pasar el arreglo bidimensional por referencia ...


Como ejemplo, este código incrementa en uno cada elemento de un arreglo declarado como bidimensional y de ese modo es enviado a la función como argumento:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void load(int *mat, int, int);
  5. void show(int mat[][3], int);
  6.  
  7. int main(int argc, char* argv[])
  8. {
  9.  int mat[3][3] = {{0,1,2}, {3,4,5}, {6,7,8}};
  10.  load(mat, 3, 3);
  11.  show(mat, 3);
  12.  getchar();
  13.  return 0;
  14. }
  15.  
  16. void load(int *mat, int cols, int rows)
  17. {
  18. int c, r;
  19. for(r = 0; r < rows; r++)
  20.   for(c = 0; c < cols; c++)
  21.     mat[r * cols + c] += 1;
  22. }
  23.  
  24. void show(int mat[][3], int rows)
  25. {
  26.  int c, r;
  27.  for(r = 0; r < rows; r++){
  28.    for(c = 0; c < 3; c++)
  29.      printf("%d ",mat[r][c]);
  30.    printf("\n");
  31.  }
  32. }
  33.  

Es decir, el modo de acceso que se utilice dentro de la función no altera el caracter bidimensional de la declaración del arreglo.

Saludos. :)


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: crawler! en 24 Junio 2013, 05:06 am
Muchas gracias ecfisa!! A mi también me había quedado la duda de si en el tercer ejemplo mat se declaraba como un array unidimensional, pues yo creía que siempre era necesario indicar la longitud de los arrays (a partir del 1ero). Además al compilar recibes el siguiente warning "passing arg 1 of 'Function' from incompatible pointer type" pero supongo que mientras funcione bien... :D


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: ecfisa en 24 Junio 2013, 05:33 am
Hola crawler!.

Si estas compilando el ejemplo bajo C++, tendrías que agregar:
Código
  1.  ...
  2.  load((int*)mat, 3, 3);
  3.  
Reemplazar por los header files correspondientes y los printf por cout (si no se me escapa algo mas...).

Saludos. :)


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: ThePinkPanther en 24 Junio 2013, 06:29 am

Es decir, el modo de acceso que se utilice dentro de la función no altera el caracter bidimensional de la declaración del arreglo.



uhh habia mal entendido jaja. un saludo !!!


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: amchacon en 24 Junio 2013, 11:59 am
Gracias por responder amchacon!

Quieres decir que cuando le pasas un array como parámetro se pasa automáticamente por referencia ¿no? ¿Así de simple? ¿no es necesario usar punteros ni nada?
El truco es que los arrays se almacenan "con un puntero a su primer elemento" por lo tanto no es necesario pasarlo por referencia, es implícito al estar usando punteros.


Título: Re: [C] Devolver array bidimensional mediante una función
Publicado por: crawler! en 24 Junio 2013, 22:00 pm
Gracias a todos x vuestras respuestas me habeis sido de gran ayuda!! ;-)

Salu2.