Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 4698
Рейтинг: 426
#1: 2011-02-15 15:57:51 ЛС | профиль | цитата
Решил немного опробовать VB 6.0, так как именно его мы будем проходить в школе, попробовал, как сказать, удачно, уже с час сижу мучаю простой код. Ругается все время на одну строчку во время выполнения, я ее выделю комментарием. Так же к посту прикрепил архивчик с проектом этой программы, на всякий случай.
#bas
Private Type Parser
index As Long
data As String
oper As Byte
token As String
End Type
Private Sub Parser_GetToken(ByRef pr As Parser)
pr.oper = 0
'Dim c As String
c = Mid(pr.data, pr.index, 1) ' Вот на эту гадость он ругается, только сменю pr.index на какое-нибудь число, так все сразу ок
While c = " " And pr.index < Len(pr.data)
pr.index = pr.index + 1
c = Mid(pr.data, pr.index, 1)
Wend
'select block
If c >= "0" And c <= "9" Then
pr.oper = 1
While c >= "0" And c <= "9" And pr.index < Len(pr.data)
pr.token = pr.token + c
pr.index = pr.index + 1
c = Mid(pr.data, pr.index, 1)
Wend
Else
If c = "+" Or c = "-" Or c = "*" Or c = "/" Then
pr.oper = 2
pr.token = c
pr.index = pr.index + 1
Else
If c = "(" Or c = ")" Then
pr.oper = 3
pr.token = c
pr.index = pr.index + 1
Else
MsgBox "Unknown token at position" + Str$(pr.index)
End If
End If
End If
End Sub
Private Function Parser_Parse(ByRef pr As Parser) As Double
pr.oper = 0
pr.index = 0
Dim x As Double
Parser_GetToken pr
Parser_level1 pr, x
If pr.oper = 0 Then Parser_Parse = 0 Else Parser_Parse = x
End Function
Private Sub Parser_level1(ByRef pr As Parser, ByRef x As Double) '+ -
Parser_level2 pr, x
If pr.oper <> 0 Then
Dim y As Double
Parser_level2 pr, y
If pr.oper <> 0 Then
While pr.oper = 2
Select Case pr.token$
Case "+"
x = x + y
Case "-"
x = x - y
End Select
Wend
End If
End If
End Sub
Private Sub Parser_level2(ByRef pr As Parser, ByRef x As Double) '* /
Parser_level3 pr, x
If pr.oper <> 0 Then
Dim y As Double
Parser_level3 pr, y
If pr.oper <> 0 Then
While pr.oper = 2
Select Case pr.token$
Case "*"
x = x * y
Case "/"
x = x / y
End Select
Wend
End If
End If
End Sub
Private Sub Parser_level3(ByRef pr As Parser, ByRef x As Double) '()
If pr.oper = 1 Then
x = CInt(pr.token)
Else
If pr.oper = 3 Then
Parser_GetToken pr
If pr.oper <> 0 Then
Parser_level1 pr, x
If pr.oper <> 3 And pr.token$ <> ")" Then
pr.oper = 0
MsgBox "Excepted ')' at line " + Str$(pr.index)
End If
End If
End If
End If
End Sub

Private Sub Command1_Click()
Dim pr As Parser
pr.data = "2 + 2"
MsgBox Parser_Parse(pr)
End Sub
calculator.rar
карма: 10
0
файлы: 1calculator.rar [1.5KB] [91]
Администрация
Ответов: 15295
Рейтинг: 1519
#2: 2011-02-15 16:03:20 ЛС | профиль | цитата
ну так параметр типа Integer, а пытаешься передать Long
карма: 27
0
Ответов: 4631
Рейтинг: 749
#3: 2011-02-15 16:12:27 ЛС | профиль | цитата
Assasin, а что пишет при ошибке?
карма: 26

0
Разработчик
Ответов: 4698
Рейтинг: 426
#4: 2011-02-15 17:16:31 ЛС | профиль | цитата
Dilma писал(а):
ну так параметр типа Integer, а пытаешься передать Long

Я пробовал изменять тип Index на Long, прежний был Integer, все равно не работало
Netspirit писал(а):
Assasin, а что пишет при ошибке?

invalid procedure call or argument
карма: 10
0
Ответов: 4631
Рейтинг: 749
#5: 2011-02-15 17:20:07 ЛС | профиль | цитата
Может этот index принимает какие-то недопустимые значения (например, отрицательные)?
карма: 26

0
Ответов: 5227
Рейтинг: 587
#6: 2011-02-15 18:01:54 ЛС | профиль | цитата
Assasin, pr.index = 0, что недопустимо в данной функции для стартовой позиции

карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
1
Голосовали:Assasin
Разработчик
Ответов: 4698
Рейтинг: 426
#7: 2011-02-17 18:20:07 ЛС | профиль | цитата
andrestudio писал(а):
Assasin, pr.index = 0, что недопустимо в данной функции для стартовой позиции

Ужас, никак не мог об этом подумать, видимо теперь для меня все слишком простое непонятным стало
карма: 10
0
Ответов: 5227
Рейтинг: 587
#8: 2011-02-17 18:50:31 ЛС | профиль | цитата
Assasin, а что там собственно непонятно, чем скажем Mid от Copy в KOL отличается, глянь в код компонента и увидишь там проверку на "0" c инкрементом свойства Position
------------ Дoбавленo в 18.50:
это всё вигня, я на пустом месте бывает по два дня буксую, нужно просто дать себе остыть и ручник сам снимается как правило
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 4698
Рейтинг: 426
#9: 2011-02-17 18:52:56 ЛС | профиль | цитата
Новая проблема, есть класс Parser:
#bas
Private oper As Byte
Public data As String
Private token As String
Private index As Integer
Пишу вот такой код при нажатии на кнопку:
#bas
Private Sub Command1_Click()
Dim pr As Parser
pr.data = CStr(Formula.Text)
End Sub
Результат выполнения присваивания:
Object variable or With block variable not set

Что это может значить?
------------ Дoбавленo в 18.52:
Все, понял, экземпляр класса то создать нужно
карма: 10
0
Ответов: 5227
Рейтинг: 587
#10: 2011-02-17 19:12:08 ЛС | профиль | цитата
andrestudio писал(а):
c инкрементом свойства Position
спутал там Position := 1 а Count инкрементируется.
Assasin писал(а):
Formula.Text
это что имя текстбокса?

------------ Дoбавленo в 19.12:
ну вот, а я уже поверил что он есть
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)