Página 1 de 1

Como resolver este erro compilando com -w3

Enviado: 10 Out 2012 22:00
por JoséQuintas
Comecei a ajustar os fontes pra compilar com -w3.
No caso desta rotina, não sei como resolver. Poderiam ajudar?
Obs. não é bug, é só o aviso compilando com -w3

Compiling 'ZE_XHARB.prg'...
ZE_XHARB.prg(172) Warning W0032 Variable 'NTBCOLEND' is assigned but not used in function 'MBRZMOVE
(130)'

Código: Selecionar todos

FUNCTION MBrzMove(oTb,nMRow,nMCol,nTop,nLeft,nBottom,nRight)
   LOCAL nTbCol, nTbColEnd, nTbRow
   LOCAL lHandled := .f.
   oTb:refreshall()
   DO WHILE !oTb:stabilize()
   ENDDO

   IF nTop==NIL .OR. nLeft==NIL .OR. nBottom==NIL .OR. nRight==NIL
      nTop    := MBRZFDATA(oTb)
      nBottom := MBRZLDATA(oTb)
      nLeft   := oTb:nLeft
      nRight  := oTb:nRight
   ENDIF
   nTbCol    := COL()
   nTbColEnd := nTbCol+oTb:colwidth(oTb:colpos)-1
   nTbRow    := ROW()

   IF nMRow>=nTop .AND. nMRow<=nBottom .AND. nMCol>=nLeft .AND. nMCol<=nRight
      IF nMCol < nTbCol
         lHandled := .t.
         DO WHILE nMCol < nTbCol .AND. oTb:colpos > oTb:leftvisible-oTb:freeze
            oTb:left()
            DO WHILE !oTb:stabilize()
            ENDDO
            nTbCol    := COL()
            nTbColEnd := nTbCol+oTb:colwidth(oTb:colpos)-1
         ENDDO

      ELSEIF nMCol > nTbColEnd
         lHandled := .t.
         DO WHILE nMCol > nTbCol .AND. nMCol > nTbColend .AND. oTb:colpos < oTb:rightvisible
            oTb:right()
            DO WHILE !oTb:stabilize()
            ENDDO
            nTbCol    := COL()
            nTbColEnd := nTbCol+oTb:colwidth(oTb:colpos)-1
         ENDDO
      ENDIF

      IF nMRow < nTbRow
         lHandled := .t.
         DO WHILE nTbRow > nMRow
           oTb:up()
           nTbRow--
         ENDDO
      ELSEIF nMRow > nTbRow
         lHandled := .t.
         DO WHILE nTbRow < nMRow
            oTb:down()
            nTbRow++
         ENDDO
      ENDIF
   ENDIF
   IF lHandled
      DO WHILE !oTb:stabilize()
      ENDDO
   ENDIF
RETURN lHandled
José M. C. Quintas

Como resolver este erro compilando com -w3

Enviado: 10 Out 2012 22:19
por Imatech
Simplesmente:

Se declarar 1 variavel: alem de lhe atribuir algum valor, precisa usa-la no processamento...

Código: Selecionar todos

