Страница: 1 |
Страница: 1 |
Вопрос: Глюк в VB6
Добавлено: 02.07.04 18:41
Автор вопроса: @CyRax PTR | Web-сайт:
Скомпилировал программу. При запуске, когда доходит до одной функции типа Byte выдаёт ошибку 6 (Overflow). Проверял возвращаемое значение - все в диапазоне байта. Делал функции тип Integer и Variant - всё равно ошибка 6.
Работает в: IDE, P-Code, Native Code без оптимизации.
Глючит в: Native Code с оптимизацией для маленького или быстрого кода.
Может его побороть как то можно? А?
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
dNW
Вопросов: 30
Ответов: 683
Профиль | | #1
Добавлено: 02.07.04 19:01
У меня тоже такое было, но я так и не поня почему. Я начал перепроверять весь подозрительный код, поменял кое-что и все поехало
Номер ответа: 2
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #2
Добавлено: 02.07.04 19:10
Остаётся только найти это "кое-что".
Там и кода практически нет. Десяток констант, пару сложений и десяток CHR$(Константа).
Вот и всё собственно. Здаётся мне что сам VB неправильный оптимизированный код генерирует.
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 02.07.04 20:03
может стоит тип явно указать для всех переменных...
дай код... может я голову поломаю...
Номер ответа: 4
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #4
Добавлено: 02.07.04 20:30
>может стоит тип явно указать для всех переменных...
- Option Explicit
>дай код... может я голову поломаю...
- На.
Function Mnemonic_Common_OpCodes(ByVal Mnemonic As String, ByVal Op1_Type As String, ByVal Op2_Type As String, ByRef StrRet As String) As Byte
'ADD,OR,ADC,SBB,AND,SUB,XOR,CMP
 im OperatorOffset As Byte
OperatorOffset = Mnemonic_Common_OperatorStep(Mnemonic)
 im Ext16 As String
