La Web del Programador: Comunidad de Programadores
 
    Pregunta:  162 - VECTORES EN VISUAL C++
Autor:  Willser
Estoy diseñando un programa con Microsoft Visual C++ 1.0 y MFC 2.0 con imágenes .BMP, .TIF y/o .GIF, de 512*512, para aplicarles algunos algoritmos de analisis, lo que se me ocurre es bajar el archivo a un vector de [512][512], pero tengo algunos problemas:
1. No es posible crear un vector que supere los 64Kb. A pesar de que compile en modo ´Large´ y ´Huge´.
2. Alguien me sugirió usar el tipo ´huge´ en la declaración del vector que es de tipo ´unsigned char´, pero éste solo me ha funcionado en Borland C++ para DOS, en Modo ´Large´.
3. Ante esto, quise usar una lista enlazada que simule un vector 2D, pero creo se demora un poco más.
4. Además, Desconozco el formato de éstos archivos.
5. ¿Ah. ¨Y Cómo puedo modificar el contenido del archivo, habiendo bajado y modificado los datos a un vector o a una lista enlazada?.
6. Este es el código utilizado pero lee 262279 Bytes y realmente son 262144=512*512 Bytes.

  Respuesta:  Jaime Calahorrano
Si esta utilizando un sistema operativo de 16 bits, cambiese a uno de 32 como Windows 95. Ahi no tiene que preocuparse del huge. En medida de lo posible migre a Visual 4.2 o superior. En este puede manejar vectores sumamente grandes sin importar el tipo de dato a utilizar. Y no tiene el limite de los 64k. No hay ningun problema en migrar de borlandc a visual.

  Respuesta:  Daniel Osuna
Si estas programando para entorno Windows, puedes utilizar el siguiente código para usar array´s mas grandes de 64k.
// defines variable globales
char far *matriz[512][512];
HGLOBAL hmatriz[512];

//luego en alguna parte de la inicialización debes asignar memoria para el array:

for(i=0; i<512; i++){
hmatriz[i]=::GlobaAlloc(GPTR,512);
matriz[i]=::GlobalLock(hmatriz[i]);
}

Con esta asignación de memoria ahora podemos usar la matriz como cualquier matriz convencional:

el elemento n,m de la matris se apuntará por matriz[n][m]

Una vez que finalizastes la utilización de esta tipos de los datos debes liberar la memoria utilizando:

for(i=0; i<512; i++){
::GlobalUnlock(hmatriz[i]);
::GlobaFree(hmatriz[i]);
}
El límite en la asignación esta dado por el número de handles (en pruebas que hecho nunca pude asignar mas de 3000 filas en la matríz)
Acuérdate de agregar #include "windows.h" antes de utilizar las funciones Global...

Si tienes otra duda escríbeme: