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.

amchacon

La primera linea no va a compilar...

Y si compila no va a aceptar matrices estaticas. Solo las que se han creado dinámicamente.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

Cita de: ivancea96 en 22 Abril 2014, 22:04 PMSi os sirve de algo,
Código (cpp) [Seleccionar]
int funcion ( int matriz[][], int fila, int columna){...}

es lo mismo que
Código (cpp) [Seleccionar]
int funcion ( int **matriz, int fila, int columna){...}
No. Como ya te indico amchacon la primera declaración:
Código (cpp) [Seleccionar]
int funcion ( int matriz[][], int fila, int columna){...}
Se procesa como si fuera:
Código (cpp) [Seleccionar]
int funcion ( int (*matriz)[], int fila, int columna){...}
Y el compilador debe quejarse ya que el tipo apuntado esta incompleto: "int []".

Para que pueda compilarse se debe completar el tipo, por ejemplo:
Código (cpp) [Seleccionar]
int funcion ( int matriz[][10], int fila, int columna){...}
La cual se procesa como si fuera:
Código (cpp) [Seleccionar]
int funcion ( int (*matriz)[10], int fila, int columna){...}

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

vangodp

int **matriz, Esto es un puntero que apunta otro puntero ¿verdad señores? No lo entiendo muy bien ese mecanismo aun  :laugh:

¿Que efecto tiene poner () en (*matriz)?
As veces veo cosas como *(matriz). No digo que sea en caso de matrices ni de tablas por que no me acuerdo :), solo se que as veces lo veo como ahora y no se muy bien cual es el mecanismo que tiene eso.
¡Gracias maestros! Que fieras soys =D

Blaster

Cita de: vangodp en 23 Abril 2014, 04:44 AM
int **matriz, Esto es un puntero que apunta otro puntero ¿verdad señores? No lo entiendo muy bien ese mecanismo aun  :laugh:

En efecto eso seria un puntero a puntero.

Cita de: vangodp en 23 Abril 2014, 04:44 AM
¿Que efecto tiene poner () en (*matriz)?
As veces veo cosas como *(matriz). No digo que sea en caso de matrices ni de tablas por que no me acuerdo :), solo se que as veces lo veo como ahora y no se muy bien cual es el mecanismo que tiene eso.

En realidad no tiene ningun efecto pasarlo de esta manera

Código (cpp) [Seleccionar]
int funcion ( int matriz[][10], int fila, int columna)

Es totalmente equivalente al pasarlo de esta forma

Código (cpp) [Seleccionar]
int funcion ( int (*matriz)[10], int fila, int columna)

Tal vez sean distintas sintaxticamete pero conceptualmente son equivalentes, indicando que el parametro es un puntero a matriz de 10 int

Saludos..


rir3760

Cita de: vangodp en 23 Abril 2014, 04:44 AM¿Que efecto tiene poner () en (*matriz)?
En el caso de una declaración primero se consideran los paréntesis y corchetes (para indicar función y array, respectivamente) y solo después el '*', por ejemplo:
/* Array de <10 elementos de tipo "int *"> */
int *matriz[10];


Si se desea utilizar otro orden (primero el asterisco) se deben utilizar paréntesis:
/* Puntero a <array de 10 elementos de tipo "int"> */
int (*matriz)[10];


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ivancea96

Cita de: ivancea96 en 22 Abril 2014, 22:04 PM
Código (cpp) [Seleccionar]
int funcion ( int matriz[][], int fila, int columna){...}

Código (cpp) [Seleccionar]
int funcion ( int **matriz, int fila, int columna){...}

Fallo mío.




En verdad, no le veo la utilidad a un parámetro del tipo:
Código (cpp) [Seleccionar]
int funcion ( int matriz[][9]){...}

Pudiendo pasar:
Código (cpp) [Seleccionar]
int funcion ( int **matriz){...}

Hay alguna ganancia? Se puede pasar una matriz a cualquiera de ellos. Es más, se detecta como una redefinición en caso de poner:

Código (cpp) [Seleccionar]
void f(int *m[5]){
}
void f(int **m){
}


No se sobrecarga.

vangodp

madre mía que verde estoy con las matrices, jeje gracias chicos  :laugh:
voy a tener que ponerme a 100 con ellas que me tienen algo desconcertado  :-(

ivancea96

Quizás te ayude verlo como punteros, y como punteros de punteros, no como "matrices".

amchacon

Cita de: ivancea96 en 23 Abril 2014, 15:02 PM
En verdad, no le veo la utilidad a un parámetro del tipo:
Código (cpp) [Seleccionar]
int funcion ( int matriz[][9]){...}

Pudiendo pasar:
Código (cpp) [Seleccionar]
int funcion ( int **matriz){...}

Hay alguna ganancia? Se puede pasar una matriz a cualquiera de ellos. Es más, se detecta como una redefinición en caso de poner:

Código (cpp) [Seleccionar]
void f(int *m[5]){
}
void f(int **m){
}


No se sobrecarga.
La diferencia en que una definición espera una matriz estatica y otra definición espera punteros de punteros.

A la seguna definición no le puedes pasar una matriz estatica:
Citarerror: cannot convert 'int (*)[9]' to 'int**' for argument '1' to 'void f(int**)'|

Las matrices estáticas no se almacenan como punteros de punteros, sino como un array muy largo. Es el compilador quien traduce los dos [] [] por uno solo []. Para hacer eso necesita saber el tamaño del primero.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

vangodp

Si que puntero de puntero tiene que apuntar a puntero, y la otra pues es estática.
Algo me queda lo que me falla es lo de las () que me explicasteis antes. XDD
¡Gracias compañeros!
Voy a repasar un poco los punteros, y las matrices. Si tengo dudas y me podéis ayudar luego pues se los agradezco  ;)