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

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Devolver array bidimensional mediante una función
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [C] Devolver array bidimensional mediante una función  (Leído 21,091 veces)
crawler!

Desconectado Desconectado

Mensajes: 5


Ver Perfil
[C] Devolver array bidimensional mediante una función
« 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!


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [C] Devolver array bidimensional mediante una función
« Respuesta #1 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 ;)


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
crawler!

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: [C] Devolver array bidimensional mediante una función
« Respuesta #2 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.
« Última modificación: 24 Junio 2013, 00:13 am por crawler! » En línea

ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: [C] Devolver array bidimensional mediante una función
« Respuesta #3 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
« Última modificación: 24 Junio 2013, 02:16 am por ThePinkPanther » En línea

crawler!

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: [C] Devolver array bidimensional mediante una función
« Respuesta #4 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 ;)
En línea

ecfisa

Desconectado Desconectado

Mensajes: 114


Ver Perfil
Re: [C] Devolver array bidimensional mediante una función
« Respuesta #5 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 :)
En línea

ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: [C] Devolver array bidimensional mediante una función
« Respuesta #6 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.
En línea

ecfisa

Desconectado Desconectado

Mensajes: 114


Ver Perfil
Re: [C] Devolver array bidimensional mediante una función
« Respuesta #7 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. :)
En línea

crawler!

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: [C] Devolver array bidimensional mediante una función
« Respuesta #8 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
En línea

ecfisa

Desconectado Desconectado

Mensajes: 114


Ver Perfil
Re: [C] Devolver array bidimensional mediante una función
« Respuesta #9 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. :)
« Última modificación: 24 Junio 2013, 05:35 am por ecfisa » En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Array bidimensional en pascal.
Ejercicios
sv51 4 14,067 Último mensaje 21 Junio 2008, 22:30 pm
por sv51
Inicializar array bidimensional con palabras
Programación C/C++
folostia 5 4,398 Último mensaje 21 Diciembre 2011, 16:21 pm
por folostia
Ordenar array bidimensional
Java
KaRaLLo 5 18,712 Último mensaje 1 Abril 2013, 02:36 am
por seraff
Ayuda con Array bidimensional
Programación General
Javaniano 0 2,012 Último mensaje 8 Diciembre 2012, 13:38 pm
por Javaniano
Crear un array de caracteres mediante una funcion.
Programación C/C++
euroesp 6 3,276 Último mensaje 28 Julio 2016, 19:37 pm
por euroesp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines