Преобразование типов данных
Пожалуйста, помогите с проблемкой. Суть ее похоже в том, что строковые данные не преобразовываются в тип double.
Я никогда до этого VB не занимался, но мне очень нужно решить эту задачу в самое ближайшее время.
Программка приведена ниже. Здесь три текстбокса:
TxtPresize-тот, где мы вводим точность вычислений. Именно это значение применяется далее в вычислениях.
Еще два текстбокса - для вывода значений.
Option Explicit
Dim a As Double
Dim b As Double
Dim n As Integer
Dim x1 As Double
Dim x2 As Double
Dim f1 As Double
Dim f2 As Double
Dim E As String
Dim En As Double
Dim x3 As Double
Dim F As Double
Private Sub CmdCalc_Click()
Calc
End Sub
Public Sub Calc()
a = 0
b = 1
n = 0
'ВБ ругается вот сюда
E = CDbl(TxtPresize)
Dim d As Double
d = E / 5
Do While En > E
x1 = (b + a - d) / 2
x2 = (b + a + d) / 2
f1 = x1 ^ 3 - 3 * Math.Sin(x1)
f2 = x2 ^ 3 - 3 * Math.Sin(x2)
If f1 <= f2 Then
b = x2
Else
a = x1
End If
n = n + 1
En = (b - a) / 2
Loop
x3 = (a + b) / 2
TxtRes.Text = Str(x3)
TxtIteration.Text = Str(n)
End Sub
Спасибо.
Dim E As String
'ВБ ругается вот сюда
E = CDbl(TxtPresize)
Так ты посмотри выше, что ты написал то: стринговой переменной пытаешься присвоить результат функции CDbl(), которая конечно возвращает Double.
Как исправить подсказать или сам догадаешься? ;)
Так ты посмотри выше, что ты написал то: стринговой переменной пытаешься присвоить результат функции CDbl(), которая конечно возвращает Double.
Как исправить подсказать или сам догадаешься? ;)
Подскажи пожалуйста, я новичок здесь:). До этого только html и javascript.
Что я сейчас сделал: переопределил E, как Variant:
Dim E
E = TxtPresize
E = CDbl(E)
Dim d
d = E / 5
Вводимое E - стринговое, далее преобразовываю ее в тип double.
d - здесь будет variant/double, так ведь?
Что я делаю не правильно?
Подскажи пожалуйста, я новичок здесь:). До этого только html и javascript.
Что я сейчас сделал: переопределил E, как Variant:
Dim E
E = TxtPresize
E = CDbl(E)
Dim d
d = E / 5
Вводимое E - стринговое, далее преобразовываю ее в тип double.
d - здесь будет variant/double, так ведь?
Что я делаю не правильно?
Сейчас будет работать. Единственная тонкость - это "." и ","
Она у тебя будет правильно работать только в одном из вариантов в зависимости от настроек компа.
Поставь вместо CDbl вот эту функцию, она понимает и "," и ".":
' Переводит строку в число, считывая слева до первой ошибки
' В качестве десятичного знака распознает и ".", и ","
' Если ошибка - обычный символ (т.е. не повторные "+", "-", "." и ","),
' то он помещается в переменную Bucks
Dim x As Double, i As Integer, Dig1 As Double, Dig2 As Double
x = 0
ВЧис = 0
Bucks = ""
Dig1 = 10
Dig2 = 1
For i = 1 To Len(Стринг)
Select Case Mid(Стринг, i, 1)
Case "0" To "9"
x = x * Dig1 + Val(Mid(Стринг, i, 1)) / Dig2
ВЧис = x
If Dig1 = 1 Then Dig2 = Dig2 * 10
Case "+"
If i <> 1 Then Exit Function
Case "-"
If i <> 1 Then Exit Function
Dig2 = -Dig2
Case ",", "."
If Dig1 <> 10 Then Exit Function
Dig1 = 1
Dig2 = Dig2 * 10
Case Else
Bucks = Mid(Стринг, i, 1)
Exit Function
End Select
Next i
End Function
Visual Basic такого не прощает, все преобразование лучше делать явно. Вообще это считается плохим стилем использовать тип переменных Variant. Его необходимо использовать только в крайних случаях, когда тип передаевамых данных не известен.
Вот по пунктам недостатки типа Variant, которые надо иметь в виду:
1. занимает больше памяти (по максимуму, он же не знает что в него запихнут)
2. медленнее работает программа с ним (добавляется лишняя проверка, VB проверяет/определяет при каждом изменении значения переменной ее новый тип, был числом, а теперь например строку запихнули, вот...)
3. Потенциальная причина трудноуловимых глюков. (какое бы значение в эту переменную не запихнули она его возьмет, при этом еще в тихоря VB произведет преобразование. Т.е. если у вас тип переменной Long и ваша функция в результате ошибки присваивает присваивает этой переменной Long число =3,14 , то вы сразу получите ошибку и сможете разобраться какого фига так получается (или сделать обработчик ошибок на это). А вот если ваша переменная типа Variant и ей присваивают в результате ошибки неправильное число типа Double, вместо Long, то Ми позволит вам это сделать, а вот потом, где-нибудь в другом месте кода, когда вы будете использовать эту переменную находясь в полной уверенности что она типа Long, ваша программа вылетит с ошибкой и потом придется оазить по всему коду и искать когда и где присвоилось такое неправильное значение.
Так что будьте бдительные товарищи, не используйте типы данных без разбора.
И, конечно, надо использовать Option Explicit.
Сейчас будет работать. Единственная тонкость - это "." и ","
Она у тебя будет правильно работать только в одном из вариантов в зависимости от настроек компа.
Не работает. Но не ваша функция, конечно, а вообще моя прога. Я просто хотел разобраться, что происходит.
Спасибо за функцию:) Сильно.
Но мне пока достаточно было бы того, если бы программа просто работала.
(извиняюсь за возможный повтор вопросов):
Cdbl по идее переводит любой тип данных в double, так? Т.е., записывая:
Dim E
E = TxtPresize
E = CDbl(E)
Dim d
d = E / 5
получаю:
Dim E -определяю E, как variant
E = TxtPresize -получаю значение из текстбокса, приравнивая его к переменной E
E = CDbl(E) -а вот здесь перевожу variant/string в double, так ведь? Т.е. в E у меня сейчас должно сидеть значение из текстбокса, уже преобазованное в дабл, я прав?
Dim d
d = E / 5 - здесь автоматически d -variant преобразовывается в variant/double.
Дело в том, что vb кричит о несовпадении типов данных: Error 13.
Где моя ошибка? Подскажите пожалуйста.
ВБ у меня настроен на ввод десятичных значений при помощи точек.
Спасибо.
Ну ты в дебаггере пошагово повыполняй свою программу, последи за переменными и посмотри, что получается.
В пошаговом режиме:
Dim E
E = TxtPresize 'здесь значение строковое (я вводу к примеру 0.1)
E = CDbl(E) 'здесь несовпадение типов
Если не ошибаюсь, тут E должен был преобразоваться в дабл изначение присвоиться также E, т.е. дальше E в программе должен работать, как дабл. Похоже я ошибаюсь?
Ну сделай две переменных вместо одной, ну что ты мучаешь компьютер. И вообще, сразу избавляйся от Вариант, зачем откладывать хорошее на потом.
Ладно, спасибо всем за все советы.
Очень непривычно чувствовать себя в роли "новичка" :)
обычно ко мне бегают с вопросами:)
С ВБ я сижу первый день:)
Я вообщем писал так, когда приперало, просто менял в строке . на , через функцию replace