Ir ao conteúdo
  • Cadastre-se

Visual Basic Visual Basic 6: Como evitar o overflow?


Posts recomendados

como evitar o overflow no Visual Basic 6?

Function ShiftRight(ByVal lngNumber As Long, ByVal intNumBits As Integer) As Long
    '--------------
    'BIT SHIFT RIGHT >>
    '--------------
    ShiftRight = lngNumber \ 2 ^ intNumBits 'note the integer division op
End Function

Function ShiftLeft(ByVal lngNumber As Long, ByVal intNumBits As Integer) As Long
    '--------------
    'BIT SHIFT LEFT <<
    '--------------
    ShiftLeft = lngNumber * 2 ^ intNumBits
End Function

 '............

Dim mx As Integer
mx = Cnt(ShiftLeft(rx, 6)) 'overflow error

o 'mx' dá me o erro de overflow runtime error '6'. como posso evitar esse erro?

Link para o comentário
Compartilhar em outros sites

@Cambalinho , bom dia.

 

Esse tipo de erro no VBA ocorre quando o resultado de uma atribuição, cálculo ou conversão de tipo de dados é muito grande para ser representado dentro do intervalo de valores permitido para esse tipo de variável, atribua o valor a uma variável de um tipo que possa conter um intervalo maior de valores.

Ou, uma atribuição a uma propriedade excede o valor máximo que a propriedade pode aceitar.


Exemplo:

image.thumb.png.c84b6664836b01defd34e38d80e76c39.png

 

Veja no exemplo acima que recebemos o Overflow, pois uma variável do tipo Integer pode receber valores de 2 bytes, entre -32.768 e 32.767, enquanto tentamos atribuir 10.000.000 nela.

 

Talvez esse material te ajude: https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/overflow-error-6

 

Espero ter ajudado!

Abraço,

Diego

  • Amei 1
Link para o comentário
Compartilhar em outros sites

vendo bem eu posso ter 1 erro da calculos para fazer o RayCasting :(

Private Sub RayCasting()
    Dim r As Integer
    Dim mx As Integer
    Dim my As Integer
    Dim mp As Integer
    Dim mapx As Double
    Dim mapy As Double
    Dim dof As Integer
    Dim rx As Double
    Dim ry As Double
    Dim ra As Double
    Dim x0 As Double
    Dim y0 As Double
    
    ra = PlayerAngle
    For r = 0 To 10
        'Debug.Print "raycsting"
        'check Horizontal Lines:
        dof = 0
        Dim atan As Double
        If (Tan(ra) > 0) Then
            atan = -1 / Tan(ra)
        Else
            atan = -1
        End If
        If (ra > PI) Then
            ry = (CInt(ShiftLeft(ShiftRight(PlayerY, 6), 6) - 0.0001))
            rx = (PlayerY - ry) * atan + PlayerX
            y0 = -64
            x0 = -y0 * atan
        End If
        If (ra < PI) Then
            ry = (CLng(ShiftLeft(ShiftRight(PlayerY, 6), 6) + 64))
            rx = (PlayerY - ry) * atan + PlayerX
            y0 = 64
            x0 = -y0 * atan
        End If
        If (ra = 0 Or ra = PI) Then
            rx = PlayerX
            ry = PlayerY
            dof = 8
        End If
        While (dof < 8)
            
            mx = Cnt(ShiftLeft(rx, 6)) 'overflow error
            my = CLng(ShiftLeft(ry, 6))
            mp = mx * mapx + mx
            If (LevelMap(mapy)(mapx) = 1) Then
                dof = 8
            Else
                rx = rx + x0
                ry = ry + y0
                dof = dof + 1
            End If
            
            Me.Line (PlayerX, PlayerY)-(rx, ry), vbRed
        Wend
    Next r
End Sub

 

Link para o comentário
Compartilhar em outros sites

@Cambalinho ,

 

Na verdade depende da forma que você vai utilizar a variável.

 

Para gerar um overflow, devemos definir um valor fora do limite de valores que uma variável suporta, como por exemplo uma variável do tipo Integer que suporta valores entre -32.768 e 32.767, você pode gerar um overflow dessa forma:
 

Dim inteiro As Integer
inteiro = 32767 'Valor máximo suportado
Debug.Print inteiro
inteiro = inteiro + 1 'Overflow pois 32.767+1=32.768 é maior que 32.767
Debug.Print inteiro

 

image.png.1df3cdcedbc98a87bf5eea5debad4cb1.png

 

Podemos resolver o overflow anterior declarando uma variável do tipo Long para armazenar o resultado, pois esse tipo de variável suporta valores entre -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.

 

Dim longo As Long 'Variável que suporta valores entre -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807
longo = 32767
Debug.Print longo
longo = longo + 1
Debug.Print longo

 

image.png.bbf1d2c5d529263aad5edfa493b8d65a.png

 

Avaliando o seu código, você desloca os valores da variável rx em 6 casas decimais para a esquerda, em mx = Cnt(ShiftLeft(rx, 6)).

Caso sua variável valesse 192 (Hexadecimal 0000 0000 1100 0000) e você deslocasse 6 casas para a esquerda, ela iria valer 2304 (Hexadecimal  0000 0011 0000 0000).

Nesse caso não temos overflow.

 

image.png.44580cd51b59c07fdaacc2133bdb7324.png

 

No próximo exemplo, coloco o valor 32000 na variável rx, com o hexadecimal 0111 1111 1111 1111.

Ao deslocar 1 casa para a esquerda, o valor hexadecimal de mx é 1111 1010 0000 0000 que é maior que 0111 1111 1111 1111.

Temos então o overflow.

 

image.png.a896aa785fa88f3b22a192d75d8b948e.png

 

Espero ter ajudado!

Abraço,

Diego

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!