powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CopyMemory из динамического массива в record
13 сообщений из 13, страница 1 из 1
CopyMemory из динамического массива в record
    #39779884
xMailer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажите пож-та, как из динамического массива закинуть все в record.
В коде ниже на выходе в my бред. Если объявить статичный размер data: array[0..5] of byte, то все OK.
Получается - дело в динамическом выделение памяти под массив.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
type
  tmy = record
        rate: UInt16;
        t1: byte;
        t2: byte;
        t3: byte;
        t4: byte;
  end;

var
  data: array of byte;
  my  : tmy;
begin
  SetLength(data, 6);
  data[0]:=1; ... data[5]:=0;

  ZeroMemory(@my, SizeOf(my));
  CopyMemory(@my, @data, length(data));
end;
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779915
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xMailer,

Код: pascal
1.
@my[0]
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779917
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может @data[0] поможет?
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779918
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл ЭраxMailer,

Код: pascal
1.
@my[0]


Пардон, вот:
Код: pascal
1.
@data[0]
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779921
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё из-за того, что sizeof(tmy) = 8. Надо просто заменить record на packed record.
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779923
xMailer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!!! @data[0] - то, что нужно
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779929
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeroMemory(@my, SizeOf(my)); - лишнее.
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779950
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xMailerСпасибо!!! @data[0] - то, что нужно
Чудаки вы все. Попробуй вместо этого просто data (безо всяческих обкладок.))
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779961
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
закладываться на особенности реализации?

а протом проходит дцать лет и начинаются крики "во всех статях написано CopyMemory(@my, ... - но оно ниработает!!!!"

P.S. и ты не поверишь, я даже часто пишу @data[Low(data)]
После того как несколько раз мозг себе ломал выискивая случайные разрушения памяти после переноса старых программ на нолвый Паскаль/Дельфи
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779980
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

Какие особенности, какие крики? Я ж говорю, - чудаки.
Имя переменной типа массив в обсуждаемом языке всегда было (и будет, аминь) указателем на его первый элемент.
Но ты там у себя можешь писать, что хочешь, таки разрешаю, да))
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39779986
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и, как выше уже написали:
Код: pascal
1.
tmy = packed record


иначе потом возможны сюрпризы.
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39780005
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо будет поискать Delphi 1.0, в котором динамических массивов вообще не было

как и в турбо-паскале, куски кода которого переобозвали кусками кода Delphi
...
Рейтинг: 0 / 0
CopyMemory из динамического массива в record
    #39780015
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FИмя переменной типа массив в обсуждаемом языке всегда было (и будет, аминь) указателем на его первый элемент.

Delphi XE2type TSta = array[2..3] of byte;
TDyn = array of byte;

procedure Tst( aStatic: TSta; aDynamic: TDyn; aOpen: array of Byte);
var P: pointer;
begin
p := aStatic; // [DCC Error] Project38.dpr(16): E2010 Incompatible types: 'Pointer' and 'TSta'
p := aDynamic;
p := aOpen; // [DCC Error] Project38.dpr(18): E2010 Incompatible types: 'Pointer' and 'array of Byte'
end;


Только в одном из трёх случаев - когда "особенности реализации" такие - "Имя переменной типа массив" может быть присвоено указателю. В двух третях случаев - даже не скомпилируется.

И даже один случай из трёх - только потому, что динамический массив - так же как классы, длинные строки, интерфейсы - был реализован как указатель на record.

И это я ещё не смотрел что именно присваивается, вопрос был "пкусть не работает, лишь бы хотя как-то скомпилировалось".

А если ещё чуть усложнить...
type TSta = array[2..3] of array [4..5] of byte;
TDyn = array of array of byte;
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CopyMemory из динамического массива в record
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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