PDA

Ver la Versión Completa : Error "Invalid pointer operation" en función contenida en DLL


Albano
20-06-2007, 22:08:34
Hola a todos! tengan un buen dia...
Trabajo con delphi 2005, hice una función que convierte un número flotante a Letra, incluyendo los centavos... Esta función la hice hace tiempo, sin darme cuenta que en los trucos de aqui, esta una parecida, pero como yo hice esta, me quedo con ella... bueno, aqui voy a pegar el código de la función, para el que le interese, por ahorita no he detectado errores en números menores a 1 millón, estoy trabajando para sacar la siguiente parte.
Bueno... ahora les explico mi error. Esta función la tengo en una DLL y cada vez que la mando llamar, me muestra un error que dice lo siguiente: "Invalid pointer operation". No estoy usando punteros en esta función y si la pongo directamente en mi programa, me funciona a la perfección, el error solo sale cuando la pongo en la DLL y la quiero usar. ¿Alguien sabe qué esta pasando?
Gracias de antemano, Dios les bendiga.
Function TFrameGui.ConvNumLetra(Numero: extended): string;
var
k, u, m, unidad: integer;
cadena, resultado, nuevo, unidadnueva, centavos: string;
unidadpendiente, decenapendiente, mil, millon: boolean;
begin
cadena := floattostr(numero);
delete(cadena, pos(decimalseparator, cadena), maxint);
centavos := floattostr((numero - strtofloat(cadena))* 100);
delete(centavos, pos(decimalseparator, centavos), maxint);
m := 0;
u := 1;
resultado := '';
mil := false;
unidadpendiente := false;
decenapendiente := false;
unidad := 0;
millon := false;
for k := length(cadena) downto 1 do
begin
nuevo := '';
case u of
1:
begin
unidadpendiente := true;
decenapendiente := true;
unidadnueva := '';
unidad := 0;
case cadena[k] of
'1':
begin
unidadnueva := 'UN';
if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
unidad := 1;
if millon = true then
begin
nuevo := nuevo + ' MILLON ';
millon := false;
mil := false;
end;
end;
'2':
begin
unidadnueva := 'DOS';
if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
unidad := 2;
end;
'3':
begin
unidadnueva := 'TRES';
if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
unidad := 3;
end;
'4':
begin
unidadnueva := 'CUATRO';
if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
unidad := 4;
end;
'5':
begin
unidadnueva := 'CINCO';
if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
unidad := 5;
end;
'6': unidadnueva := 'SEIS';
'7': unidadnueva := 'SIETE';
'8': unidadnueva := 'OCHO';
'9': unidadnueva := 'NUEVE';
'0': unidadpendiente := false;
end;
if (cadena[k] in ['1'..'9']) and (mil = true) then
begin
nuevo := unidadnueva + ' MIL ';
unidadnueva := '';
mil := false
end;
end;
2:
begin
case cadena[k] of
'1':
begin
nuevo := 'DIECI';
if cadena[k + 1] = '0' then nuevo := 'DIEZ';
end;
'2': nuevo := 'VEINTE';
'3': nuevo := 'TREINTA';
'4': nuevo := 'CUARENTA';
'5': nuevo := 'CINCUENTA';
'6': nuevo := 'SESENTA';
'7': nuevo := 'SETENTA';
'8': nuevo := 'OCHENTA';
'9': nuevo := 'NOVENTA';
'0': decenapendiente := false;
end;
if mil = true then
begin
nuevo := nuevo + ' MIL ';
mil := false
end;
end;
3:
begin
case cadena[k] of
'1': nuevo := 'CIENTO ';
'2': nuevo := 'DOSCIENTOS ';
'3': nuevo := 'TRESCIENTOS ';
'4': nuevo := 'CUATROCIENTOS ';
'5': nuevo := 'QUINIENTOS ';
'6': nuevo := 'SEISCIENTOS ';
'7': nuevo := 'SETECIENTOS ';
'8': nuevo := 'OCHOCIENTOS ';
'9': nuevo := 'NOVECIENTOS ';
end;
if mil = true then
begin
nuevo := nuevo + ' MIL ';
mil := false
end;
end;
end;
if u = 2 then //esta condición indica que estamos en decenas
begin
if unidadpendiente = false then //esta condición indica que hay una unidad pendiente
begin
if nuevo = 'DIECI' then nuevo := 'DIEZ';
resultado := nuevo + unidadnueva + resultado;
unidadnueva := '';
end
else
begin
if nuevo = 'DIECI' then
begin
case unidad of
1:
begin
nuevo := 'ONCE';
unidadnueva := '';
end;
2:
begin
nuevo := 'DOCE';
unidadnueva := '';
end;
3:
begin
nuevo := 'TRECE';
unidadnueva := '';
end;
4:
begin
nuevo := 'CATORCE';
unidadnueva := '';
end;
5:
begin
nuevo := 'QUINCE';
unidadnueva := '';
end;
end;
resultado := nuevo + unidadnueva + resultado;
end
else
begin
if nuevo <> '' then
resultado := nuevo + ' Y ' + unidadnueva + resultado
else resultado := nuevo + unidadnueva + resultado;
end;
unidadnueva := '';
end;
end
else
begin
if decenapendiente = false then
begin
if nuevo = 'CIENTO ' then nuevo := 'CIEN ';
resultado := nuevo + resultado;
end
else resultado := nuevo + resultado;
end;
if u < 3 then inc(u)
else
begin
u := 1;
case m of
0:
begin
if numero > 999 then
mil := true;
end;
1:
begin
if numero > 999999 then
millon := true;
end;
end;
if m = 0 then inc(m)
else m := 0;
end;
end;
if length(cadena) < 2 then resultado := unidadnueva;
result := resultado + ' PESOS ' + centavos + '/100 M.N.';
end;

roman
20-06-2007, 22:31:12
Si usas dlls con delphi, no puedes usar el tipo de datos string a no ser que incluyas la unidad ShareMem. Puedes usar PChar o bien ShortString. Este último te será más cómodo porque no tienes que estar asignando memoria, pero tiene un límite de 255 caracteres.

// Saludos

Albano
20-06-2007, 23:01:31
Perfecto!!! eso era Roman, muchas gracias.