Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Зашита ли в LSet защита от выхода за пределы типизированной переменной? / 6 сообщений из 6, страница 1 из 1
02.11.2020, 01:28
    #40014083
Иван FXS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
Если типизированная -- пользовательского типа -- переменная t1 занимает меньше байт памяти, чем типизированная переменная t2, то при исполнении

Код: vbnet
1.
LSet t1 = t2


-- не произойдёт ли запись за её (t1) пределы?
...
Рейтинг: 0 / 0
02.11.2020, 11:46
    #40014170
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
Иван 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
02.11.2020, 15:02
    #40014353
Иван FXS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
Eolt,

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

LSet t1 = t2

-- будет ли четвёртое (Integer) "поле" t2 записано за пределы t1?
...
Рейтинг: 0 / 0
02.11.2020, 15:25
    #40014369
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
Раз пишут про неопределенное поведение, то да будет записано за пределы t1
...
Рейтинг: 0 / 0
02.11.2020, 22:59
    #40014626
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
Не произойдет
...
Рейтинг: 0 / 0
03.11.2020, 00:01
    #40014653
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зашита ли в LSet защита от выхода за пределы типизированной переменной?
Ну да, 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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Зашита ли в LSet защита от выхода за пределы типизированной переменной? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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