Fórum Erro ao acessar posição do array #240927
02/07/2004
0
Eu quero atribuir os valores dos três array para os respectivos arrays da função (vSigla, vNomeArea, vNumCargo), mas cada vez que ele entra no ´for´ da uma msg de acesso violado... Porque?
public aSigla : array[1..250] of String; aNomeArea : array[1..250] of String; aNumCargo : array[1..250] of String; ... function TFrmSelecao.SelecionarArea(var sNumCAR, sSigla, sNomeArea : string; var vSigla : array of String; var vNomeArea : array of String; var vNumCargo : array of String) : boolean; var Selecao : TFrmSelecao; iCont : integer; begin Selecao := TFrmSelecao.Create(application); Selecao.cOperacao := ´A´; Selecao.ShowModal; sNumCAR := Selecao.sNumCar; sSigla := Selecao.sSigla; sNomeArea := Selecao.sNomeArea; for iCont := 1 to 250 do begin vSigla[iCont] := Selecao.aSigla[iCont]; vNomeArea[iCont] := Selecao.aNomeArea[iCont]; vNumCargo[iCont] := Selecao.aNumCargo[iCont]; end;
Marcela
Curtir tópico
+ 0Posts
02/07/2004
Paulo_amorim
Em Pascal vc não pode ter um array infinito...
se vc criar um array dinâmico como vc fez (array of String) vc deve dimensioná-lo antes de usar!
se seu for vai até 250, tente assim antes do For:
SetLength( vSigla, 250); SetLength( vNomeArea, 250); SetLength( vNumCargo, 250);
Ou entao vc deve declrará-los com 250 posições
Espero que ajude
Até+
Gostei + 0
02/07/2004
Paulo_amorim
Realmente o que vc disse está correto. Eu falei besteira :oops:
Quando voce passa um array por parâmetro, ele não pode ser dimensionado nem pode receber um SetLengtth...desculpe!
Eu fiz uns testes aqui, e lendo o Help eu vi que o array aberto (open array) eh diferente
ele começa em [b:00012583c1]0[/b:00012583c1] e não em 1...
portanto, tente esse código
for iCont := 0 to 249 do begin vSigla[iCont] := Selecao.aSigla[iCont+1]; vNomeArea[iCont] := Selecao.aNomeArea[iCont+1]; vNumCargo[iCont] := Selecao.aNumCargo[iCont+1]; end;
Espero que ajude
Até+
Gostei + 0
02/07/2004
Marcela
Acho que a declaração tem que ser diferente, segundo o help iz:
procedure Sort(A: array[1..10] of Integer); // syntax error
causes a compilation error. But
type TDigits = array[1..10] of Integer;
procedure Sort(A: TDigits);
Tentei fazer mas tb nao deu certo:
Types of actual and formal var parameters must be identical...
Não sei como resolver isso..
Gostei + 0
02/07/2004
Beppe
type TStringArray = array[1..250] of String; ... public aSigla : TStringArray; aNomeArea : TStringArray; aNumCargo : TStringArray; ... function TFrmSelecao.SelecionarArea(var sNumCAR, sSigla, sNomeArea : string; var vSigla : TStringArray; var vNomeArea : TStringArray; var vNumCargo : TStringArray) : boolean; var Selecao : TFrmSelecao; iCont : integer; begin Selecao := TFrmSelecao.Create(application); Selecao.cOperacao := ´A´; Selecao.ShowModal; sNumCAR := Selecao.sNumCar; sSigla := Selecao.sSigla; sNomeArea := Selecao.sNomeArea; for iCont := 1 to 250 do begin vSigla[iCont] := Selecao.aSigla[iCont]; vNomeArea[iCont] := Selecao.aNomeArea[iCont]; vNumCargo[iCont] := Selecao.aNumCargo[iCont]; end;
Ou pode ser um problema com os argumentos que passa pra função. Como declaro os outros arrays?
Gostei + 0
02/07/2004
Paulo_amorim
Segundo o Help, ele não deixa vc colocar tipo dimensionado como parâmetro...
Marcela, na hora da chamada da função vc passa um array de 250 né?
Gostei + 0
02/07/2004
Marcela
Types of actual ans formal var parameters must be identical
Veja como estou chamando a função:
procedure TFrmConsulta.ConsultaPorArea; var Selecao : TfrmSelecao; sNumCargo, sNome, sSigla : string; vSiglaArea, vNomeArea, vNumCargo : TArrays; iCont : integer; begin Selecao := TFrmSelecao.Create(application); bEncerrar := false; FlagArea := false; //exibe lista com as areas if not Selecao.SelecionarArea(sNumCargo, sSigla, sNome, vSiglaArea, vNomeArea, vNumCargo) then exit else begin NumCargo := sNumCargo; SiglaArea := sSigla; NomeArea := sNome; end; cOpcao := ´A´; //Área ShowModal; end;
Gostei + 0
02/07/2004
Paulo_amorim
Fiz um programa de teste e fui alterando pra tentar simular o erro...
ficou assim (os erros que eu achei estão comentados):
public
aSigla : array[1..250] of String;
aNomeArea : array[1..250] of String;
aNumCargo : array[1..250] of String;
(...)
procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c: array of String;
begin
{ Sem os SetLength dá AccessViolation, pois eh um array sem dimensão }
SetLength(a,250);
SetLength(b,250);
SetLength(c,250);
SelecionarArea(a,b,c);
end;
procedure TForm1.SelecionarArea(var vSigla, vNomeArea,
vNumCargo: array of String); //as var. String eu tirei pois não afetava
var
iCont: Integer;
begin
{ O array de N posições vai de 0 a N-1 (no caso 250 posicoes) }
for iCont := 0 to 249 do
begin
vSigla[iCont] := aSigla[iCont+1];
vNomeArea[iCont] := aNomeArea[iCont+1];
vNumCargo[iCont] := aNumCargo[iCont+1];
end;
end;Aqui ele rodou sossegado
Espero que funcione
Até+
Gostei + 0
02/07/2004
Adilsond
public
{ Public declarations }
cOperacao: Char;
sNumCar : String;
sSigla : String;
sNomeArea: String;
vSigla : array[1..250] of String;
vNomeArea: array[1..250] of String;
vNumCargo: array[1..250] of String;
end;
function SelecionarArea(var psNumCargo, psSigla, psNomeArea: String;
var pvSigla, pvNomeArea, pvNumCargo: array of String): Boolean;
var
FrmSelecao: TFrmSelecao;
implementation
{$R *.DFM}
function SelecionarArea(var psNumCargo, psSigla, psNomeArea: String;
var pvSigla, pvNomeArea, pvNumCargo: array of String): Boolean;
var
iCont: Integer;
begin
FrmSelecao := TFrmSelecao.Create(Self);
with FrmSelecao do
try
cOperacao := ´A´;
ShowModal;
psNumCargo := sNumCargo;
psSigla := sSigla;
psNomeArea := sNomeArea;
for iCont := 1 to 250 do
begin
pvSigla[iCont] := vSigla[iCont];
pvNomeArea[iCont] := vNomeArea[iCont];
pvNumCargo[iCont] := vNumCargo[iCont];
end;
finally
FreeAndNil(FrmSelecao);
end;
end;Gostei + 0
02/07/2004
Paulo_amorim
Olá
Aí já eh erro na declaração
Você deve ter mudado algo na parte de cima (declaração) e nao ajustou na de baixo (implementação)
Os 2 devem estar identicos... :wink:
Até+
Gostei + 0
02/07/2004
Marcela
Deu certo.. até que fim...
Valeu pela ajuda.. Brigadão mesmo...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)