[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