Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/12/2010, 14:12
Lapicero
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1
Antigüedad: 13 años, 5 meses
Puntos: 0
Reserva de memoria?

Hola a todos.

Estoy enfrascado en una aplicación (utilizo BB6) que accede a un fichero excel y extrae datos de él para procesarlos posteriormente. Más concretamente, he de procesar dos columnas de más de 10.000 filas. Los datos extraidos y procesados he de alojarlos en memoria para volver procesarlos nuevamente mas adelante. Necesito reservar 8 MB de memoria.

Extraer los datos del excel e ir procesándolos de manera secuencial (uno a uno) no es problema. El problema parece surgir al ir alojando los datos procesados para poder acceder a ellos posteriormente, pues me da un error típico: "Access violation at address..." De hecho, el probelam no se da si empleo un excel de prueba de 100 lineas.

No soy ningún fenómeno en esto, de modo que doy por hecho que he metido la pata con algún puntero y/o la reserva de memoria. Espero sepan iluminarme.

(Por su extensión no puedo pegar el código entero... espero que quede suficientemente explícito...)

Código C++:
Ver original
  1. #include <stdio>
  2. #include <iostream>
  3. ...
  4. ...
  5.  
  6. TForm1 *Form1;
  7.  
  8. // Declaraciones globales
  9. ...
  10. char *MEMORIA[100000]; // Aunque tenga 10000 filas voy a necesitar 100.000 //punteros pues los datos tendré que almacenarlos de acuerdo con una tabla hash.
  11. ...
  12.  
  13. //---------------------------------------------------------------------------
  14. void __fastcall TForm1::FormCreate(TObject *Sender)
  15. {
  16. ...
  17. for (ii=0;ii<=99999;ii++) {
  18.         MEMORIA[ii]=new char[80];  // Cada puntero señala al comienzo de una                       // cadena que, como máximo, ocupará 80 caracteres. En total pretendo reservar
  19. // 8 MB.
  20. }
  21. //---------------------------------------------------------------------------
  22.  
  23. void __fastcall TForm1::Examinar_01Click(TObject *Sender)
  24. {
  25. if( OpenDialog1->Execute() ){
  26. // Acceso al excel.
  27. ...
  28. for (recorre las filas del excel) {
  29. // El contenido de las celdas se almacena como AnsiString FILA.
  30. ...
  31. MEMORIA[ii]=FILA.c_str();
  32. ...
  33. }
  34. //---------------------------------------------------------------------------

Omito lo del delete, pues el código salta antes de poder devolver al SO la memoria reservada.

Cuando ejecuto con un excel de prueba de 100 líneas la cosa funciona... pero cuande le arrojo el gordo de 10000 me salta el error.

En fin... cualquier ayuda será bienvenida.

Gracias a todos.