Manoel Marinho Posted May 18, 2005 Report Share Posted May 18, 2005 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 Quote Link to comment Share on other sites More sharing options...
eajunior Posted May 18, 2005 Report Share Posted May 18, 2005 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 Quote Link to comment Share on other sites More sharing options...
Jackita Posted May 18, 2005 Report Share Posted May 18, 2005 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 Quote Link to comment Share on other sites More sharing options...
Manoel Marinho Posted May 18, 2005 Author Report Share Posted May 18, 2005 Os arrays são aCap := { "Codigo:", "Nome:" } e aGet := { space( 5 ), space( 40 ) } Ambos com 2 elementos, e o contador nCtr não vai além de 2 no laço WHILE, não tô entendendo nada !!! Quote Link to comment Share on other sites More sharing options...
Manoel Marinho Posted May 18, 2005 Author Report Share Posted May 18, 2005 Valeu Jackita, funcionou legal. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.