Jump to content
Fivewin Brasil

Error BASE/1132 Bound error: array access


Manoel Marinho

Recommended Posts

Alguém poderia me dizer porque o programa abaixo apresenta erro de array ?

#include "fivewin.ch"

function main()

local aCap := { "Codigo:", "Nome:" }

local aGet := { space( 5 ), space( 40 ) }

TelaRapida( aCap, @aGet )

return Nil

function TelaRapida( aCap, aGet )

local oDlg

local oFnt

local nGet := len( aGet )

local nCtr := 1

define font oFnt name "MS Sans Serif" size 8, 0

define dialog oDlg size 400, 300 font oFnt

oDlg:lHelpIcon := .f.

while nCtr <= nGet

@ nCtr * 11, 10 say aCap[ nCtr ] of oDlg pixel

@ nCtr * 11, 10 + len( aCap[ nCtr ] ) get aGet[ nCtr ] of oDlg pixel

nCtr ++

enddo

@ 135, 10 button "Confirmar" size 35, 10 action oDlg:End() of oDlg pixel

@ 135, 50 button "Cancelar" size 35, 10 action oDlg:End() of oDlg pixel

activate dialog oDlg center

oFnt:end()

return nil

Link to comment
Share on other sites

Ola Manoel, este erro e devido a array estar definica com elementos menor ao solicitado pela aplicação

Onde você vê um obstáculo alguém vê o término da viagem e o outro vê uma chance de crescer.

Elias Abrão Júnior

Fone : (0**11) 5181-6909 São Paulo - SP

eajunior.fw@terra.com.br

xHarbour 0.99.0 - Fivewin 2.5 e xMate

Link to comment
Share on other sites

Manoel, a explicacao do seu erro eh um pouco complexa, mas vou tentar te ajudar:

while nCtr <= nGet

@ nCtr * 11, 10 say aCap[ nCtr ] of oDlg pixel

@ nCtr * 11, 10 + len( aCap[ nCtr ] ) get aGet[ nCtr ] of oDlg pixel

nCtr ++

enddo

Quando o pre-processador processa o comando @SAY ou @GET, ele transforma o nome da variavel num bloco, do tipo: {|x| iif(pcount()==0, aGet[ nCtr ], aGet[ nCtr ] := x)}.

Veja que o bloco de codigo faz referencia a aGet[ nCtr ], não a aGet[ 1 ] ou aGet[ 2 ], que eh o que vc precisa. Quando vc sai do laço DO WHILE, o valor de nCt eh 3. Portanto, o bloco de codigo tenta acessar o elemento 3 da matriz. Para resolver esse problema, use assim:

function TelaRapida( aCap, aGet )

local oDlg

local oFnt

local nGet := len( aGet )

local nCtr := 1

define font oFnt name "MS Sans Serif" size 8, 0

define dialog oDlg size 400, 300 font oFnt

oDlg:lHelpIcon := .f.

while nCtr <= nGet

DefineGet( aCap, aGet, oDlg, nCtr++ )

enddo

@ 135, 10 button "Confirmar" size 35, 10 action oDlg:End() of oDlg pixel

@ 135, 50 button "Cancelar" size 35, 10 action oDlg:End() of oDlg pixel

activate dialog oDlg center

oFnt:end()

return nil

STATIC FUNCTION DefineGet( aCap, aGet, oDlg, nCtr )

@ nCtr * 11, 10 say aCap[ nCtr ] of oDlg pixel

@ nCtr * 11, 10 + len( aCap[ nCtr ] ) get aGet[ nCtr ] of oDlg pixel

RETURN NIL

Isso fará com que o valor da variavel nCtr, na funcao DefineGet() corresponda ao indice da matriz que se deseja, e que nao se altera porque a variavel eh LOCAL.

Espero que tenha conseguido me explicar.

Jackeline - RN

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...