FUNCTION MBrzMove( oTb, nMRow, nMCol, nTop, nLeft, nBottom, nRight )
   LOCAL nTbCol
   LOCAL nTbColEnd
   LOCAL nTbRow
   LOCAL lHandled := .F.

   oTb:refreshall()

   WHILE !( oTb:stabilize() )
   ENDDO

   IF ( nTop == NIL ) .OR. ( nLeft == NIL ) .OR. ( nBottom == NIL ) .OR. ( nRight == NIL )
      nTop    := MBRZFDATA( oTb )
      nBottom := MBRZLDATA( oTb )
      nLeft   := oTb:nLeft
      nRight  := oTb:nRight
   ENDIF

   nTbCol    := Col()
   nTbRow    := Row()

   IF ( nMRow >= nTop ) .AND. ( nMRow <= nBottom ) .AND. ( nMCol >= nLeft ) .AND. ( nMCol <= nRight )

      IF nMCol < nTbCol

         lHandled := .T.
         DO WHILE nMCol < nTbCol .AND. oTb:colpos > oTb:leftvisible - oTb:freeze
            oTb:Left()
            DO WHILE !oTb:stabilize()
            ENDDO
            nTbCol  := Col()
         ENDDO

      ELSE

         nTbColend := ( nTbCol + oTb:colwidth( oTb:colpos ) - 1 )
         IF nMCol > nTbColend
            lHandled := .T.
            WHILE ( nMCol > nTbCol ) .AND. ( nMCol > nTbColend ) .AND. ( oTb:colpos < oTb:rightvisible )
               oTb:Right()
               DO WHILE !oTb:stabilize()
               ENDDO
               nTbCol  := Col()
            ENDDO
         ENDIF

      ENDIF

      IF nMRow < nTbRow
         lHandled := .T.
         DO WHILE nTbRow > nMRow
            oTb:up()
            nTbRow--
         ENDDO
      ELSEIF nMRow > nTbRow
         lHandled := .T.
         DO WHILE nTbRow < nMRow
            oTb:down()
            nTbRow++
         ENDDO
      ENDIF
   ENDIF

   IF lHandled
      DO WHILE !oTb:stabilize()
      ENDDO
   ENDIF

   RETURN lHandled


Como resolver este erro compilando com -w3

Enviado: 11 Out 2012 07:06
por JoséQuintas
Com a mudança de formatação, demorei mais um pouco pra ver o real motivo.

A variável estava sendo atribuída e usada na rotina.
Mas a atribuição dentro do primeiro do while não servia pra nada e a linha pode ser removida.

Caracas, que checagem!!! Permitiu reduzir código.

Só resta saber o que seria mais comum pra variáveis public e private.
Ficar colocando memvar pra isso é tão chato, que parece até ser errado usar, principalmente se pensar em multithread.

Como resolver este erro compilando com -w3

Enviado: 13 Out 2012 10:03
por sygecom
JoséQuintas escreveu: Só resta saber o que seria mais comum pra variáveis public e private.
Ficar colocando memvar pra isso é tão chato, que parece até ser errado usar, principalmente se pensar em multithread.
Acho que o certo é nem usar, quando precisar usar, deve se criar uma classe que retorne os valores dessas variáveis que iria ser publicas ou private.
Outra coisa interessante que você pode fazer isso por .PRG apenas acrescentando no inicio do .PRG as seguintes linhas:

#pragma /w2
#pragma /es2

Nota: Nesse caso é como se fosse: -W2

Como resolver este erro compilando com -w3

Enviado: 14 Out 2012 13:49
por JoséQuintas
Essa dica por PRG é uma mão na roda.
Só a de classes pra variáveis públicas, pra multithread é que precisa algo mais.

Tenho substituído minhas variáveis públicas por uma classe sistema.
Em multithread, a classe vai ter valores diferentes.
Se criar um array estático ajuda, mas ainda vou ter a classe diferente.

Talvez exista uma propriedade no DATA da classe que funcione como alias, seria a solução neste caso.
Existe essa opção? Algo parecido com:

Código: Selecionar todos

Static aParametros[100]
Create Class SistemaClass
   Data Usuario alias aParametros[1]
  EndClass
Desta forma, cada módulo poderia ter sua classe sistemaclass, mas os valores seriam os mesmos em todas as threads.

Outra coisa que já vi foi

Static thread var

Isso é pra que o conteúdo seja isolado por thread?
Se for isso, meu wSave()/wRestore(), pra salvar/restaurar telas, seria o primeiro candidato a fazer uso, já que cada thread teria seu conjunto de telas salvas.

No final, as várias threads vão ser até mais úteis pra quem ainda usa DBF como eu.
Abrir janela de clientes e estoque, por exemplo, só multithread pra manter posicionamento de área, registro, índice, etc.