powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Dim a1() vs Dim a2
25 сообщений из 52, страница 2 из 3
Dim a1() vs Dim a2
    #39023366
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПочему CBool(a1) нельзя, а Not a1 можно?

Странные вещи ты пишешь для VB программиста.
CBool(a1) нельзя потому, что эта функция принимает в качестве параметра Expression
а вот CBool(Not a1) - можно, по описанной выше причине.
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023410
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltСтранные вещи ты пишешь для VB программиста.потому что всю жизнь решал прикладные задачи, в кишки лазил мало )

Eoltа вот CBool(Not a1) - можно, по описанной выше причине.Почему CBool(-1) можно - мне понятно ))
Почему неявное преобразование в Boolean тут If a1 Then не работает, а в выражении Not a1 работает - мне непонятно (точнее, даже не мне, как прикладнику, а больше автору топика)
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023420
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Shocker.Pro,
> Почему CBool(a1) нельзя, а Not a1 можно?

... и почему Not в данном случае не отрицание, а инверсия?
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023465
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Почему неявное преобразование в Boolean тут If a1 Then не работает

Потому, что код

Код: vbnet
1.
2.
Dim a1()
If  a1 Then



изначально бредовый. В условии IF должен быть тип, который VB сможет неявно преобразовать в Boolean.
А здесь указывается ссылка на массив, поэтому закономерно выдается ошибка компиляции.

автора в выражении Not a1 работает - мне непонятно

Код тоже бред. Но, оператор NOT в качестве Expression может получать выражение числового типа, или того типа который можно привести к числовому. Ссылка на массив может быть приведена к числовому типу. Хотя бы к нулю. Поэтому все работает.


P.S. Лучше не использовать неявное приведение типов. Оно слишком запутано и много подводных камней.
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023487
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSЧем по сути отличаются декларации:
Код: vbnet
1.
Dim a1()


и
Код: vbnet
1.
Dim a2


?

Dim a1() - ты сказал компилятору, что когда-то в будущем, создашь одномерный массив Variant с названием a1.
Память под массив не выделяется, ссылок на него нет, фактически массив не существует.

Dim a2 - ты выделил память под переменную типа Variant. После объявления переменная существует, ссылка на нее есть.
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023532
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

"Память под массив не выделяется, ссылок на него нет, фактически массив не существует"

-- а в коде
Код: vbnet
1.
2.
Dim a1()
If  Not a1 Then stop



тоже "ссылок на него нет" (до самого конца)? С чем тогда Not работает?
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023541
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSEolt,
-- а в коде
Код: vbnet
1.
2.
Dim a1()
If  Not a1 Then stop



тоже "ссылок на него нет" (до самого конца)? С чем тогда Not работает?

автор Но, оператор NOT в качестве Expression может получать выражение числового типа, или того типа который можно привести к числовому. Ссылка на массив может быть приведена к числовому типу. Хотя бы к нулю. Поэтому все работает.


Not получает ссылку на несуществующий массив, приводиn ее к числовому типу и возращает логический тип False, который затем использует оператор IF
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023564
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

правильно ли я понимаю, что "несуществующий" (массив в данном случае) - это такой специальный модус существования? И "ссылок на него нет", но "Not получает ссылку" ...

В конце концов, как говорится в том анекдоте - "'вилька' и 'тарелька' пишется без мягкого знака; понять это невозможно, нужно просто запомнить!"
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023565
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltNot получает ссылку на несуществующий массив, приводиn ее к числовому типупочему тогда другие функции не могут "привести эту ссылку к числовому типу"?
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023569
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... в сухом остатке, оказывается, иногда всё-таки можно оперировать неинициализированными объектами ...
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023577
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее, Not инвертирует нулевую ссылку (если уместно так сказать), в -1. В числовом представление CLng(True) тоже -1 (ну или наоборот, если угодно) Отсюда и Not a() == -1 (т.е. Long), а -1 в свою очередь == True ибо VarType(Not a()) = 3 (Long)
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023585
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSEolt,

правильно ли я понимаю, что "несуществующий" (массив в данном случае) - это такой специальный модус существования? И "ссылок на него нет",

это не модус существования, это неинициализированный указатель . Он может иметь нулевое или любое произвольное числовое значение. Указывает не на реальный объект, а на произвольный кусок памяти

авторно "Not получает ссылку" ...

правильнее сказать не получает ссылку, а "считает" переданный ему указательный тип Pointer, числовым типом - Int32.
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023605
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eoltправильнее сказать не получает ссылку, а "считает" переданный ему указательный тип Pointer, числовым типом - Int32.почему тогда попытка присвоения переменной типа Long подобного указателя приводит к ошибке времени выполнения? Ошибка в VB Runtime, который не генерирует исключение при попытке Not над неинициализированным объектом?
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023632
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hclubmkСкорее, Not инвертирует нулевую ссылку (если уместно так сказать), в -1.

Кстати да, ты прав.

Код: vbnet
1.
2.
3.
4.
5.
  Dim a1()
  Debug.Print Not a1
  
  ReDim a1(0)
  Debug.Print Not a1



получаем:
-1
-151905777
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023645
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proпочему тогда попытка присвоения переменной типа Long подобного указателя приводит к ошибке времени выполнения? А как происходит присваивание? так:
Код: vbnet
1.
a& = Not Nothing

или так:
Код: vbnet
1.
a& = Not ObjPtr(Nothing)

?
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023659
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БЕЗ Not
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023692
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proпочему тогда попытка присвоения переменной типа Long подобного указателя приводит к ошибке времени выполнения? Ошибка в VB Runtime, который не генерирует исключение при попытке Not над неинициализированным объектом?

Вроде нормально присваивается, без ошибок

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Option Explicit
Private Declare Function VarPtrArray Lib "msvbvm60" Alias "VarPtr" (Var() As Any) As Long
Private Sub Form_Load()
    Dim a1()
    Dim ArrayPtr As Long
    ArrayPtr = VarPtrArray(a1)
End Sub
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023788
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
Dim a1()
If Not a1 Then Stop
ReDim a1(100)
If Not a1 Then Stop



-- увы, оба стопа срабатывают. Так что в качестве признака (не-)инициализированности массива эта конструкция не годится!
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023791
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Код: vbnet
1.
2.
3.
4.
Dim a1()
If Not a1 Then Stop
ReDim a1(100)
If Not a1 Then Stop




-- увы, оба стопа срабатывают. Так что в качестве признака (не-)инициализированности массива эта конструкция не годится!правильно будет сравнивать с -1 по вышеизложенным причинам
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023795
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
100 рублей убытку :)
Код: vbnet
1.
2.
3.
4.
Dim a1()
If (Not a1) = -1 Then Stop
ReDim a1(100)
If (Not a1) = -1 Then Stop
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023801
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван 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.
Option Explicit

Private Function ArrayInit(vArr) As Boolean
   On Error Resume Next
        If Not IsArray(vArr) Then
            GoTo Handler
        ElseIf IsError(UBound(vArr)) Then
            GoTo Handler
        ElseIf (UBound(vArr) = -1) Then
            GoTo Handler
        End If
        ArrayInit = True
Handler:
    On Error GoTo 0
End Function

Private Sub Form_Load()
  Dim a1()
  If ArrayInit(a1) Then Stop
   
  ReDim a1(100)
  If ArrayInit(a1) Then Stop
End Sub
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023802
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пинание исключения не лучший вариант в цикле....
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023806
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProБЕЗ Not да по сути - без разницы. В 1-м случае - попытка присвоить переменной типа Long ссылку на несуществующий объект - (пустую ссылку) не работает; во втором - присвоить переменной адрес несуществующего объекта = 0;
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023821
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Not Not a - адрес SafeArray. В IDE такое прокатывает, но потом если использовать действия с арифметическим сопроцессором происходит ошибка Expression too complex. В скомпилированном варианте таких проблем не возникает. Так что это, так сказать, багофича.
Вот примеры
http://www.cyberforum.ru/post6044230.html
...
Рейтинг: 0 / 0
Dim a1() vs Dim a2
    #39023845
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

Код: vbnet
1.
ElseIf (UBound(vArr) = -1) Then


- то есть массивы

Код: vbnet
1.
dim a(-222 to -1) 


в природе не существуют?
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 2 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Dim a1() vs Dim a2
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]