Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: intermult.boom.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 14.03.05 11:22
Попробуй CBool.

Ответить

Номер ответа: 10
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #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
Dim f As Boolean = CBool(тра-ля-ля)

Тогда и проблем никаких не будет.


Это не совсем так.
Дело в том, что функции преобразования (в частности, CBool) - это не обычные функции, а, если это возможно в контексте, кастинг. Если переменные a и b объявлены как Boolean, то выражение a = CBool(b) абсолютно эквивалентно простому a = b, и никакого приведения к 0 и -1 не будет, потому что VB считает, что кастинг boolean к boolean не имеет смысла. Простейший пример:

Option Explicit

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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #15
Добавлено: 14.03.05 15:53
Не, вообще то 4 байта. Это в PB - Integer. CBool - это просто для синхронизации. Если можешь без него обойтись - обходись.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам