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

Narcis Garcia - GiLUG informatica en actiu.net
Jue Nov 27 21:59:24 CET 2008


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





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