[C con Clase] Capitulo 12c

Steven Davidson steven en conclase.net
Mie Feb 7 19:47:00 CET 2007


Hola David,

El pasado 2007-02-07 15:05:06, David escribió:

D> Hola de nuevo a todos. Steven, se me están aclarando las dudas, ahora entiendo mucho mejor algunas cosas, sin embargo, hay cosas que aun no las pillo del todo. Voy a hacer unos cuantos de ejercicios de punteros a ver si me doy cuenta de que es lo que pasa con esto &Mes2[11][10]-mes2[0], porque yo sigo viendo un elemento menos de lo que debería aparecer en la dimensión del puntero.
D> "cada puntero de Mes2 es una cadena de la longitud adecuada 
D>   para almacenar cada mes." <--Capítulo 12c,  zona de ejemplos
D> Según esto, &Mes2[11][10], es incorrecto, lo correcto sería &Mes2[11][9], porque del 0 al 9 hay 10 caracteres. El resto lo he entendido todo, es más lo he impreso por si en un futuro se me olvida ;-).

Quiero reiterar que al usar 'Mes2' estamos manipulando punteros los cuales cada uno apunta a una caden localizada arbitrariamente en memoria. Por lo tanto, el cálculo que haces al escribir: &Mes2[11][10]-Mes2[0] puede salir algo como 0 (cero), 4 mil millones, o incluso un número negativo como -10000. Por lo tanto, no veo que necesites continuar experimentando con esto, porque es completamente arbitrario. Ahora bien, si garantizas que los punteros apuntan a cadenas, las cuales existen contiguamente en memoria, entonces sí podemos aplicar un cálculo como el tuyo. Por ejemplo,

const char meses[] = "Enero\0Febrero\0Marzo\0Abril\0Mayo\0Junio\0Julio\0Agosto\0Septiembre\0Octubre\0Noviembre\0Diciembre";

const char *Mes2[] = { &meses[0],  &meses[6],  &meses[14], &meses[20], 
                       &meses[26], &meses[31], &meses[37], &meses[43], 
                       &meses[50], &meses[61], &meses[69], &meses[79] };

Aquí sí podríamos aplicar tu fórmula. Esto sería,

cout << "Cantidad total: " << &Mes2[11][10]-Mes2[0] << endl;


En cuanto al uso de '&Mes2[11][10]', sí es correcto. Efectivamente, la cadena apuntada, "Diciembre", contiene 9 caracteres más el carácter nulo. Sin embargo, el programa que estamos analizando nos dice la cantidad de bytes que ocupa el array bidimensional 'Mes' al escribir 'sizeof Mes'. Por lo tanto, el cálculo que estamos haciendo realmente debería ser:

cout << "Cantidad total: " << 1+&Mes2[11][9]-Mes2[0] << endl;

Agregamos 1 para contar el carácter nulo y así obtenemos la cantidad total de bytes de las cadenas.

Como estamos tratando caracteres de tipo 'char', entonces en lugar de sumar 1 en la expresión, pudimos agregar 1 byte=char al índice del array.


Espero que ahora así hayamos aclarado la duda.

Steven


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