Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Преобразование типов данных

375
23 октября 2003 года
dominator
199 / / 16.10.2003
Здравствуйте!
Пожалуйста, помогите с проблемкой. Суть ее похоже в том, что строковые данные не преобразовываются в тип 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

Спасибо.
258
23 октября 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by dominator

Dim E As String

'ВБ ругается вот сюда
E = CDbl(TxtPresize)



Так ты посмотри выше, что ты написал то: стринговой переменной пытаешься присвоить результат функции CDbl(), которая конечно возвращает Double.

Как исправить подсказать или сам догадаешься? ;)

375
23 октября 2003 года
dominator
199 / / 16.10.2003
Цитата:
Originally posted by SergeySV


Так ты посмотри выше, что ты написал то: стринговой переменной пытаешься присвоить результат функции CDbl(), которая конечно возвращает Double.

Как исправить подсказать или сам догадаешься? ;)



Подскажи пожалуйста, я новичок здесь:). До этого только html и javascript.
Что я сейчас сделал: переопределил E, как Variant:
Dim E
E = TxtPresize
E = CDbl(E)
Dim d
d = E / 5

Вводимое E - стринговое, далее преобразовываю ее в тип double.
d - здесь будет variant/double, так ведь?
Что я делаю не правильно?

267
23 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by dominator


Подскажи пожалуйста, я новичок здесь:). До этого только html и javascript.
Что я сейчас сделал: переопределил E, как Variant:
Dim E
E = TxtPresize
E = CDbl(E)
Dim d
d = E / 5

Вводимое E - стринговое, далее преобразовываю ее в тип double.
d - здесь будет variant/double, так ведь?
Что я делаю не правильно?



Сейчас будет работать. Единственная тонкость - это "." и ","
Она у тебя будет правильно работать только в одном из вариантов в зависимости от настроек компа.

Поставь вместо CDbl вот эту функцию, она понимает и "," и ".":

Код:
Function ВЧис(Стринг As String, Optional ByRef Bucks As String) As Double
' Переводит строку в число, считывая слева до первой ошибки
' В качестве десятичного знака распознает и ".", и ","
' Если ошибка - обычный символ (т.е. не повторные "+", "-", "." и ","),
' то он помещается в переменную 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
258
23 октября 2003 года
SergeySV
1.5K / / 19.03.2003
Да, писал я как-то vbscript'е. Никаких забот с типами переменных.
Visual Basic такого не прощает, все преобразование лучше делать явно. Вообще это считается плохим стилем использовать тип переменных Variant. Его необходимо использовать только в крайних случаях, когда тип передаевамых данных не известен.
Вот по пунктам недостатки типа Variant, которые надо иметь в виду:
1. занимает больше памяти (по максимуму, он же не знает что в него запихнут)
2. медленнее работает программа с ним (добавляется лишняя проверка, VB проверяет/определяет при каждом изменении значения переменной ее новый тип, был числом, а теперь например строку запихнули, вот...)
3. Потенциальная причина трудноуловимых глюков. (какое бы значение в эту переменную не запихнули она его возьмет, при этом еще в тихоря VB произведет преобразование. Т.е. если у вас тип переменной Long и ваша функция в результате ошибки присваивает присваивает этой переменной Long число =3,14 , то вы сразу получите ошибку и сможете разобраться какого фига так получается (или сделать обработчик ошибок на это). А вот если ваша переменная типа Variant и ей присваивают в результате ошибки неправильное число типа Double, вместо Long, то Ми позволит вам это сделать, а вот потом, где-нибудь в другом месте кода, когда вы будете использовать эту переменную находясь в полной уверенности что она типа Long, ваша программа вылетит с ошибкой и потом придется оазить по всему коду и искать когда и где присвоилось такое неправильное значение.


Так что будьте бдительные товарищи, не используйте типы данных без разбора.
267
23 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Тоже хотел написать о вреде неоправданного использования Variant, но Сергей меня опередил. :)
И, конечно, надо использовать Option Explicit.
375
23 октября 2003 года
dominator
199 / / 16.10.2003
Цитата:
Originally posted by Cutty Sark


Сейчас будет работать. Единственная тонкость - это "." и ","
Она у тебя будет правильно работать только в одном из вариантов в зависимости от настроек компа.



Не работает. Но не ваша функция, конечно, а вообще моя прога. Я просто хотел разобраться, что происходит.
Спасибо за функцию:) Сильно.
Но мне пока достаточно было бы того, если бы программа просто работала.
(извиняюсь за возможный повтор вопросов):
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.

Где моя ошибка? Подскажите пожалуйста.

ВБ у меня настроен на ввод десятичных значений при помощи точек.

Спасибо.

267
23 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Ну ты в дебаггере пошагово повыполняй свою программу, последи за переменными и посмотри, что получается.
375
23 октября 2003 года
dominator
199 / / 16.10.2003
Цитата:
Originally posted by Cutty Sark
Ну ты в дебаггере пошагово повыполняй свою программу, последи за переменными и посмотри, что получается.



В пошаговом режиме:
Dim E
E = TxtPresize 'здесь значение строковое (я вводу к примеру 0.1)
E = CDbl(E) 'здесь несовпадение типов
Если не ошибаюсь, тут E должен был преобразоваться в дабл изначение присвоиться также E, т.е. дальше E в программе должен работать, как дабл. Похоже я ошибаюсь?

267
23 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Ну сделай две переменных вместо одной, ну что ты мучаешь компьютер. И вообще, сразу избавляйся от Вариант, зачем откладывать хорошее на потом.
375
23 октября 2003 года
dominator
199 / / 16.10.2003
Цитата:
Originally posted by Cutty Sark
Ну сделай две переменных вместо одной, ну что ты мучаешь компьютер. И вообще, сразу избавляйся от Вариант, зачем откладывать хорошее на потом.



Ладно, спасибо всем за все советы.
Очень непривычно чувствовать себя в роли "новичка" :)
обычно ко мне бегают с вопросами:)
С ВБ я сижу первый день:)

258
23 октября 2003 года
SergeySV
1.5K / / 19.03.2003
Cdbl конечно же хитрая функция. Если разделить в системе стоит как точка, то она берет и точку и запятую, а вот если стоит запятая, то точку она уже не воспринимает.

Я вообщем писал так, когда приперало, просто менял в строке . на , через функцию replace
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог