Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

record в array of byte [D7]


Страницы:   1 2

Sega625 ©   (2011-08-19 21:15:00) 

Господа, всю голову сломал. Нужно довольно сложную структуру (record), cодержащую динамические массивы переложить в массив байтов. Вот сильно упрощенный пример кода:

procedure TForm1.Button1Click(Sender: TObject);
type
 TRec = packed record
   A: byte;
   B: byte;
   C: array[0..3] of byte;
   D: array of byte;
   E: byte;
 end;
var
 Size, n: WORD;
 Rec: TRec;
 Arr: array of byte;
begin
 with Rec do
 begin
   A    := 10;
   B    := 11;
   C[0] := 20;
   C[1] := 21;
   C[2] := 22;
   C[3] := 23;
   SetLength(D, 6);
   D[0] := 30;
   D[1] := 31;
   D[2] := 32;
   D[3] := 33;
   D[4] := 34;
   D[5] := 35;
   E    := 40;
 end;

 Size := SizeOf(TRec)-4+Length(Rec.D);

 SetLength(Arr, Size);

 Move(Rec, Arr[0], Length(Arr));
//  Arr := @Rec;

 Memo1.Clear;
 for n := 0 to Size-1 do
   Memo1.Lines.Add(IntToStr(Arr[n]));

end;


Результат такой: 10 11 20 21 22 23 24 0 63 38 140 84 36

Я понимаю - так и должно быть: вместо самого динамического массива Rec.D записывается указатель на него. А вот как подобную структуру полностью отразить на массив байтов? Может какое хитрое приведение типов?

Заранее благодарю.


Sega625   (2011-08-20 00:11:00) [21]


> сделать отдельную функцию или у записи метод (D2005 и выше),
>  который(ая) будет аккуратно укладывать нужные поля записи
> в байтовый массив, согласно требованиям sysex
>
> ну что-то вроде
>
> type
> TRec = packed record
>   A: byte;
>   B: byte;
>   C: array[0..3] of byte;
>   D: array of byte;
>   E: byte;
> end;
>
> //Допускаю, что размер дин. массива 1 байт
>
> function RecToBytes (R: TRect): PByte;
> var
>  P: PByte;
> begin
>  Result := PByte(GetMem(SizeOf(R) - SizeOf(R.D) + Length(R.
> D) + SizeOf(Byte));
>  P := Result;
>  Move(R.A, P^, SizeOf(R.A));
>  Inc(P, SizeOf(R.A));
>  Move(R.B, P^, SizeOf(R.B));
>  Inc(P, SizeOf(R.B));
>  Move(R.C, P^, SizeOf(R.C));
>  Inc(P, SizeOf(R.C));
>  Move(Byte(Length(R.D), P^, SizeOf(Byte));
>  Inc(P, SizeOf(Byte));
>  Move(R.D[0], P^, Length(R.D));
>  Inc(P, Length(R.D));
>  Move(R.E, P^, SizeOf(R.E));
> end;
>
> Написано на скорую руку для иллюстрации идеи


Вот это я и имел ввиду, когда писал - вручную. Похоже красивого решения не существует :(.
Спасибо Вам Игорь - попробую так и сделать.


Игорь Шевченко   (2011-08-19 23:58:00) [22]


> Мне нужно по MIDI (как sysex) передать в мой синтезатор
> немеренную структуру


сделать отдельную функцию или у записи метод (D2005 и выше), который(ая) будет аккуратно укладывать нужные поля записи в байтовый массив, согласно требованиям sysex

ну что-то вроде

type
TRec = packed record
  A: byte;
  B: byte;
  C: array[0..3] of byte;
  D: array of byte;
  E: byte;
end;

//Допускаю, что размер дин. массива 1 байт

function RecToBytes (R: TRect): PByte;
var
 P: PByte;
begin
 Result := PByte(GetMem(SizeOf(R) - SizeOf(R.D) + Length(R.D) + SizeOf(Byte));
 P := Result;
 Move(R.A, P^, SizeOf(R.A));
 Inc(P, SizeOf(R.A));
 Move(R.B, P^, SizeOf(R.B));
 Inc(P, SizeOf(R.B));
 Move(R.C, P^, SizeOf(R.C));
 Inc(P, SizeOf(R.C));
 Move(Byte(Length(R.D), P^, SizeOf(Byte));
 Inc(P, SizeOf(Byte));
 Move(R.D[0], P^, Length(R.D));
 Inc(P, Length(R.D));
 Move(R.E, P^, SizeOf(R.E));
end;


Написано на скорую руку для иллюстрации идеи


Sega625   (2011-08-19 23:32:00) [23]


> Может тебе по русски задать вопрос.


Вот я и хочу чтобы вместо этих 4-х байт указателя было бы 6 байт нужного мне Rec.D.


Sega625   (2011-08-19 23:28:00) [24]


> Не понятно как ты пришел к этому 0 63 38 1
> В коде таких данных нет
> Может тебе по русски задать вопрос.


Я так понимаю это адрес-указатель на массив Rec.D (может быть любым), за тем идет Rec.E = 40, а потом 2 байта - мусор.


Palladin   (2011-08-19 23:18:00) [25]

вот мне гугль не помог скреситить IMultiStream (изобретение Micrisoft) к IStream (изобретение Microsoft), это да
а, знаешь, если ты не способен изучить результаты "dynamic array delphi", в том же гугле то может быть ну его нафик?


Anatoly Podgoretsky   (2011-08-19 23:18:00) [26]

Не понятно как ты пришел к этому 0 63 38 1
В коде таких данных нет
Может тебе по русски задать вопрос.


Sega625   (2011-08-19 23:11:00) [27]


> к сильно упрощенному примеру кода прилагаю сильноу прощенный
> путь к победе array + F1


Даже Гугль не помог, а Вы говорите F1... Тем более в D7SE :)


Sega625   (2011-08-19 23:04:00) [28]


> Глупый вопрос - а зачем такую структуру отражать на массив
> байтов ?


Мне нужно по MIDI (как sysex) передать в мой синтезатор немеренную структуру, содержащую информацию о песнях (кол-во нот, высота, уровни эффектов ... - для 16 треков). Ну Вы понимаете, что количество песен, нот в них и т.д. может быть различным. Драйвер MIDI хавает только array of char :(. Со статическими структурами - все отлично, а вот если она содержит динамические элементы - обломс... Вручную это почти не реально сделать и не красиво. С TMemoryStream тоже не получилось. Должно же быть какое-то решение.


> Коэффициент "отражения на массив байтов" должен быть равен
> единице.
> Но это только в сказке.


Фатализмом веет от вашего поста :( :)


Palladin   (2011-08-19 22:58:00) [29]

к сильно упрощенному примеру кода прилагаю сильноу прощенный путь к победе array + F1


Сергей М.   (2011-08-19 21:49:00) [30]


> полностью отразить


Коэффициент "отражения на массив байтов" должен быть равен единице.
Но это только в сказке.


Игорь Шевченко   (2011-08-19 21:46:00) [31]


> А вот как подобную структуру полностью отразить на массив
> байтов?


Глупый вопрос - а зачем такую структуру отражать на массив байтов ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо