Fórum PChar x String x Erro de Memória #187104
07/10/2003
0
Fala galera!
Criei a seguinte função, que retorna uma sub-string de uma strig de entrada:
function TPrincipal.Substring(palavra: string; inicio:integer; fim:integer): string;
var cobaia:PChar;
retorno:string;
begin
if (fim < 0) then fim:=StrLen(PChar(palavra));
StrCopy(cobaia,PChar(palavra[inicio]));
for inicio:=inicio+1 to fim do
StrCat(cobaia,PChar(palavra[inicio]));
retorno:=string(cobaia);
Result:=retorno;
end;
E a chamo, por exemplo, assim:
str := Substring(´Matheus´,2);
O código acima sempre retorna um ´EAccess Violation´...
Alguém sabe o que pode estar errado?
Obrigado,
Matheus.
Criei a seguinte função, que retorna uma sub-string de uma strig de entrada:
function TPrincipal.Substring(palavra: string; inicio:integer; fim:integer): string;
var cobaia:PChar;
retorno:string;
begin
if (fim < 0) then fim:=StrLen(PChar(palavra));
StrCopy(cobaia,PChar(palavra[inicio]));
for inicio:=inicio+1 to fim do
StrCat(cobaia,PChar(palavra[inicio]));
retorno:=string(cobaia);
Result:=retorno;
end;
E a chamo, por exemplo, assim:
str := Substring(´Matheus´,2);
O código acima sempre retorna um ´EAccess Violation´...
Alguém sabe o que pode estar errado?
Obrigado,
Matheus.
Matheus
Curtir tópico
+ 0
Responder
Posts
07/10/2003
Beppe
Você está misturando strings com ponteiros p/ cadeia de strings, e nem alocando a memória que você quer usar.
Algumas dicas:
1) não use PChar como strings: o tipo String do Delphi faz a alocação de memória para você.
2) passe parâmetros string como const.
Cobaia aponta para lixo:
Se você necessitace de PChars, use
Cobaia := StrAlloc(Fim - Inicio + 1);
StrCat(StrEnd(Cobaia), PChar(Palavra[Inicio])));
Eu não sei com que intuito você escrevei esta rotina, mas ela é extremamente ineficiente.
Não sei se você sabe, mas a função Copy já faz isso...
Algumas dicas:
1) não use PChar como strings: o tipo String do Delphi faz a alocação de memória para você.
2) passe parâmetros string como const.
Cobaia aponta para lixo:
StrCopy(cobaia,PChar(palavra[inicio]));
...
StrCat(cobaia,PChar(palavra[inicio]));
Se você necessitace de PChars, use
Cobaia := StrAlloc(Fim - Inicio + 1);
StrCat(StrEnd(Cobaia), PChar(Palavra[Inicio])));
Eu não sei com que intuito você escrevei esta rotina, mas ela é extremamente ineficiente.
Não sei se você sabe, mas a função Copy já faz isso...
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)