Винды и неявное преобразование типов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Лёха_Virus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 24.03.2003 (Пн) 17:13
Откуда: Анграск

Винды и неявное преобразование типов

Сообщение Лёха_Virus » 28.05.2004 (Пт) 14:51

Пролог: написал программу дома (на виндовс МЕ), работает всё замечательно - принёс в универ, запускаю - type mismatch error #13... ну думаю скосячил где-нить... вторая попытка - результат аналогичный.
Принёс к другу на комп с виндой ХР - та же ошибка.. открыл проект, отлаживаю:
строка
Код: Выделить всё
gamma.AddItem betta.TextMatrix(1, 1) * 100

вызвала ошибку №13, где gamma - combobox, betta- flexgrid. странно. как так! дома же всё работает!!! ладно! попробуем так:
Код: Выделить всё
gamma.AddItem str(betta.TextMatrix(1, 1) * 100)

не работает... опять всё та же ошибка. ладно. а вот так:
Код: Выделить всё
gamma.AddItem str(val(betta.TextMatrix(1, 1)) * 100)

во! заработало! ну закрался один впрос: ПОЧЕМУ???

ещё одна ошибка была в строке:
Код: Выделить всё
tabl.TextMatrix(5, 3) = Val(tabl.TextMatrix(5, 3)) + Val(tabl.TextMatrix(i, 3))


Val(tabl.TextMatrix(i, 3)) возвращала 0. хм... ну КАК ТАК??? ПОЧЕМУ???
делаю:
Код: Выделить всё
dim t as double
t=tabl.TextMatrix(i, 3))
a=a+t
tabl.TextMatrix(5, 3) = a

Всё работает.. но вопрос: почему здесь (t=tabl.TextMatrix(i, 3))) неявное преобразование происходит, а здесь (gamma.AddItem betta.TextMatrix(1, 1) * 100 ) нет??? причём на ХР и 200 винде! на МЕ всё работает!

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 28.05.2004 (Пт) 15:24

Никогда не бери мастдай (9х/Ме) за эталон. Что и как там работает - сия тайна велика есть, причем не знает ее даже сам Б. Калиткин.
Насколько я помню, в TextMatrix() все данные строкового типа. Кастинг происходит в данном случае явно на операции присвоения. А вот во втором случае ты пытаешься умножить число на *пока еще* строку - вот и валишься. Заключи ты эту строку в CLng() или какой там у тебя тип должен быть - и надежнее, и предсказуемее, а уж читабельности как прибавит! Не пересказать...

Лёха_Virus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 24.03.2003 (Пн) 17:13
Откуда: Анграск

Сообщение Лёха_Virus » 28.05.2004 (Пт) 15:39

Спасибо! вот так грабли...
такая штука:
tabl.TextMatrix(i, 3) содержит дробное значение, которое рассчитывается как tabl.TextMatrix(i, 1) /tabl.TextMatrix(i, 2)
по идее же если брать val(tabl.TextMatrix(i, 3)) должно быть возвращено число типа дабл... по идее... а получается 0.
(заметьте, тока на не ме/98 ;))

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 28.05.2004 (Пт) 16:04

Хе. Недавно на форуме как раз обсуждались особенности работы функции Val() с национальными настройками, а именно с разделителем дробной части. Не работает она с ним, понимает только точку. Используй CDbl(), раз у тебя именно даблы.
А дома лучше поставь винтукей или на крайняк NT4, если комп не очень мощный. По крайней мере на отдельный раздел, чисто для программирования. Стабильности среде прибавит, можешь не сомневаться.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 28.05.2004 (Пт) 16:05

Ennor писал(а):Никогда не бери мастдай (9х/Ме) за эталон

Поддерживаю! У меня на Windows 98 SE все объекты Line и Shape на форме съезжают влево на 2-3 пиксела, но этого достаточно, чтобы все выглядело ужасно :evil:
Проверяю на ME - тот же результат. NT 4.0, 2000, XP - все отлично. В общем, забил я на это дело :!:
Вот так-то :x
Моду создают модоки, а распространяют модозвоны.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.05.2004 (Сб) 7:42

Короче...
На моей 98 SE ничего никуда не съезжает и всё нормально кастуется, хотя я всегда юзаю явное преобразование типов и explicit. Рульная винда.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 30.05.2004 (Вс) 14:51

Возможно, я и не прав, но у меня тоже все нормально позиционировалось под мастдаем, пока я на нем же и компилял. Как только пересел на (тогда еще) NT4 - все, под 9х ресайз поехал. Правда, я с той формой игрался с расширенными стилями окна через SetWindowLong() - может, и из-за этого. Но если не полагаться на расположение контролов в design time, а явно ресайз прописывать, то все нормально работает, это да.

Только вот среда часто валилась, пока на 9х сидел... :evil:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron