Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "array of byte" переместить в структуру, копирование динамического массива 
V
    Опции темы
AKATAN
Дата 11.10.2010, 09:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 30.9.2008
Где: Украина

Репутация: нет
Всего: 1



Здравствуйте!

Есть некая структура:
Код

type
  TDevGateProto = packed record
    PackageID        : LongInt;              
    PowerSupply  : Byte;                               
    GateID           : LongInt;      
    SensorStatus1    : Byte;         
    SensorStatus2    : Byte;                         
    CMDStatus        : Byte;              
    DataLength       : Word;             
    IDDataStructure  : Word;               
    DeviceData        : array of byte;    
    CRC16            : Word;              
end;


Есть массив содержащий данные, которые хочу скопировать в структуру.
Код

...
var
  i: integer;
  RawData: array of byte;
  ClientRecvDATA: TDevGateProto;
begin
 SetLength(RawData, 200);
 for i := 0 to 199 do  RawData[i] := 0; // Создание некого предварительного массива, содержащего исходные данные

 SetLength(ClientRecvDATA.DeviceData, 182); // Установка длинны дин. массива в структуре в 182 байта 
 move(RawData, ClientRecvDATA, 200); // Копирование данных в структуру
...


Соответственно возникает:
Access violation at address 004097A8 in module 'DpSRV.exe'. Write of address F7780040.

Когда делаю так:
Код

move(RawData, ClientRecvDATA.PackageID, 16);

То структура заполняется верно. Понятно, что из-за того что суммарная длинна данных до динамического массива 16 байт.

Прошу, очень прошу растолковать как же храниться моя структура в памяти, и почему мое копирование вылазит за ее пределы.
З.Ы. Брейкпоинты хорошего ничего не дали, а дебаггер не помог, ибо я потерялся в over9000 инструкций добавленных компилятором.
PM MAIL ICQ   Вверх
Alexeis
Дата 11.10.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



DeviceData        : array of byte;  это указатель
Лучшее что можно сделать

Код

type
  TDevGateProto = packed record
    PackageID        : LongInt;              
    PowerSupply  : Byte;                               
    GateID           : LongInt;      
    SensorStatus1    : Byte;         
    SensorStatus2    : Byte;                         
    CMDStatus        : Byte;              
    DataLength       : Word;             
    IDDataStructure  : Word;               
    CRC16            : Word;  
    DeviceData     : array [0..0] of byte;                
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AKATAN
Дата 11.10.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 30.9.2008
Где: Украина

Репутация: нет
Всего: 1



Alexeis, спасибо, но как в массив
Код

DeviceData     : array [0..0] of byte;   

можно поместить скажем 182 байта? SetLength тут уже не применить.
PM MAIL ICQ   Вверх
Alexeis
Дата 11.10.2010, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(AKATAN @  11.10.2010,  11:24 Найти цитируемый пост)
можно поместить скажем 182 байта? SetLength тут уже не применить. 

  Создаешь указатель на TDevGateProto и выделяешь памяти sizeof(TDevGateProto) + 182; (при помощи getmem разумеется).



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AKATAN
Дата 11.10.2010, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 30.9.2008
Где: Украина

Репутация: нет
Всего: 1



Цитата

Создаешь указатель на TDevGateProto и выделяешь памяти sizeof(TDevGateProto) + 182; (при помощи getmem разумеется).

упс! точно! smile 
Спасибо!

И все же, я чуть в замешательстве:
Код

type
  TDevGateProto = packed record
    PackageID        : LongInt;              
    PowerSupply  : Byte;                               
    GateID           : LongInt;      
    SensorStatus1    : Byte;         
    SensorStatus2    : Byte;                         
    CMDStatus        : Byte;              
    DataLength       : Word;             
    IDDataStructure  : Word;               
    DeviceData        : array of byte;   // Pointer 4 байта 
    CRC16            : Word;              
end;

Когда заполняю структуру ручками:
Код

        DevGateProto.PackageID := $0001;
        DevGateProto.PowerSupply := $03;
        DevGateProto.GateID := $0007;
        DevGateProto.SensorStatus1 := $01;
        DevGateProto.SensorStatus1 := $00;
        DevGateProto.CMDStatus := $00;              
        DevGateProto.DataLength := $07;           
        DevGateProto.IDDataStructure := $00;

        SetLength(DevGateProto.DeviceData, 7);
        DevGateProto.DeviceData[0] := $06;
        DevGateProto.DeviceData[1] := $01;
        DevGateProto.DeviceData[2] := $42;
        DevGateProto.DeviceData[3] := $00;
        DevGateProto.DeviceData[4] := $03;
        DevGateProto.DeviceData[5] := $21;
        DevGateProto.DeviceData[6] := $91;
        DevGateProto.CRC16 := $FFFF;

То при ее копировании:
Код

move(DevGateProto.PackageID, RawData[0], 27);

массив RawData заполняется вполне адекватно, что не ясно, в связи с тем, что DeviceData указатель.
З.Ы. А как можно глянуть на мою структуру в дампе памяти посредством Embarcadero Delphi 2010?  smile 
PM MAIL ICQ   Вверх
Alexeis
Дата 11.10.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(AKATAN @  11.10.2010,  11:55 Найти цитируемый пост)
массив RawData заполняется вполне адекватно, что не ясно, в связи с тем, что DeviceData указатель.

  Ничего удивительного, просто копируется указатель. Но вот если теперь одна из структур будет удалена, то массив пойдет лесом в обеих копиях.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AKATAN
Дата 11.10.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 30.9.2008
Где: Украина

Репутация: нет
Всего: 1



Alexeis, еще раз спасибо.
Структуру менять не могу, ибо почти в такой форме (там пару блоков динамических данных) она приходит с пару сотен устройств, вот и хотел сделать некое подобие абстракции, чтоб облегчить себе жизнь, а не использовать прямую адресацию, с указанием сдвига.

Буду артистично использовать getmem, может что нить структурное и выйдет.
PM MAIL ICQ   Вверх
Alexeis
Дата 11.10.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(AKATAN @  11.10.2010,  12:07 Найти цитируемый пост)
Структуру менять не могу, ибо почти в такой форме (там пару блоков динамических данных) она приходит с пару сотен устройств, вот и хотел сделать некое подобие абстракции, чтоб облегчить себе жизнь, а не использовать прямую адресацию, с указанием сдвига.

  Ну устройство не может создать массив в стиле делфи. Тогда следует описать так.
Код

type
  TDevGateProto = packed record
    PackageID        : LongInt;              
    PowerSupply  : Byte;                               
    GateID           : LongInt;      
    SensorStatus1    : Byte;         
    SensorStatus2    : Byte;                         
    CMDStatus        : Byte;              
    DataLength       : Word;             
    IDDataStructure  : Word;               
    DeviceData        : Pbyte;   // Pointer 4 байта 
    CRC16            : Word;              
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AKATAN
Дата 11.10.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 30.9.2008
Где: Украина

Репутация: нет
Всего: 1



Цитата

DeviceData   : Pbyte;

Устройство присылает один единый массив данных, который описывается протоколом, но длинна блоков данных может быть разная. 
Спасибо за идею с getmem, совсем я перестал думать. пора списывать.
В принципе, сделал более-менее добротную структуру.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0824 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.