Problema em função com string em delphi 2009

Delphi

29/06/2009

este função a baixo ñ esta mais copilado no delphi 2009 , sei q houve uma grande mudaça na parte q trata de variaveis strings ... já mudei para AnsiString , mas o problema pesiste na linha

for i:=1 to ord(s[0]) do

afirmando :
[Pascal Error] libelisoft.pas(1061): E2157 Element 0 inaccessible - use ´Length´ or ´SetLength´

alguém pode me dá uma luz ?

função completa :

function CryptSample(Value, Tipo : string) : string;
var
i : integer;
s : string;
c : array[0..255] of byte absolute s;
begin
i := 0;
try
if (Tipo= ´D´) then
begin
s:=Value;
for i:=1 to ord(s[0]) do //dá erro aqui ...
c[i] := 23 xor c[i];
end
else begin
s:=Value;
for i:=1 to Length(s) do
s[i] := char(23 xor ord(c[i]));
end;
finally
Result := s;
end;
end;


Elixandre

Elixandre

Curtidas 0

Respostas

Crash

Crash

29/06/2009

provavelmente vc vai ter que colocar o valor do Char em uma variavel tipo byte.

Variavel := Ord(C[X]);
for I := 1 to Variavel do


GOSTEI 0
Crash

Crash

29/06/2009

sabendo também que ´S[0]´ não existe!

strings começam na posição 1


GOSTEI 0
Elixandre

Elixandre

29/06/2009

a string no delphi não é a mesma string no C, por exemplo. A string no C (na realidade um array de char) é a mesma PChar do delphi, pois ambas terminam com um caracter null. Já a string do delphi usa a posição zero, ou seja, STR[0] para guardar o tamanho da string. Dai, a string do delphi começa a partir da posição 1, ou seja, STR[1].
então s[0] na função até o delphi 2007 funcionava ... qualquer ajuda será em vinda obrigado !!!!


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/06/2009

a string no delphi não é a mesma string no C, por exemplo. A string no C (na realidade um array de char) é a mesma PChar do delphi, pois ambas terminam com um caracter null. Já a string do delphi usa a posição zero, ou seja, STR[0] para guardar o tamanho da string. Dai, a string do delphi começa a partir da posição 1, ou seja, STR[1]. então s[0] na função até o delphi 2007 funcionava ... qualquer ajuda será em vinda obrigado !!!!


s[0] não funciona do Delphi 7 nem no Delphi 2006.

use a função length() para retornar o tamanho, assim como está sendo indicado na mensagem que o compilador retornou..


GOSTEI 0
Uasan

Uasan

29/06/2009

Boa Noite,

Como o emerson disse você deve colocar:

for i:=1 to ord(Length(s)) do 


[]´s


GOSTEI 0
Elixandre

Elixandre

29/06/2009

fiz a sugestão sugerida o códico ficou assim :

function TForm1.CryptSample(Value, Tipo: AnsiString): AnsiString;
var
i : integer;
s : AnsiString;
c : array[0..255] of byte absolute s;
begin
i := 0;
try
if (Tipo= ´D´) then
begin
s:=Value;
//for i:=1 to ord(s[0]) do - tava antes ...
for i:=1 to ord(Length(s)) do
c[i] := 23 xor c[i];
end
else begin
s:=Value;
for i:=1 to Length(s) do
s[i] := Ansichar(23 xor ord(c[i]));
end;
finally
Result := s;
end;
end;

só q encriptar funcionar direto ... mas se mando decriptar aparece o erro : First chance exception at $7C812AEB. Exception class EAccessViolation with message ´Access violation at address 00404D30 in module ´Project1.exe´. Read of address 17B1044A´. Process Project1.exe (2472)

alguma susgestão pessoal ?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/06/2009

function TForm1.CryptSample(Value, Tipo: AnsiString): AnsiString;
var
  i : integer;
  s : AnsiString;
  c : array of byte absolute s;
begin
  try
    s := Value;
    if (Tipo = ´D´) then
      for i := 0 to Length(s)-1 do
        c[i] := 23 xor c[i]
    else
      for i := 1 to Length(s) do
        s[i] := Ansichar(23 xor ord(c[i-1]));
  finally
    Result := s;
  end;
end;



GOSTEI 0
POSTAR