Erro ao acessar posição do array
O que estou fazendo de errado nesta função?
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?
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
Curtidas 0
Respostas
Paulo_amorim
02/07/2004
Olá
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:
Ou entao vc deve declrará-los com 250 posições
Espero que ajude
Até+
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
Paulo_amorim
02/07/2004
Olá
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
Espero que ajude
Até+
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
Marcela
02/07/2004
Não rolou...
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..
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
Beppe
02/07/2004
Acho que o problema naum eh nada declaração...mas pra resolver a questão de tipos:
Ou pode ser um problema com os argumentos que passa pra função. Como declaro os outros arrays?
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
Paulo_amorim
02/07/2004
Olá
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é?
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
Marcela
02/07/2004
Até aí eu cheguei, mas veja o erro que ocorre quando eu chamo a função:
Types of actual ans formal var parameters must be identical
Veja como estou chamando a função:
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
Paulo_amorim
02/07/2004
Olá
Fiz um programa de teste e fui alterando pra tentar simular o erro...
ficou assim (os erros que eu achei estão comentados):
Aqui ele rodou sossegado
Espero que funcione
Até+
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
Adilsond
02/07/2004
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
Paulo_amorim
02/07/2004
Até aí eu cheguei, mas veja o erro que ocorre quando eu chamo a função:
Types of actual ans formal var parameters must be identical
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
Marcela
02/07/2004
Poxa.. galera....
Deu certo.. até que fim...
Valeu pela ajuda.. Brigadão mesmo...
Deu certo.. até que fim...
Valeu pela ajuda.. Brigadão mesmo...
GOSTEI 0