[C con Clase] Prototipos!!
Steven Davidson
srd4121 en njit.edu
Mie Jun 11 20:16:58 CEST 2008
Hola Zaka,
Zaka Elab wrote:
> Hola Steven,
>
> Gracias por tu respuesta.
>
> He leído el capítulo 12 y en principio concuerda con el prototipo que
> facilitáis para el ejercicio, pero yo he hecho un pequeño ejemplo que
> no concuerda (verás que no es el mismo que el anterior, aunque
> parecido). En este pequeño código paso la variable igual que debería
> hacerse en el prototipo de Incrementa, pero el resultado que arroja
> por pantalla es el siguiente:
>
> La cadena vale: bbbb
> Ahora vale: bbbb
>
> Cuando según he entendido (corrígeme si me equivoco) por tus
> explicaciones y el Capítulo 12 la salida debería ser la siguiente:
>
> La cadena vale: bbbb
> Ahora vale: aaaa
>
> Si sirve de algo, uso gcc sobre Ubuntu (aunque esto no debería cambiar
> las cosas).
>
Veamos el código.
> #include <iostream>
>
> using namespace std;
>
> void foo(char a[10]){
> a="aaaa";
El compilador debería darte un error. No puedes asignar una cadena a un
array de esta manera. Lo que realmente estás diciendo es asigna la
dirección de memoria de "aaaa" al valor del array 'a'. Esto no es
posible porque técnicamente un array _ES_ una dirección de memoria.
Puedes pensar que un array es un puntero constante. Por lo tanto, no
tiene sentido, y de hecho es un error, asignar una dirección de memoria
a una constante.
Lo que sí podrías hacer es usar un puntero como parámetro. Por ejemplo,
void foo( char *ptr )
{
ptr = "aaaa";
}
Sin embargo, esto tampoco tiene sentido, porque 'ptr' es una variable
local, que será destruida nada más terminar esta función. Esto significa
que su valor - la dirección de memoria de "aaaa" - también se perderá.
Para ello, tendrías que pasar un doble puntero o una referencia al
puntero. Por ejemplo,
void foo( char **ptr )
{
*ptr = "aaaa";
}
Invocaríamos esta función así:
int main()
{
char *pszcad=0;
foo( &pszcad );
cout << pszcad << endl;
return 0;
}
De todas maneras, esto no resuelve el problema original: modificar el
contenido del array. Debes acceder a cada elemento y modificarlo. Por
ejemplo,
void foo( char a[10] )
{
for( int i=0; i<10 && a[i] != '\0'; i++ )
a[i] = 'a';
}
Espero haber aclarado la duda.
Steven
Más información sobre la lista de distribución Cconclase