CONTENIDO DE LA LECCIÓN 18
CONTENIDO DE LA LECCIÓN 18 CONTENIDO DE LA LECCIÓN 18
MIGUEL Á. TOLEDO MARTÍNEZ respectivo (ceros para arreglos de enteros y de punto flotante y terminadores nulos para arreglos de caracteres) El siguiente es un ejemplo: int enteros[5]; void main(void) { static char caracteres[5]; } // FINAL DE main() Se ha definido en forma global el arreglo enteros y también como un arreglo estático local al arreglo caracteres dentro de main() La inspección de estos arreglos con un depurador revelará lo siguiente: RESULTADOS DEL DEPURADOR Inspección de enteros Inspección de caracteres [0] 0 [0] ‘\0’ [1] 0 [1] ‘\0’ [2] 0 [2] ‘\0’ [3] 0 [3] ‘\0’ [4] 0 [4] ‘\0’ El depurador muestra que el arreglo global de enteros se ha inicializado con ceros, mientras que el arreglo de caracteres estático se ha inicializado con caracteres de terminador nulo. Si define un arreglo con ámbito de bloque local que no es estático y no lo inicializa, el compilador no suministrará ningún valor de inicialización predeterminado. ¡El arreglo contendrá basura! De esta manera, si elimináramos la palabra clave static de la definición anterior del arreglo caracteres, el depurador revelará valores arbitrarios de memoria en el arreglo. Aquí está un resumen de la explicación anterior: • Los arreglos de enteros, de punto flotante y de caracteres se inicializan por medio de un operador de asignación después de la definición del arreglo, seguido por una lista de valores individuales de inicialización dentro de llaves. • Menos valores de iniciación darán como resultado valores predeterminados (ceros para arreglos de enteros y de punto flotante y terminadores nulos para arreglos de caracteres) insertados en las posiciones adicionales del arreglo. • Más valores de iniciación provocan un error de compilación. • Los arreglos de caracteres se pueden inicializar encerrando una cadena con comillas dobles. • El tamaño de un arreglo de cadena deberá ser uno más grande que el número de caracteres dentro de la cadena para dejar espacio para el carácter terminador nulo. • Si no se especifica un tamaño en la definición del arreglo, el compilador creará el suficiente espacio de almacenaje para los valores de inicialización. • Los arreglos globales y arreglos estáticos se inicializan siempre con los valores predeterminados respectivos cuando ningún valor de iniciación se suministra en la definición del arreglo. ARREGLOS, APUNTADORES Y ESTRUCTURAS – LECCIÓN 18 18-64
MIGUEL Á. TOLEDO MARTÍNEZ • Los arreglos locales que no son estáticos no se inicializarán con ningún valor específico, a menos que se proporcionen en la definición del arreglo. ARREGLOS QUE REBASAN LOS 64 KBYTES DE MEMORIA Si un arreglo rebasa los 64 kbytes de longitud, el mismo enviará un mensaje de error (Array size too large) en tiempo de compilación. Ejemplo 18.38 Ejemplo 18.39 EXAMEN BREVE 38 El siguiente programa, DEMGDE.CPP, ilustra esta situación. /* El siguiente programa: DEMGDE.CPP, no se compila correctamente ya que el arreglo utiliza mas de 64 kbytes de memoria. */ void main(void) { char cadena[66000L]; // 66,000 bytes int valores[33000L]; // 33,000 * 2 = 66,000 bytes float numeros[17000]; // 17,000 * 4 = 68,000 bytes }//Fin de main() El siguiente programa ENORME.CPP, ilustra como resolver esta situación. /* El siguiente programa: ENORME.CPP crea un arreglo de más de 64 kbytes de datos de punto flotante. */ #include //Para cout y cin #include //Para halloc() void main (void) { int i; float huge *valores; if ((valores = (float huge *) halloc (17000, sizeof(float))) == NULL) cout
- Page 13 and 14: MIGUEL Á. TOLEDO MARTÍNEZ que exp
- Page 15 and 16: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 17 and 18: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 19 and 20: MIGUEL Á. TOLEDO MARTÍNEZ void ma
- Page 21 and 22: MIGUEL Á. TOLEDO MARTÍNEZ PASO DE
- Page 23 and 24: MIGUEL Á. TOLEDO MARTÍNEZ void pa
- Page 25 and 26: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 27 and 28: MIGUEL Á. TOLEDO MARTÍNEZ int bus
- Page 29 and 30: MIGUEL Á. TOLEDO MARTÍNEZ El cuer
- Page 31 and 32: MIGUEL Á. TOLEDO MARTÍNEZ /******
- Page 33 and 34: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 35 and 36: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 37 and 38: MIGUEL Á. TOLEDO MARTÍNEZ /* El s
- Page 39 and 40: MIGUEL Á. TOLEDO MARTÍNEZ escribi
- Page 41 and 42: MIGUEL Á. TOLEDO MARTÍNEZ /* El s
- Page 43 and 44: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 45 and 46: MIGUEL Á. TOLEDO MARTÍNEZ SOLUCI
- Page 47 and 48: MIGUEL Á. TOLEDO MARTÍNEZ // Busc
- Page 49 and 50: MIGUEL Á. TOLEDO MARTÍNEZ Paso 1
- Page 51 and 52: MIGUEL Á. TOLEDO MARTÍNEZ { j = i
- Page 53 and 54: MIGUEL Á. TOLEDO MARTÍNEZ un tama
- Page 55 and 56: MIGUEL Á. TOLEDO MARTÍNEZ necesit
- Page 57 and 58: MIGUEL Á. TOLEDO MARTÍNEZ { for (
- Page 59 and 60: MIGUEL Á. TOLEDO MARTÍNEZ // Comp
- Page 61 and 62: MIGUEL Á. TOLEDO MARTÍNEZ INICIAC
- Page 63: MIGUEL Á. TOLEDO MARTÍNEZ Esta ve
- Page 67 and 68: MIGUEL Á. TOLEDO MARTÍNEZ Es posi
- Page 69 and 70: MIGUEL Á. TOLEDO MARTÍNEZ p[100];
- Page 71 and 72: MIGUEL Á. TOLEDO MARTÍNEZ a) Cree
- Page 73 and 74: MIGUEL Á. TOLEDO MARTÍNEZ d) ¿cu
- Page 75 and 76: MIGUEL Á. TOLEDO MARTÍNEZ medio d
- Page 77 and 78: MIGUEL Á. TOLEDO MARTÍNEZ EXAMEN
MIGUEL Á. TOLEDO MARTÍNEZ<br />
• Los arreglos locales que no son estáticos no se inicializarán con ningún valor específico, a<br />
menos que se proporcionen en la definición del arreglo.<br />
ARREGLOS QUE REBASAN LOS 64 KBYTES <strong>DE</strong> MEMORIA<br />
Si un arreglo rebasa los 64 kbytes de longitud, el mismo enviará un mensaje de error<br />
(Array size too large) en tiempo de compilación.<br />
Ejemplo <strong>18</strong>.38<br />
Ejemplo <strong>18</strong>.39<br />
EXAMEN BREVE 38<br />
El siguiente programa, <strong>DE</strong>MG<strong>DE</strong>.CPP, ilustra esta situación.<br />
/* El siguiente programa: <strong>DE</strong>MG<strong>DE</strong>.CPP, no se compila correctamente ya que el<br />
arreglo utiliza mas de 64 kbytes de memoria.<br />
*/<br />
void main(void)<br />
{<br />
char cadena[66000L]; // 66,000 bytes<br />
int valores[33000L]; // 33,000 * 2 = 66,000 bytes<br />
float numeros[17000]; // 17,000 * 4 = 68,000 bytes<br />
}//Fin de main()<br />
El siguiente programa ENORME.CPP, ilustra como resolver esta situación.<br />
/* El siguiente programa: ENORME.CPP crea un arreglo de más de 64 kbytes<br />
de datos de punto flotante.<br />
*/<br />
#include //Para cout y cin<br />
#include //Para halloc()<br />
void main (void)<br />
{<br />
int i;<br />
float huge *valores;<br />
if ((valores = (float huge *) halloc (17000, sizeof(float))) == NULL)<br />
cout