UDF Esquisita

Firebird

29/06/2009

Amigos fiz uma UDF, bem o que ocorre e que na 1º pesquisa funciona 100¬, mas quando faz a 2º ae ele come caracteres e começa a aparecer letras que nem existe, alquem daria uma luz

function InteiroStr(Strr: pchar): Pchar; cdecl; export;
const Numero = ´1234567890´;
var
  x: Integer;
  S: string;
begin
  S := emptystr;
  for x := 1 to Length(Strr) do
  begin
    if Pos(Strr[x], Numero) <> 0 then
      S := Pchar(S + Strr[x]);
  end;
  Result := StrAlloc(Length(S));
  Result := PChar(S);
end;


DECLARE EXTERNAL FUNCTION INTEIROSTR
  CSTRING(15) CHARACTER SET NONE
RETURNS CSTRING(15) CHARACTER SET ASCII
ENTRY_POINT ´InteiroStr´ MODULE_NAME ´sahudf´;


obrigado


Sremulador

Sremulador

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

29/06/2009

function InteiroStr(Strr: pchar): Pchar; cdecl; export;
var
  x: Integer;
  S: string;
begin
  S := emptystr;
  for x := 0 to Length(Strr) do // inicia em 0 (zero)
    if (Strr[x] in [´0´..´9´]) then
      S := S + Strr[x];
  Result := PChar(S);
end;


outra coisa: o tamanho das strings de entrada e saída não pode estar pequeno? 15 é um valor suficiente? normalmente eu trabalho com 255, a menos que eu saiba exatamente o limite que será utilizado.

DECLARE EXTERNAL FUNCTION INTEIROSTR
  CSTRING(150) CHARACTER SET NONE
RETURNS CSTRING(150) CHARACTER SET NONE
ENTRY_POINT ´InteiroStr´ MODULE_NAME ´sahudf´;



GOSTEI 0
Sremulador

Sremulador

29/06/2009

emerson, obrigado, porem quando foi hj eu estava de cabeça mais fria, fiz exatamente o que você fez, verifiquei q o problema estava na alocalçao de memoria, mas não entendi o pq, já que tenhou outa udf da mesma forma, e funciona, quanto ao tamanho do campo só preciso de 11, sobre o 0 e não 1, realmente era isso mesmo, obrigado.


GOSTEI 0
POSTAR