[C con Clase] Tamanyo de una matriz externa dentro de una funcion

Narcis Garcia - GiLUG informatica en actiu.net
Jue Nov 27 22:27:36 CET 2008


Entiendo entonces que para pasar matrices a una función de momento no
hay más remedio que añadir un parámetro con su tamaño, debido a que este
dato (o su referencia) se pierde por el camino.

C++ debe almacenar en algun lugar lo que ocupa una matriz. ¿Este dato
sólo es accesible mediante la precaria función sizeof() ? ¿Cómo lo hace
sizeof() para encontrar el tamaño de los datos de una matriz?

El dj 27 de 11 de 2008 a les 21:59 +0100, en/na Narcis Garcia - GiLUG va
escriure:
> Creo que la terminología que usé en mi consulta fue la precisa.
> Ya entendí que las matrices se pasan siempre por referencia (pero se
> copia un puntero, que es la referencia).
> 
> Mis pruebas:
> 
> --------
> CODIGO 1
> --------
> 
> #include <iostream>
> using namespace std;
> 
> int TamanyoVariable(long double VariableDentro[])
> {
> 	return sizeof(VariableDentro);
> }
> 
> int main()
> {
>     long double VariablePrincipal[10U];
>     cout << "Un elemento mide: " << sizeof(VariablePrincipal[0]) <<
> endl;
>     cout << "Todos los datos miden: " << sizeof(VariablePrincipal) <<
> endl;
>     cout << "La funcion ve un tamanyo de: " <<
> TamanyoVariable(VariablePrincipal) << endl;
>     return 0;
> }
> 
> // Salida de pantalla:
> // Un elemento mide: 12
> // Todos los datos miden: 120
> // La funcion ve un tamanyo de: 4
> 
> 
> --------
> CODIGO 2
> --------
> 
> #include <iostream>
> 
> using namespace std;
> 
> int TamanyoVariable(long double &VariableDentro)
> {
> 	return sizeof(VariableDentro);
> }
> 
> int main()
> {
>     long double VariablePrincipal;
>     cout << "Un elemento mide: " << sizeof(VariablePrincipal) << endl;
>     cout << "Todos los datos miden: " << sizeof(VariablePrincipal) <<
> endl;
>     cout << "La funcion ve un tamanyo de: " <<
> TamanyoVariable(VariablePrincipal) << endl;
>     return 0;
> }
> 
> // Salida de pantalla:
> // Un elemento mide: 12
> // Todos los datos miden: 12
> // La funcion ve un tamanyo de: 12
> 
> 
> 
> El dj 27 de 11 de 2008 a les 13:03 -0500, en/na srd4121 en njit.edu va
> escriure:
> > Hola Narcis,
> > 
> > Quoting Narcis Garcia - GiLUG <informatica en actiu.net>:
> > 
> > > Tal y como leo en el curso de C++:
> > > http://c.conclase.net/curso/index.php?cap=015b
> > > Al pasar una matriz como parámetro de una función, en realidad se pasa
> > > un puntero, o sea, que no se pasan patrices por valor sino siempre por
> > > referencia.
> > > 
> > 
> > Ten mucho cuidado con la terminología que usas. Conceptualmente y desde el punto
> > de vista de los valores en el array (o matriz), es cierto que éstos son pasados
> > por referencia. Sin embargo, técnicamente, en C/C++, no estamos pasando la
> > matriz por referencia sino por copia. Lo que copiamos es el puntero. Por eso,
> > podemos emular el paso por referencia usando punteros; esto se suele decir de C.
> > Al final, el resultado es el mismo: manipulamos los valores originales
> > contenidos en el array o matriz. 
> > 
> > > Así pues, en esta función, en un entorno de 32bits, como tamaño de la
> > > variable se obtiene 4 (4 bytes del puntero), y no el tamaño de los
> > > datos:
> > > 
> > > void MiFuncion(int LaMatriz[])
> > > {
> > > int NrElementosMatriz;
> > > NrElementosMatriz = sizeof(MiMatriz)/sizeof(MiMatriz[0]);
> > > return 0;
> > 
> > Por cierto, aquí no debería haber ninguna sentencia 'return', ya que esta
> > función no retorna un valor.
> > 
> > > }
> > > 
> > > ¿Cómo puedo obtener el tamaño de los datos referidos?
> > 
> > No puedes averiguar su tamaño basándote en el array. Lo que debes hacer es
> > rediseñar la función para aceptar este otro dato: el tamaño. Por ejemplo,
> > 
> > void MiFuncion( int array[], int nElem );
> > 
> > Con esto, la invocación o la parte del código que invoque esta función se
> > encarga de averiguar y pasar el tamaño del array.
> > 
> > > ¿sizeof se comporta igual cuando pasamos una variable cualquiera por
> > > referencia?
> > > 
> > 
> > Nuevamente, hay que tener cuidado con los términos. Si te refieres al paso por
> > referencia que implementa C++, usando el símbolo &, entonces sí. El operador
> > 'sizeof' funcionará correctamente. Recuerda que una referencia no es más que un
> > sobrenombre o apodo; es decir, otro nombre para la variable original. De esta
> > manera, decimos que una referencia se refiere a la misma variable y por tanto
> > obtenemos el mismo valor.
> > 
> > 
> > Espero haber aclarado las dudas.
> > 
> > Steven
> > 
> > 
> > _______________________________________________
> > Lista de correo Cconclase Cconclase en listas.conclase.net
> > http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> > Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> 
> 
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ





Más información sobre la lista de distribución Cconclase