|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Shocker.ProПочему CBool(a1) нельзя, а Not a1 можно? Странные вещи ты пишешь для VB программиста. CBool(a1) нельзя потому, что эта функция принимает в качестве параметра Expression а вот CBool(Not a1) - можно, по описанной выше причине. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 12:28 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
EoltСтранные вещи ты пишешь для VB программиста.потому что всю жизнь решал прикладные задачи, в кишки лазил мало ) Eoltа вот CBool(Not a1) - можно, по описанной выше причине.Почему CBool(-1) можно - мне понятно )) Почему неявное преобразование в Boolean тут If a1 Then не работает, а в выражении Not a1 работает - мне непонятно (точнее, даже не мне, как прикладнику, а больше автору топика) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 12:50 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
> Shocker.Pro, > Почему CBool(a1) нельзя, а Not a1 можно? ... и почему Not в данном случае не отрицание, а инверсия? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 12:53 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
автор Почему неявное преобразование в Boolean тут If a1 Then не работает Потому, что код Код: vbnet 1. 2.
изначально бредовый. В условии IF должен быть тип, который VB сможет неявно преобразовать в Boolean. А здесь указывается ссылка на массив, поэтому закономерно выдается ошибка компиляции. автора в выражении Not a1 работает - мне непонятно Код тоже бред. Но, оператор NOT в качестве Expression может получать выражение числового типа, или того типа который можно привести к числовому. Ссылка на массив может быть приведена к числовому типу. Хотя бы к нулю. Поэтому все работает. P.S. Лучше не использовать неявное приведение типов. Оно слишком запутано и много подводных камней. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 13:16 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Иван FXSЧем по сути отличаются декларации: Код: vbnet 1.
и Код: vbnet 1.
? Dim a1() - ты сказал компилятору, что когда-то в будущем, создашь одномерный массив Variant с названием a1. Память под массив не выделяется, ссылок на него нет, фактически массив не существует. Dim a2 - ты выделил память под переменную типа Variant. После объявления переменная существует, ссылка на нее есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 13:35 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Eolt, "Память под массив не выделяется, ссылок на него нет, фактически массив не существует" -- а в коде Код: vbnet 1. 2.
тоже "ссылок на него нет" (до самого конца)? С чем тогда Not работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 14:22 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Иван FXSEolt, -- а в коде Код: vbnet 1. 2.
тоже "ссылок на него нет" (до самого конца)? С чем тогда Not работает? автор Но, оператор NOT в качестве Expression может получать выражение числового типа, или того типа который можно привести к числовому. Ссылка на массив может быть приведена к числовому типу. Хотя бы к нулю. Поэтому все работает. Not получает ссылку на несуществующий массив, приводиn ее к числовому типу и возращает логический тип False, который затем использует оператор IF ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 14:27 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Eolt, правильно ли я понимаю, что "несуществующий" (массив в данном случае) - это такой специальный модус существования? И "ссылок на него нет", но "Not получает ссылку" ... В конце концов, как говорится в том анекдоте - "'вилька' и 'тарелька' пишется без мягкого знака; понять это невозможно, нужно просто запомнить!" ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 14:49 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
EoltNot получает ссылку на несуществующий массив, приводиn ее к числовому типупочему тогда другие функции не могут "привести эту ссылку к числовому типу"? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 14:49 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
... в сухом остатке, оказывается, иногда всё-таки можно оперировать неинициализированными объектами ... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 14:52 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Скорее, Not инвертирует нулевую ссылку (если уместно так сказать), в -1. В числовом представление CLng(True) тоже -1 (ну или наоборот, если угодно) Отсюда и Not a() == -1 (т.е. Long), а -1 в свою очередь == True ибо VarType(Not a()) = 3 (Long) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 15:00 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Иван FXSEolt, правильно ли я понимаю, что "несуществующий" (массив в данном случае) - это такой специальный модус существования? И "ссылок на него нет", это не модус существования, это неинициализированный указатель . Он может иметь нулевое или любое произвольное числовое значение. Указывает не на реальный объект, а на произвольный кусок памяти авторно "Not получает ссылку" ... правильнее сказать не получает ссылку, а "считает" переданный ему указательный тип Pointer, числовым типом - Int32. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 15:09 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Eoltправильнее сказать не получает ссылку, а "считает" переданный ему указательный тип Pointer, числовым типом - Int32.почему тогда попытка присвоения переменной типа Long подобного указателя приводит к ошибке времени выполнения? Ошибка в VB Runtime, который не генерирует исключение при попытке Not над неинициализированным объектом? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 15:23 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
hclubmkСкорее, Not инвертирует нулевую ссылку (если уместно так сказать), в -1. Кстати да, ты прав. Код: vbnet 1. 2. 3. 4. 5.
получаем: -1 -151905777 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 15:45 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Shocker.Proпочему тогда попытка присвоения переменной типа Long подобного указателя приводит к ошибке времени выполнения? А как происходит присваивание? так: Код: vbnet 1.
или так: Код: vbnet 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 15:54 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Shocker.Proпочему тогда попытка присвоения переменной типа Long подобного указателя приводит к ошибке времени выполнения? Ошибка в VB Runtime, который не генерирует исключение при попытке Not над неинициализированным объектом? Вроде нормально присваивается, без ошибок Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 16:22 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2. 3. 4.
-- увы, оба стопа срабатывают. Так что в качестве признака (не-)инициализированности массива эта конструкция не годится! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 17:37 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Иван FXS Код: vbnet 1. 2. 3. 4.
-- увы, оба стопа срабатывают. Так что в качестве признака (не-)инициализированности массива эта конструкция не годится!правильно будет сравнивать с -1 по вышеизложенным причинам ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 17:41 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
100 рублей убытку :) Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 17:46 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Иван FXSТак что в качестве признака (не-)инициализированности массива эта конструкция не годится! для проверки инициализированности массива лучше использовать вот такой код: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 18:00 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
пинание исключения не лучший вариант в цикле.... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 18:01 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Shocker.ProБЕЗ Not да по сути - без разницы. В 1-м случае - попытка присвоить переменной типа Long ссылку на несуществующий объект - (пустую ссылку) не работает; во втором - присвоить переменной адрес несуществующего объекта = 0; ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 18:07 |
|
Dim a1() vs Dim a2
|
|||
---|---|---|---|
#18+
Not Not a - адрес SafeArray. В IDE такое прокатывает, но потом если использовать действия с арифметическим сопроцессором происходит ошибка Expression too complex. В скомпилированном варианте таких проблем не возникает. Так что это, так сказать, багофича. Вот примеры http://www.cyberforum.ru/post6044230.html ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 18:28 |
|
|
start [/forum/topic.php?fid=60&msg=39023806&tid=2155838]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 143ms |
0 / 0 |