Clipper On Line • Ver Tópico - Erro ao compilar com o Xailer
Página 1 de 1

Erro ao compilar com o Xailer

MensagemEnviado: 10 Jul 2008 11:45
por gilsonpaulo
Estou tento este seguinte problema com o Xailer, alguem poderia me dar uma luz?

A Compilar: RVLMSG.PRG...
A Compilar: RVLMENU.PRG...
RVLMENU.PRG(29) Warning W0001 Ambiguous reference: 'PSTOP'
RVLMENU.PRG(29) Warning W0001 Ambiguous reference: 'PTOTREG'
A Compilar: RVLSTART.PRG...
A Criar livraria: rvl.lib...
2 Warnings, 0 Errors

O erro esta acontecendo no rvlmenu.prg

#include "acesso.ch"

/*
* EscCampo() - Mostra por ACHOICE o conteudo de pArray[ 2 ] ( Descricao ),
*        para escolha, devolvendo o conteudo de pArray[ 1 ] ( codigo )
*            selecionada.
*
*    pVarCod     -  Variavel passada como endere‡o
*    pArray[1]   -  Nome da array com os codigos
*                - O QUE OBTEMOS POR REFERENCIA
*    pArray[2]   -  Nome da array com as descricoes
*                - O QUE VEMOS
*/

FUNCTION EscCampo( pVarCod, pArray, pTop, pLeft, pBottom, pRight )

LOCAL tTotReg:=   LEN( pArray[1] )
LOCAL tEscolha
LOCAL wTela:=     SAVESCREEN( pTop, pLeft, pBottom, pRight )
LOCAL tCor:=      SETCOLOR( CorJan() )
LOCAL tBottom:=   IF( tTotReg > ( pBottom - pStop -1 ), pBottom, pTop + pTotReg +1 )

IF EMPTY( pVarCod )
   @ pTop, pLeft, pBottom, pRight BOX BoxFrame()
   RvlShadow( pTop, pLeft, pBottom, pRight )
   tEscolha:=  ACHOICE( pTop, pLeft+1, pBottom-1, pRight-1, pArray[2] )

   RESTSCREEN( pTop, pLeft, pBottom, pRight, wTela )

   IF ( tEscolha != 0 )
     pVarCod:=   pArray [ 1 ] [ tEscolha ]
   ENDIF

  ELSE

   tEscolha:=     ASCAN( pArray[1], pVarCod )
ENDIF

SETCOLOR( tCor )

RETURN( tEscolha != 0 )

/*
* PullDown( pTop, pLeft, paMenu, pPrg, pDigitos )
*
*
*     pTop, pLeft    :   Linha superior e coluna da esquerda
*    paMenu       :  Array contendo as opcoes a serem mostradas
*    pPrg         :  Nome do programa de menu que chama esta funcao
*    pDigitos     :  Numero de digitos acrescentados a pPrg para a
*                    formacao do nome do programa a ser chamado
*/

FUNCTION PullDown( pTop, pLeft, paMenu, pPrg, pDigitos )

LOCAL wTela, tPrg, tX
LOCAL wOpcao:= 0
LOCAL wNumOpcoes:= LEN( paMenu )
LOCAL aMenuAutorizado:= {}

   FOR tX:= 1 TO wNumOpcoes

     IF Autorizado( paMenu[tX][2], MSG_NAO )
       AADD( aMenuAutorizado, { paMenu[tX][1], tX } )
     ENDIF
   NEXT tX

   wNumOpcoes:= LEN( aMenuAutorizado )

   IF ( wNumOpcoes = 0 )
      Autorizado( paMenu[1][2], MSG_SIM )
    ELSE
      @ pTop, pLeft, pTop + wNumOpcoes +1,;
              pLeft + LEN( aMenuAutorizado[1][1] ) +1;
              BOX BoxFrame()

      RvlShadow( pTop, pLeft, pTop + wNumOpcoes +1,;
                 pLeft + LEN( aMenuAutorizado[1][1] ) +1 )
   ENDIF

   WHILE ( wNumOpcoes > 0 )

         SETCOLOR( CorMenu() )

         FOR tX:= 1 TO wNumOpcoes
             @ pTop + tX, pLeft + 1 PROMPT aMenuAutorizado[tX][1]
         NEXT tX

         MENU TO wOpcao

         wTela:= SAVESCREEN( 0, 0, MAXROW(), MAXCOL() )

         IF ( LASTKEY() = ESCAPE ) .OR. ( wOpcao = 0 )
            EXIT
          ELSE  // IF (wOpcao>=1 .and. wOpcao<= NumOpcoes ) ( faixa abrangida )
            tPrg:= pPrg + STRZERO( aMenuAutorizado[wOpcao][2], pDigitos )
            &Tprg.()
         ENDIF

         CLEAR TYPEAHEAD
         RESTSCREEN( 0, 0, MAXROW(), MAXCOL(), wTela )
   ENDDO

RETURN( NIL )

/*
* CHOOSE()    -  Busca codeblock em arquivo e coloca conteudo em um array
*                Mostra o conteudo do array por achoice()
*
*    pBlkCond    :  Bloco com a condicao para teste no Arquivo Selecionado
*    pBlkLinha   :  Bloco com o conteudo que deve ter cada linha de Opcao
*    pTop,
*    pLeft,
*    pBottom,
*    pRight      :  Coordenadas de posicao em tela
*    pInclui     :  Logico ( deve(.T.) ou nao(.F.) aceitar inclusoes )
*    pBlkRet     :  Bloco com o conteudo a ser retornado. Se = NIL, RECNO()
*
*/

FUNCTION Choose( pBlkCond, pBlkLinha, pTop,    pLeft,  ;
                 pBottom,  pRight,    pInclui, pBlkRet ;
               )

LOCAL wTotReg:=   0, tEscolha:= 0, tBottom
LOCAL tInclui:=   IIF( pInclui = NIL, .T., pInclui )
LOCAL aSalva:=     { {}, {} }
LOCAL wTela:=     SAVESCREEN( pTop, pLeft, pBottom, pRight )
LOCAL tCor:=      SETCOLOR( CorJan() )
LOCAL tBlkRet:=   IIF( pBlkRet = NIL, { || RECNO() }, pBlkRet )

   IF ( !EOF() )

     WHILE ( !EOF() .AND. EVAL( pBlkCond ) )

       wTotReg++
       AADD( aSalva[1],  EVAL( pBlkLinha ) )
       AADD( aSalva[2],  EVAL( tBlkRet )    )

       SKIP
     ENDDO

     IF tInclui

       wTotReg++
       AADD( aSalva[1],  PADC( "*** INCLUI OUTRO REGISTRO ***",;
                         pRight-pLeft, "" ))
       AADD( aSalva[2],  0 )

       SKIP
     ENDIF

     tBottom:=   IIF( wTotReg > ( pBottom - pTop -1 ), pBottom,;
                  pTop +wTotReg + 1 )

     @ pTop, pLeft, tBottom, pRight BOX BoxFrame()
    RvLShadow( pTop, pLeft, tBottom, pRight )

     tEscolha:= ACHOICE(  pTop +1, pLeft +1, tBottom -1,;
                     pRight -1, aSalva[1], .T., )

     RESTSCREEN( pTop, pLeft, pBottom, pRight, wTela )

     IF (( tEscolha = wTotReg ) .AND. ( tInclui )) .OR. ( tEscolha = 0 )
       GO BOTTOM                    // Se inclui ou ESC, vai para eof
       SKIP                       // se pBlkRet (codblock) nÆo ‚ pas-
      ELSEIF ( pBlkRet = NIL )        // sado como parƒmetro, posiciona no
     GO aSalva[2][tEscolha]       // recno() escolhido, devolvendo nu-
      ELSE                       // mero escolhido se passar, devolve
     tEscolha:= aSalva[2][tEscolha]   // o conteudo do mesmo
     ENDIF
   ENDIF

   SETCOLOR( tCor )

   RETURN( tEscolha )

/*
* GetNewOrder()  -  Procura o ultimo item do campo-de-ordem ( sequˆncia )
*           e devolve o valor do ultimo incrementado de 1, a partir
*                do registro corrente. Depois vai para o fim do Arquivo.
*
* pBlkCond -  Bloco com a condicao para teste no arquivo selecionado
*
* pBlkRet   -  Bloco com o campo de ordem
*
*/

FUNCTION GetNewOrder( pBlkCond, pBlkRet )

LOCAL    tOrdem:= EVAL( pBlkRet )

   WHILE ( EVAL( pBlkCond ) .AND. !EOF()) .AND. ;
       ( VAL( EVAL( pBlkRet )) <= VAL( tOrdem ) + 1 )

     tOrdem:= EVAL( pBlkRet )
     SKIP
   ENDDO

   GO LASTREC() + 1    // VAI PARA O FIM DO ARQUIVO - INCLUSÇO

   RETURN( STRZERO( VAL( tOrdem ) +1, LEN( tOrdem )))

// eof - RVLMenu.prg

* PRG...................: Spacing
* CLASSE................: Espacejamento
* PREFIXO...............: Spa
* EXPORTA...............: Spa_Spacing()
* CONSTRUTORA...........:
* DESTRUTORA............:
* USA...................:
*
* COMENTARIOS...........: Compilar com /a /m /n /w
* NUMERICO[] spa_spacing(texts, l, r)
* CARACTERE  texts[] - Textos a espacejar
* NUMERICO   l, r    - entre estas duas colunas
* RETURN:    Vetor de colunas iniciais
*            Determina coluna inicial para cada texto, espacado uniformemente
*            entre l e r
*

FUNCTION RvlSpacing( aTextos, nLeft, nRight )

LOCAL    nSumLens,  nTextNum, nSpacesBetween, ;
         aCols:=    ARRAY( LEN( aTextos ))

*  Determina o tamanho total das mensagens
nSumLens:= 0
FOR nTextNum:= 1 TO LEN( aTextos )
    nSumLens +=  LEN( aTextos[nTextNum] )
NEXT

*  Quantidade de espacos entre itens
nSpacesBetween:= INT((( nRight - nLeft +1 ) - nSumLens ) / ;
                      ( LEN( aTextos ) +1 ))

*  Primeira posicao nao e conhecida
aCols[1]:=  1 + nSpacesBetween

*  Determina outros a partir desta
FOR nTextNum:= 2 TO LEN( aTextos )
    aCols[nTextNum]:=  aCols[nTextNum -1] + ;
                       LEN( aTextos[nTextNum -1] ) + ;
                       nSpacesBetween
NEXT

RETURN aCols
* : : : : :

FUNCTION RvlPrompt( cTexto )

@ 01,00 SAY REPLICATE( CHR(32), 80 )
@ 01,05 SAY cTexto

RETURN NIL


Compilando com clipper nao ocorre este erro.

Re: Erro ao compilar com o Xailer

MensagemEnviado: 11 Jul 2008 12:21
por sygecom
Você esta compilando ou gerando uma LIB pelo xailer ?

Pelo que vc postou não teve erros, apenas dois avisos....e a linha 29 do codigo que vc postou esta em branco.

Re: Erro ao compilar com o Xailer

MensagemEnviado: 11 Jul 2008 17:24
por gilsonpaulo
Estou tentando gerando uma lib.

Gostaria de saber o porque desse erro, pois no clipper não ocorre.

Re: Erro ao compilar com o Xailer

MensagemEnviado: 11 Jul 2008 17:56
por sygecom
Não são erros e sim Warnings (Avisos apenas)

Re: Erro ao compilar com o Xailer

MensagemEnviado: 11 Jul 2008 20:37
por gilsonpaulo
Gostaria de saber o que são estes avisos, e deque forma eles poderiam gerar algum tipo de problema.

Segue o prg com o a linha original do erro, este que postei acima foi alterado.

/******************************************************************************
*        LHASA -  RUNTIME LIBRARY PARA DESENVOLVIMENTO DE APLICA€åES        *
* DESENVOLVIMENTO: LHASA Consultoria & Sistemas    LINGUAGEM: Clipper 5.01   *
* DATA DE CRIA€ÇO: 05.10.91                   éLTIMA ALTERA€ÇO:        *
* MODULO:  RVLMenu.prg     -       FUN€ÇO: ROTINA GENRICA PARA MENU E OUTROS *
* DESENVOLV.: Ricardo von Linsingen       TIPOS DE ROTINA COM ESCOLHA EM TELA*
******************************************************************************/

#include "acesso.ch"

/*
* EscCampo() - Mostra por ACHOICE o conteudo de pArray[ 2 ] ( Descricao ),
*        para escolha, devolvendo o conteudo de pArray[ 1 ] ( codigo )
*            selecionada.
*
*    pVarCod     -  Variavel passada como endere‡o
*    pArray[1]   -  Nome da array com os codigos
*                - O QUE OBTEMOS POR REFERENCIA
*    pArray[2]   -  Nome da array com as descricoes
*                - O QUE VEMOS
*/

FUNCTION EscCampo( pVarCod, pArray, pTop, pLeft, pBottom, pRight )

LOCAL tTotReg:=   LEN( pArray[1] )
LOCAL tEscolha
LOCAL wTela:=     SAVESCREEN( pTop, pLeft, pBottom, pRight )
LOCAL tCor:=      SETCOLOR( CorJan() )
LOCAL tBottom:=   IIF( tTotReg > ( pBottom - pStop -1 ) , ;
                       pBottom,                           ; 
                       pTop + pTotReg +1 )  //Aqui ocorre a warning

IF EMPTY( pVarCod )
   @ pTop, pLeft, pBottom, pRight BOX BoxFrame()
   RvlShadow( pTop, pLeft, pBottom, pRight )
   tEscolha:=  ACHOICE( pTop, pLeft+1, pBottom-1, pRight-1, pArray[2] )

   RESTSCREEN( pTop, pLeft, pBottom, pRight, wTela )

   IF ( tEscolha != 0 )
     pVarCod:=   pArray [ 1 ] [ tEscolha ]
   ENDIF

  ELSE

   tEscolha:=     ASCAN( pArray[1], pVarCod )
ENDIF

SETCOLOR( tCor )

RETURN( tEscolha != 0 )

/*
* PullDown( pTop, pLeft, paMenu, pPrg, pDigitos )
*
*
*     pTop, pLeft    :   Linha superior e coluna da esquerda
*    paMenu       :  Array contendo as opcoes a serem mostradas
*    pPrg         :  Nome do programa de menu que chama esta funcao
*    pDigitos     :  Numero de digitos acrescentados a pPrg para a
*                    formacao do nome do programa a ser chamado
*/

FUNCTION PullDown( pTop, pLeft, paMenu, pPrg, pDigitos )

LOCAL wTela, tPrg, tX
LOCAL wOpcao:= 0
LOCAL wNumOpcoes:= LEN( paMenu )
LOCAL aMenuAutorizado:= {}

   FOR tX:= 1 TO wNumOpcoes

     IF Autorizado( paMenu[tX][2], MSG_NAO )
       AADD( aMenuAutorizado, { paMenu[tX][1], tX } )
     ENDIF
   NEXT tX

   wNumOpcoes:= LEN( aMenuAutorizado )

   IF ( wNumOpcoes = 0 )
      Autorizado( paMenu[1][2], MSG_SIM )
    ELSE
      @ pTop, pLeft, pTop + wNumOpcoes +1,;
              pLeft + LEN( aMenuAutorizado[1][1] ) +1;
              BOX BoxFrame()

      RvlShadow( pTop, pLeft, pTop + wNumOpcoes +1,;
                 pLeft + LEN( aMenuAutorizado[1][1] ) +1 )
   ENDIF

   WHILE ( wNumOpcoes > 0 )

         SETCOLOR( CorMenu() )

         FOR tX:= 1 TO wNumOpcoes
             @ pTop + tX, pLeft + 1 PROMPT aMenuAutorizado[tX][1]
         NEXT tX

         MENU TO wOpcao

         wTela:= SAVESCREEN( 0, 0, MAXROW(), MAXCOL() )

         IF ( LASTKEY() = ESCAPE ) .OR. ( wOpcao = 0 )
            EXIT
          ELSE  // IF (wOpcao>=1 .and. wOpcao<= NumOpcoes ) ( faixa abrangida )
            tPrg:= pPrg + STRZERO( aMenuAutorizado[wOpcao][2], pDigitos )
            &Tprg.()
         ENDIF

         CLEAR TYPEAHEAD
         RESTSCREEN( 0, 0, MAXROW(), MAXCOL(), wTela )
   ENDDO

RETURN( NIL )

/*
* CHOOSE()    -  Busca codeblock em arquivo e coloca conteudo em um array
*                Mostra o conteudo do array por achoice()
*
*    pBlkCond    :  Bloco com a condicao para teste no Arquivo Selecionado
*    pBlkLinha   :  Bloco com o conteudo que deve ter cada linha de Opcao
*    pTop,
*    pLeft,
*    pBottom,
*    pRight      :  Coordenadas de posicao em tela
*    pInclui     :  Logico ( deve(.T.) ou nao(.F.) aceitar inclusoes )
*    pBlkRet     :  Bloco com o conteudo a ser retornado. Se = NIL, RECNO()
*
*/

FUNCTION Choose( pBlkCond, pBlkLinha, pTop,    pLeft,  ;
                 pBottom,  pRight,    pInclui, pBlkRet ;
               )

LOCAL wTotReg:=   0, tEscolha:= 0, tBottom
LOCAL tInclui:=   IIF( pInclui = NIL, .T., pInclui )
LOCAL aSalva:=     { {}, {} }
LOCAL wTela:=     SAVESCREEN( pTop, pLeft, pBottom, pRight )
LOCAL tCor:=      SETCOLOR( CorJan() )
LOCAL tBlkRet:=   IIF( pBlkRet = NIL, { || RECNO() }, pBlkRet )

   IF ( !EOF() )

     WHILE ( !EOF() .AND. EVAL( pBlkCond ) )

       wTotReg++
       AADD( aSalva[1],  EVAL( pBlkLinha ) )
       AADD( aSalva[2],  EVAL( tBlkRet )    )

       SKIP
     ENDDO

     IF tInclui

       wTotReg++
       AADD( aSalva[1],  PADC( "*** INCLUI OUTRO REGISTRO ***",;
                         pRight-pLeft, "" ))
       AADD( aSalva[2],  0 )

       SKIP
     ENDIF

     tBottom:=   IIF( wTotReg > ( pBottom - pTop -1 ), pBottom,;
                  pTop +wTotReg + 1 )

     @ pTop, pLeft, tBottom, pRight BOX BoxFrame()
    RvLShadow( pTop, pLeft, tBottom, pRight )

     tEscolha:= ACHOICE(  pTop +1, pLeft +1, tBottom -1,;
                     pRight -1, aSalva[1], .T., )

     RESTSCREEN( pTop, pLeft, pBottom, pRight, wTela )

     IF (( tEscolha = wTotReg ) .AND. ( tInclui )) .OR. ( tEscolha = 0 )
       GO BOTTOM                    // Se inclui ou ESC, vai para eof
       SKIP                       // se pBlkRet (codblock) nÆo ‚ pas-
      ELSEIF ( pBlkRet = NIL )        // sado como parƒmetro, posiciona no
     GO aSalva[2][tEscolha]       // recno() escolhido, devolvendo nu-
      ELSE                       // mero escolhido se passar, devolve
     tEscolha:= aSalva[2][tEscolha]   // o conteudo do mesmo
     ENDIF
   ENDIF

   SETCOLOR( tCor )

   RETURN( tEscolha )

/*
* GetNewOrder()  -  Procura o ultimo item do campo-de-ordem ( sequˆncia )
*           e devolve o valor do ultimo incrementado de 1, a partir
*                do registro corrente. Depois vai para o fim do Arquivo.
*
* pBlkCond -  Bloco com a condicao para teste no arquivo selecionado
*
* pBlkRet   -  Bloco com o campo de ordem
*
*/

FUNCTION GetNewOrder( pBlkCond, pBlkRet )

LOCAL    tOrdem:= EVAL( pBlkRet )

   WHILE ( EVAL( pBlkCond ) .AND. !EOF()) .AND. ;
       ( VAL( EVAL( pBlkRet )) <= VAL( tOrdem ) + 1 )

     tOrdem:= EVAL( pBlkRet )
     SKIP
   ENDDO

   GO LASTREC() + 1    // VAI PARA O FIM DO ARQUIVO - INCLUSÇO

   RETURN( STRZERO( VAL( tOrdem ) +1, LEN( tOrdem )))

// eof - RVLMenu.prg

* PRG...................: Spacing
* CLASSE................: Espacejamento
* PREFIXO...............: Spa
* EXPORTA...............: Spa_Spacing()
* CONSTRUTORA...........:
* DESTRUTORA............:
* USA...................:
*
* COMENTARIOS...........: Compilar com /a /m /n /w
* NUMERICO[] spa_spacing(texts, l, r)
* CARACTERE  texts[] - Textos a espacejar
* NUMERICO   l, r    - entre estas duas colunas
* RETURN:    Vetor de colunas iniciais
*            Determina coluna inicial para cada texto, espacado uniformemente
*            entre l e r
*

FUNCTION RvlSpacing( aTextos, nLeft, nRight )

LOCAL    nSumLens,  nTextNum, nSpacesBetween, ;
         aCols:=    ARRAY( LEN( aTextos ))

*  Determina o tamanho total das mensagens
nSumLens:= 0
FOR nTextNum:= 1 TO LEN( aTextos )
    nSumLens +=  LEN( aTextos[nTextNum] )
NEXT

*  Quantidade de espacos entre itens
nSpacesBetween:= INT((( nRight - nLeft +1 ) - nSumLens ) / ;
                      ( LEN( aTextos ) +1 ))

*  Primeira posicao nao e conhecida
aCols[1]:=  1 + nSpacesBetween

*  Determina outros a partir desta
FOR nTextNum:= 2 TO LEN( aTextos )
    aCols[nTextNum]:=  aCols[nTextNum -1] + ;
                       LEN( aTextos[nTextNum -1] ) + ;
                       nSpacesBetween
NEXT

RETURN aCols
* : : : : :

FUNCTION RvlPrompt( cTexto )

@ 01,00 SAY REPLICATE( CHR(32), 80 )
@ 01,05 SAY cTexto

RETURN NIL

Re: Erro ao compilar com o Xailer

MensagemEnviado: 17 Jul 2008 20:10
por sygecom
Gilson,
Gere a LIB usando o hbmake, e veja se acontece a mesma coisa.

Re: Erro ao compilar com o Xailer

MensagemEnviado: 20 Jul 2008 18:33
por gilsonpaulo
Obrigado pela ajuda, realmente, mesmo com as warnings a lib foi e gerada e funciona normalmente.

Re: Erro ao compilar com o Xailer

MensagemEnviado: 23 Jul 2008 23:03
por Reginaldo
Caro Gilson,

Esses "Warnings" significam que pode haver ambiguidade com essas variáveis, pois, você não as declarou como LOCAL, GLOBAL, PUBLIC, PRIVATE, etc... (No caso de variáveis PUBLIC o xailer também gera "warnings", pois no xailer tem uma classe, onde você instancia e nela coloca as variáveis públicas do sistema, então, se declarar variáveis PUBLIC, também terá "warnings")

Na minha opinião, essa verificação (de ambiguidade) o velho Clipper já deveria fazer, pois evita problemas que podem ocorrer, por exemplo quando se declara uma variável PUBLIC e numa função qualquer do sistema, você dá outra valor a essa mesma variável, sem saber que ela é publica...

Bom, nem o xHarbour faz essa verificação, mas, como o xailer é utilizado com um xHarbour "otimizado para xailer", creio eu, que essa é umas das "otimizações" que eles colocaram....

Essa verificação é bastante interessante, visto que as variáveis do xharbour, assim como no clipper, são tipadas dinamicamente, e quem sabe os programadores do xharbour, não a implementam numa próxima versão do compilador...

Espero ter ajudado,

Atenciosamente,

Re: Erro ao compilar com o Xailer

MensagemEnviado: 27 Ago 2008 22:24
por mhackervix
A utilização de tipagem para indicar se a expressão (literais) é uma variável de MEMória ou um Campo (do DBF) elimina estes avisos de atenção. Ou seja, declare dentro da função se as Literais são campos ou variáveis.

att.