![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
record в array of byte [D7]
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]
> А вот как подобную структуру полностью отразить на массив
> байтов?
Глупый вопрос - а зачем такую структуру отражать на массив байтов ?