Страница: 1 | 2 |
Вопрос: Rez = True, и при этом «If Rez = True» не выполн.!
Добавлено: 12.03.05 19:41
Автор вопроса: Comanche
См. сабж. Скриншот кода лежит вот здесь:
http://formtoini.narod.ru/Downloads/Nonsense.gif
Чушь какая-то... IF идёт по ветке ELSE, хотя условие IF'а - истинно!
Ответы
Всего ответов: 25
Номер ответа: 1
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #1
Добавлено: 12.03.05 19:53
Хм.. интересно, что скажут на это наши гуру надеюсь найдут глюк.
Номер ответа: 2
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #2
Добавлено: 12.03.05 19:58
Даже если не вникать в детали (тип переменной rez, выходной тип функции FtpCreateDirectory и т.д.), то на скриншоте можно увидеть следующее:
rez = True - согласно VB-шному тултипу, а ветка "If rez = True Then" - не выполнилась. Какие бы ошибки в коде, к примеру, ни присутствовали, всё равно переход по ветке ELSE не должен иметь места в данном случае!!!
PS: то, что rez = True, легко подтверждается дебаг-принтом, а также (косвенно) тем фактом, что FtpCreateDirectory успешно создаёт ftp-директорию st.
Номер ответа: 3
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #3
Добавлено: 12.03.05 20:15
А как мне протестить? а как другим? скрина мало... что мне его перенабрать? и что? Давай что-ли уже всё что там у тебя, чтоб все могли у себя этот прикол посмотреть.
Номер ответа: 4
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #4
Добавлено: 12.03.05 20:29
http://formtoini.narod.ru/Downloads/Nonsense.zip
1. Раззипуем, открываем в VB IDE, ставим breakpoint в методе ftpClass.CreateDirEx - на той же строчке, что и я поставил (см. скриншот).
2. Запускаем, видим форму.
3. Заполнив поля, подключаемся к своему ФТП-серверу; предполагается, что у вас он есть.
4. Заходим в какую-нить ФТП-папку, где есть права на создание директорий.
5. Жмём кнопку CreateDirEx, и в инпутбокс вводим строчку: "First/Second/Third". Жмём ОК.
6. При останове на брейкпойнте - проходим по шагам (F8).
7. На третьем шаге, в "протокольном" листбоксе мы должны увидеть "failed", а в окне Immediate - текст ошибки типа "не удалось найти файл".
PS: FTPS не поддерживается. А при доступе через прокси - м.б. проблемы.
PPS: как вы уже поняли, CreateDirEx должна создать в текущей ФТП-директории новую директорию, причём заданную "многоуровневым" путём. Т.е. аналогично АПИ-функции SHCreateDirectoryEx.
Номер ответа: 5
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #5
Добавлено: 12.03.05 21:09
М-да... заменил "If rez = True Then" на "If rez Then" - и всё встало на свои места. И КАК ЭТО ПОНИМАТЬ?!
Номер ответа: 6
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #6
Добавлено: 12.03.05 21:54
А не пробовал If (rez = True) Then?
Обычно условие должно быть заключено в скобки
Номер ответа: 7
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #7
Добавлено: 13.03.05 06:08
Ничего удивительного.
Просто ты сам отказался от механизма неявного преобразования, который тебе предоставляет VB, когда объявил FtpCreateDirectory как boolean. Ты этим сказал компилятору, что функция вернёт уже правильный результат, и его нужно просто скопировать в переменную. А между тем, сишный TRUE равен 1. Вот эта единица тебе в Rez и копируется. Естественно, она не равна VB-шному True. И, естественно, если убрать выражение равенства, всё заработает, потому что это снова включит неявное преобразование типов.
Но правильный выход - объявить FtpCreateDirectory как Long.
Номер ответа: 8
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #8
Добавлено: 13.03.05 13:07
Мдя... действительно забавно
Пусть не гуру, ну да за ве версию не бьют
True - это не только 1 но и -1... А вот True константа - она что-то одно...
PS
В Данном случае у нас сравнивался: BX 00000001 с -1
/*4137DB*/ CMP BX, 0FFFFh
/*4137DF*/ JNZ SimpleFT.004138E5
А в том варианте с If Res Then...
BX бы сравнивался уже с 0
CMP BX, 0h
JZ SimpleFT.004138E5
или
TEST BX, 0h
JZ SimpleFT.004138E5
или
OR BX, 0h
JZ SimpleFT.004138E5
) да и вообще какая разница )
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 14.03.05 11:22
Попробуй CBool.
Номер ответа: 10
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #10
Добавлено: 14.03.05 12:09
Дан Эплман утверждает (и видимо правильно), что все преобразования
типов надо делать явно.
Dim f As Boolean = CBool(тра-ля-ля)
Тогда и проблем никаких не будет.
Номер ответа: 11
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #11
Добавлено: 14.03.05 13:49
Может "Т" или "е" - РУССКИЕ и не стоит Option Explicit?
Номер ответа: 12
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #12
Добавлено: 14.03.05 15:00
Тогда и проблем никаких не будет.
Это не совсем так.
Дело в том, что функции преобразования (в частности, CBool) - это не обычные функции, а, если это возможно в контексте, кастинг. Если переменные a и b объявлены как Boolean, то выражение a = CBool(b) абсолютно эквивалентно простому a = b, и никакого приведения к 0 и -1 не будет, потому что VB считает, что кастинг boolean к boolean не имеет смысла. Простейший пример:
Private Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) As Boolean
Private Declare Function GetMem2 Lib "msvbvm60" (pSrc As Any, pDst As Any) As Long
Private Sub Form_Load()
Dim b As Boolean, i As Integer
Me.AutoRedraw = True
b = IsWindow(Me.hWnd)
Me.Print b
Me.Print b = True
Me.Print CBool(b) = True
b = CBool(b)
Me.Print b = True
GetMem2 b, i
Me.Print Hex$(i)
b = True
GetMem2 b, i
Me.Print Hex$(i)
End Sub
True будет напечатано только в первом случае, и только потому, что используется сравнение "ноль - не ноль". В остальных случаях будет False, потому что то, что хранится в b, не является True. Даже после явного присвоения b=CBool(b) ничего не меняется.
Так что CBool в данном случае бесполезен совершенно, а спасает либо изменение декларации на Long (и тогда заработает CBool тоже), либо сравнение с нулём.
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 14.03.05 15:11
Что за бред.
Номер ответа: 14
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #14
Добавлено: 14.03.05 15:15
Я тип Boolean вообще не использую. Если нужно, чтобы переменная содержала качественный показатель, использую Byte. Как я понимаю, Boolean - это тот же Integer, только он может принимать значения 0 и -1 (False и True соответственно). И занимает в ОЗУ он целых 2 байта.
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 14.03.05 15:53
Не, вообще то 4 байта. Это в PB - Integer. CBool - это просто для синхронизации. Если можешь без него обойтись - обходись.