Duda con matrices y paso por parametro

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

0 Miembros y 1 Visitante están viendo este tema.

patilanz

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 ?

Saludos

engel lex

por el tipo de variable....

columna = memoria_inicial + tamaño_de_la_variable*posicion

fila = memoria_inicial +  tamaño_de_la_variable*cantidad_de_columnas*posicion

esa es la teoria, creo...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

eferion

El motivo es porque la memoria en el caso de las matrices se alinea por columnas ( o filas, depende de cómo se mire ). Me explico.

Si defines una matriz tal que int matriz[3][2]; en memoria se crea el siguiente mapa:

[0,0][1,0][2,0][0,1][1,1][2,1]

Como se ve, el tamaño de cada "bloque" se corresponde con el primer valor ( filas o columnas a gusto del consumidor )... el segundo valor determina el número de bloques.

Al compilador le da igual (por que no lo va a comprobar) cual es el tamaño real del buffer. Únicamente necesita conocer el tamaño de cada "bloque" para poder calcular el desplazamiento ... el número de bloques es irrelevante para él... si te pasas ya se encargará el SO de darte un par de collejas.

vangodp

a ver jeje cada vez que veo algo sobre matrices me lio mas y eso que ja lo tengo entendio  ;D

El orden es el tuyo o es este por que en el vídeo este el la pinta así y ahora me lio XD:
https://www.youtube.com/watch?v=TEyLHaTFGEU
[0,0][0,1]
[1,0][1,1]
[2,0][2,1]

[col][fil]
[col][fil]
[col][fil]

[0,0][0,1][1,0][1,1][2,0][2,1]
|------------------------------>

¿No?

[0,0][0,1]
               [1,0][1,1]
                             [2,0][2,1]

así no??  :huh:
o puede que lo aya entendió mal no se XDD

eferion

Cierto, me confundí con fortran.

En cualquier caso, el fundamento es el mismo... en el caso de una matriz bidimensional tienes que proporcionar el tamaño del bloque, da igual que sea filas o columnas.

En el caso de un vector no es necesario indicar ningún tamaño porque no hay bloques... solo un buffer de tamaño desconocido para el compilador ( no olvidemos que el parámetro que se pasa no deja de ser un puntero, independientemente de que el argumento sea un vector o una matriz )

rir3760

Cita de: patilanz en 22 Abril 2014, 07:51 AMpara pasar matrices hay que indicar la longitud de la columna pero no se porque
Porque es parte del tipo.

Lo que tu llamas matriz es un array donde cada uno de sus elementos es también un array. Por ejemplo con la sentencia:
Código (cpp) [Seleccionar]
int mat[N][M];
Se declara el array "mat" de N elementos cada uno de tipo "int [M]".

Cita de: patilanz en 22 Abril 2014, 07:51 AMMi pregunta es como sabe c++ o el compilador el tamaño de las filas ?
No lo sabe. Si declaras una función en cualquiera de las dos formas:
Código (cpp) [Seleccionar]
/* A */ int fn(int a[N]);
/* B */ int fn(int a[ ]);

La declaración en realidad es:
Código (cpp) [Seleccionar]
/* C */ int fn(int *a);
Ello porque los arrays no se pasan por valor, en su lugar el argumento es la dirección en memoria del primer elemento.

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

amchacon

Te pide el tamaño de la fila para que el compilador pueda hacer la conversión matriz -> array internamente.
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

A ver compañeros :) gracias por aclarar que hasta yo me lio con eso XDD

Si creo una matriz que digamos así: int matriz [][];

Y quiero que la columna sea matriz [columna][] y la fila matriz[][fila] tal que quede matriz[columna][fila];

¿a la funcion como le paso eso?

¿asi?   int funcion ( int matriz[ ][tamaño de la fila], int columna){...}

Por que tengo un lio de copón como los demás aquí, con tanta filafila columna columna y cada uno lo llama como le gusta XDD :laugh:

amchacon

Tamaño fila debe conocerse durante la compilación. Por lo que no puede ser una variable global que tengas por ahi (aunque una constante si valdria).

Si estas en C++. Puedes hacer un vector de vector. Asi no te lias ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

ivancea96

Si 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){...}