PDA

Ver la Versión Completa : Error de 'El programa xxxx.exe dejo de funcionar' por array of ansichar


masrmty
21-05-2015, 18:56:49
Hola buen dia.
Tengo problema con una funcion que utiliza la siguiente instruccion:

var inbuf: array [0..500000000] of ansichar;

Esta instruccion funciona bien cuando el valor maximo es de 1000000.
El codigo completo donde la utilizo es este:

function CalculaSelloConBig(cadenaoriginal: string; Hash:THash; key: pEVP_PKEY): string;
var inbuf: array [0..500000000] of ansichar;
outbuf: array [0..1024] of ansichar;
mdctx: EVP_MD_CTX;
Len: cardinal;
begin
StrPCopy(inbuf,UTF8Encode(cadenaoriginal));
if Hash = MD5 then EVP_SignInit(@mdctx,EVP_md5());
if Hash = SHA1 then EVP_SignInit(@mdctx,EVP_sha1());
EVP_SignUpdate(@mdctx,@inbuf,StrLen(inbuf));
EVP_SignFinal(@mdctx,@outbuf,Len,key);
result := BinToBase64(@outbuf,Len);
end;

El problema que se presenta es al momento de ejecucion se aborta el programa solo diciendo que: El programa xxxx.exe dejo de funcionar.
Cualquier ayuda se los agradesco.

Casimiro Notevi
21-05-2015, 19:06:32
500000000
;)

¿Y cuánta memoria tiene tu equipo?

masrmty
21-05-2015, 19:10:48
Hola gracias por responder.

La maquina tiene 4GB, utilizo Delphi XE4.
Pero la instruccion falla si le pongo 2,000,000 tambien.

Casimiro Notevi
21-05-2015, 19:18:51
¿Y para qué necesitas 500 millones de posiciones en un array?

nlsgarcia
21-05-2015, 19:22:19
masrmty,


...Tengo problema con una función que utiliza la siguiente instruccion...var inbuf: array [0..500000000] of ansichar...al momento de ejecución se aborta el programa solo diciendo que: El programa xxxx.exe dejo de funcionar...La máquina tiene 4GB, utilizo Delphi XE4...
¡Bienvenido al Club Delphi! :D

Pregunto:

1- ¿Que versión de Windows y de cuantos bits (32/64) utiliza la aplicación?.

2- ¿Haz considerado usar arreglos dinámicos para optimizar los recursos de la aplicación?.

Revisa esta información:

DelphiBasics : Array (http://www.delphibasics.co.uk/RTL.asp?Name=Array)
Espero sea útil :)

Nelson.

masrmty
21-05-2015, 21:16:01
Hola Casimiro,

Mira esta funcion la he utilizado para el tema de la facturacion electronica (Mexico) para generar el sello de la cadena, normalmente el valor que se requeria para esto es de 20,000 a 50,000.

Ahora ocupo esa misma funcion para el tema de la contabilidad electronica, solo que aqui los archivos a sellar son mucho mas grandes que una factura.

Esa funcion la compre hace como 4 años con alguien que vendia la solucion para la factura electronica, pero ya no tiene soporte.


Hola NlsGarcia,
La maquina en donde estoy haciendo eso es Windows Server Standar 2008 de 32 bytes.
He intentado hacer el array de manera dinamica pero marca error al compilar.

Saludos.

ecfisa
21-05-2015, 21:24:11
Hola masrmty.

Lo primero que noto es que el arreglo está declarado dentro de la función por lo que será almacenado en el stack, y dado su tamaño, no me extraña que haya desborde...

Intenta declarándolo como variable global oculta, dentro de la sección implemetation de la unidad donde resida la función:


...
implementation

var
inbuf : array [0..500000000] of AnsiChar;

function CalculaSelloConBig(cadenaoriginal: string; Hash:THash; key: pEVP_PKEY): AnsiChar;
var
outbuf: array [0..1024] of ansichar;
...
begin
...


Saludos :)

masrmty
21-05-2015, 21:37:13
Hola Ecfisa,

Con tu comentario ya funciono y le puse hasta 1,000,000,000 y funciona perfectamente.
Muchas gracias.

Tambien gracias a todos los que respondieron.

Saludos.