Fórum Erro ao acessar posição do array #240927

02/07/2004

0

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?


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

Marcela

Responder

Posts

02/07/2004

Paulo_amorim

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:

SetLength( vSigla, 250);
SetLength( vNomeArea, 250);
SetLength( vNumCargo, 250);


Ou entao vc deve declrará-los com 250 posições

Espero que ajude
Até+


Responder

Gostei + 0

02/07/2004

Paulo_amorim

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
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é+


Responder

Gostei + 0

02/07/2004

Marcela

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..


Responder

Gostei + 0

02/07/2004

Beppe

Acho que o problema naum eh nada declaração...mas pra resolver a questão de tipos:

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?


Responder

Gostei + 0

02/07/2004

Paulo_amorim

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é?


Responder

Gostei + 0

02/07/2004

Marcela

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:
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;



Responder

Gostei + 0

02/07/2004

Paulo_amorim

Olá

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é+


Responder

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;



Responder

Gostei + 0

02/07/2004

Paulo_amorim

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é+


Responder

Gostei + 0

02/07/2004

Marcela

Poxa.. galera....
Deu certo.. até que fim...
Valeu pela ajuda.. Brigadão mesmo...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar