powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Зашита ли в LSet защита от выхода за пределы типизированной переменной?
6 сообщений из 6, страница 1 из 1
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
    #40014083
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если типизированная -- пользовательского типа -- переменная t1 занимает меньше байт памяти, чем типизированная переменная t2, то при исполнении

Код: vbnet
1.
LSet t1 = t2


-- не произойдёт ли запись за её (t1) пределы?
...
Рейтинг: 0 / 0
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
    #40014170
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

В документации написано, что так делать нельзя, приведет к непредсказуемому поведение:

авторWarning Using LSet to copy a variable of one user-defined type into a variable of a different user-defined type is not recommended.
Copying data of one data type into space reserved for a different data type can cause unpredictable results.

When you copy a variable from one user-defined type to another,
the binary data from one variable is copied into the memory space of the other, without regard for the data types specified for the elements.
...
Рейтинг: 0 / 0
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
    #40014353
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

это понятно, но я спрашиваю про другое. Например, если t1 это 3 Integer "поля", а t2 это 4 Integer "поля", то при исполнении

LSet t1 = t2

-- будет ли четвёртое (Integer) "поле" t2 записано за пределы t1?
...
Рейтинг: 0 / 0
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
    #40014369
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз пишут про неопределенное поведение, то да будет записано за пределы t1
...
Рейтинг: 0 / 0
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
    #40014626
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не произойдет
...
Рейтинг: 0 / 0
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
    #40014653
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, ATM-TURBO 2 прав. Если провести эксперимент, то за пределами T1 оказывается мусор, а не 30.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Option Explicit
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
            (ByVal lpDest As Any, ByVal lpSource As Any, ByVal cbCopy As Long)
             
Type T1
   V1 As Byte
   V2 As Byte
End Type

Type T2
   V1 As Byte
   V2 As Byte
   V3 As Byte
End Type

Sub Main()

 Dim Var1 As T1
 Dim Var2 As T2
 
 Var2.V1 = 10
 Var2.V2 = 20
 Var2.V3 = 30
  
 LSet Var1 = Var2
  
 Dim V3inMem As Byte
 CopyMemory VarPtr(V3inMem), VarPtr(Var1) + 2, 1
 
 MsgBox "Значение за пределами T1=" & V3inMem
End Sub
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Зашита ли в LSet защита от выхода за пределы типизированной переменной?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (7): Анонимы (4), Bing Bot 3 мин., Yandex Bot 5 мин., Google Bot 7 мин.
x
x
Закрыть


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