Ext16 = Chr$(&H66)
Const R_Offset As Byte = &HC0
Const m8r8 As Byte = &H0 '&H0
'Const r8r8 As Byte = m8r8 '&HC0
Const r8m8 As Byte = &H2 '&H0
Const r8r8 As Byte = r8m8 '&HC0
Const m32r32 As Byte = &H1 '&H0
Const r32m32 As Byte = &H3 '&H0
'Const r32r32 As Byte = m32r32 '&HC0
Const r32r32 As Byte = r32m32 '&HC0
Const m8imm8 As Byte = &H80 '&H0
Const r8imm8 As Byte = m8imm8 '&HC0
Const m32imm32 As Byte = &H81 '&H0
Const r32imm32 As Byte = m32imm32 '&HC0
Const S_m32imm8 As Byte = &H83 '&H0 /sign-extended
Const S_r32imm8 As Byte = S_m32imm8 '&HC0 /sign-extended
Const ALimm8 As Byte = &H4
Const EAXimm32 As Byte = &H5
Select Case Op1_Type & Op2_Type
Case "m8r8"
StrRet = Chr$(m8r8 + OperatorOffset)
Case "r8r8"
StrRet = Chr$(r8r8 + OperatorOffset)
Mnemonic_Common_OpCodes = R_Offset
Case "m16r16"
StrRet = Ext16 & Chr$(m32r32 + OperatorOffset)
Case "r16r16"
StrRet = Ext16 & Chr$(r32r32 + OperatorOffset)
Mnemonic_Common_OpCodes = R_Offset
Case "m32r32"
StrRet = Chr$(m32r32 + OperatorOffset)
Case "r32r32"
StrRet = Chr$(r32r32 + OperatorOffset)
Mnemonic_Common_OpCodes = R_Offset
Case "r8m8"
StrRet = Chr$(r8m8 + OperatorOffset)
Case "r16m16"
StrRet = Ext16 & Chr$(r32m32 + OperatorOffset)
Case "r32m32"
StrRet = Chr$(r32m32 + OperatorOffset)
Case "m8imm8"
StrRet = Chr$(m8imm8)
Mnemonic_Common_OpCodes = OperatorOffset
Case "r8imm8"
StrRet = Chr$(r8imm8)
Mnemonic_Common_OpCodes = R_Offset + OperatorOffset
Case "m16imm16"
StrRet = Ext16 & Chr$(m32imm32)
Mnemonic_Common_OpCodes = OperatorOffset
Case "m32imm32"
StrRet = Chr$(m32imm32)
Mnemonic_Common_OpCodes = OperatorOffset
Case "r16imm16"
StrRet = Ext16 & Chr$(r32imm32)
Mnemonic_Common_OpCodes = R_Offset + OperatorOffset
Case "r32imm32"
StrRet = Chr$(r32imm32)
Mnemonic_Common_OpCodes = R_Offset + OperatorOffset
Case "ALimm8"
'StrRet = Chr$(ALimm8 + OperatorOffset)
Mnemonic_Common_OpCodes = ALimm8 + OperatorOffset
Case "AXimm16", "AXimm8"
'StrRet = Ext16 & Chr$(EAXimm32 + OperatorOffset)
StrRet = Ext16
Mnemonic_Common_OpCodes = EAXimm32 + OperatorOffset
Case "EAXimm32", "EAXimm16", "EAXimm8"
'StrRet = Chr$(EAXimm32 + OperatorOffset)
Mnemonic_Common_OpCodes = EAXimm32 + OperatorOffset
Case Else
MsgBox "Invalid operand(s)" & vbCr & Mnemonic & " " & Op1_Type & "," & Op2_Type
End Select
End Function
=======
Можеть тебе лучше весь VBASM выслать? Всё равно он Open-Source.
Номер ответа: 5
Автор ответа:
dNW
Вопросов: 30
Ответов: 683
Профиль | | #5
Добавлено: 02.07.04 21:28
> Там и кода практически нет
мда уж. Действительно почти нет...
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 02.07.04 22:19
>>может стоит тип явно указать для всех переменных...
> - Option Explicit
Я имел в виду:
Long&
Integer%
Single!
Currency@
String$
сейчас на ошибку полюбуюсь...
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 02.07.04 22:45
ты бы хоть дал еще и Mnemonic_Common_OperatorStep
а так же объяснил че в параметры передавать...
голый код это конечно хорошо, тут еще даже и без комментариев, это совсем замечательно
я не телепат ))
Номер ответа: 8
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #8
Добавлено: 02.07.04 23:21
Держи, не телепат
Function Mnemonic_Common_OperatorStep(ByVal Operator As String) As Byte
'255 - Error
Mnemonic_Common_OperatorStep = 255
Operator = UCase$(Trim$(Operator))
Select Case Operator
Case "ADD"
Mnemonic_Common_OperatorStep = &H0
Case "OR"
Mnemonic_Common_OperatorStep = &H8
Case "ADC"
Mnemonic_Common_OperatorStep = &H10
Case "SBB"
Mnemonic_Common_OperatorStep = &H18
Case "AND"
Mnemonic_Common_OperatorStep = &H20
Case "SUB"
Mnemonic_Common_OperatorStep = &H28
Case "XOR"
Mnemonic_Common_OperatorStep = &H30
Case "CMP"
Mnemonic_Common_OperatorStep = &H38
End Select
End Function
===
'Этот код вызывает Mnemonic_Common_OpCodes
 im Const_Opcodes As String, Variable_Opcodes As Byte
' Warning !!!
'Function Mnemonic_Common_OpCodes returns Error 6 (Overflow) when:
' "Compile to Native Code" with "Optimize for Fast Code" or "Optimize for Small Code"
'For compile to 'Native Code' use "No Optimization" option.
'Ошибка возникает здесь ->
Variable_Opcodes = Mnemonic_Common_OpCodes(Mnemonic, Op1_Type, Op2_Type, Const_Opcodes)
===
Перед вызовом сделай
Op1_Type="r32":Op2_Type="imm32"
Mnemonic=Одна из списка выше
Знать что это не обязательно. Тем более что ты не телепат