![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразовать структуру в массив байт и наоборот.
Kolan © (2008-03-19 16:45:00)Здравствуйте,
есть вт такая структура:
TDeviceEquivalentParams = record
Rc: Single;
Ct: Single;
C0: Single;
R0: Single;
Cd: Single;
K2: Single;
Ld: Single;
Qa: Single;
Fa: Single;
Fr: Single;
Rd: Single;
ReZ1a: Single;
end;
TComplexValue = record
Re: Single;
Im: Single;
end;
TDeviceParams = record
MagicNumber: Cardinal;
//системные параметры
Address: Byte;
KC: Byte;
Name: array[0Ե] of Char;
UUID: array[0㐃] of Byte;
NSamplesMax: Integer;
//параметры заводской калибровки
ReferenceLevelInductance: Single;//эталон. напряжение при калибр. К канала УС02
KuInputInductance: Single;//поправ. коэфф. для К канала УС02
KuInputImpedanceMul: TComplexValue;//частотозав. часть поправки к Ug при импед.
KuInputImpedanceAdd: TComplexValue;//частотонезав. часть поправ к Ug при импед.
FrecRezCapacitor0: Single;//f рез. пра ReferenceCapacitor0
ReferenceCapacitor0: Single;//емкость конд. при стадии №1 изм.парам. трансфор.
FrecRezCapacitor1: Single;//f рез. пра ReferenceCapacitor1
ReferenceCapacitor1: Single;//емкость конд. при стадии №2 изм.парам. трансфор.
Ctr: Single;//емкость обмоток трансформатора
Ltr: Single;//индуктивность намагничивания входной обмотки трансформатора
Rtr: Single;//сопративление обмоток трансформатора
//параметры инсталяционной калибровки
ReferenceLevelAcustic: Single;//эталонный уровень при аккустической калиб. (дБ)
PECS_0: TDeviceEquivalentParams;//параметры экв. схемы при инсталяции
Ka: Single;//коэф. чувств. аккустического канала при калибровке м ГШ
M0: Single;//расчетная чувствительность мВ/Па полученная при инсталяции
//параметры периобической калиброки
PECS_t: TDeviceEquivalentParams;//праметры экв. схемы текущие
Mt: Single;//ntreofz расчетная чувствительность мВ/Па полученная
Kp: Single;//коэффициент M0 / Mt
end;
PDeviceParams = ^TDeviceParams;
Она не упакованая и зменить это нельзя.
И есть еще такакя:
TFlashPage = record
PageNumber: Word;
PageData: array[0𠦗] of Byte;
end;
PFlashPage = ^TFlashPage;
Для перевода первой во вторую использую такую ф-цию:
function ConvertFlashPageToDeviceParams(AFlashPage: TFlashPage): TDeviceParams;
var
RecP: PDeviceParams;
begin
RecP := PDeviceParams(@AFlashPage.PageData[0]);
Result := RecP^;
end;
Она работает правильно.
А вот как теперь назад востановить из параметров массив. По аналогии сделал так:
function ConvertDeviceParamsToFlashPage(ADeviceParams: TDeviceParams): TFlashPage;
var
RecF: PFlashPage;
begin
RecF := PFlashPage(@ADeviceParams.MagicNumber);
Result := RecF^;
end;
Данные портяться. Как правильно написатьConvertDeviceParamsToFlashPage?
Johnmen (2008-03-19 17:46:00) [1]И, кстати, а зачем вообще функцию? Используй глобальные переменные.
Johnmen (2008-03-19 17:44:00) [2]
> Kolan © (19.03.08 17:18) [6]
> Гхм.
Что, не работает? :)
А как же указание var или const для параметра? Отдаешь на откуп компилятору?
Johnmen (2008-03-19 17:20:00) [3]Вопрос:
> А разница есть?
Ответ:> absolute я лучьше понимаю
:)
Kolan (2008-03-19 17:18:00) [4]Гхм.
function ConvertDeviceParamsToFlashPageEx(ADeviceParams: TDeviceParams): TFlashPage;
var
TempFlashPage : TFlashPage absolute ADeviceParams;
begin
Result := TempFlashPage;
end;
Kolan (2008-03-19 17:17:00) [5]> А так
function ConvertDeviceParamsToFlashPageEx(ADeviceParams: TDeviceParams): TFlashPage;
var
TempDeviceParams: TDeviceParams;
TempFlashPage : TFlashPage absolute ADeviceParams;
begin
TempDeviceParams := ADeviceParams;
Result := TempFlashPage;
end;
Так тоже работает. А разница есть? absolute я лучьше понимаю, чем манипуляции с указателями :)
Johnmen (2008-03-19 17:12:00) [6]
> Kolan ©
А так
var?
ADeviceParams: TDeviceParams;
AFlashPage : TFlashPage absolute ADeviceParams;
Kolan (2008-03-19 17:01:00) [7]Добавил PageNumber в TDeviceParams.
Функции сделал такие:
function ConvertDeviceParamsToFlashPage(ADeviceParams: TDeviceParams): TFlashPage;
var
RecF: PFlashPage;
begin
RecF := PFlashPage(@ADeviceParams);
Result := RecF^;
end;
function ConvertFlashPageToDeviceParams(AFlashPage: TFlashPage): TDeviceParams;
var
RecP: PDeviceParams;
begin
RecP := PDeviceParams(@AFlashPage);
Result := RecP^;
end;
Вроде все правильно
Kolan (2008-03-19 16:58:00) [8]А, наверно делов в том что в TFlashPage есть еще и PageNumber. И первые 4 айта попадают туда Как же заполнить только массив?
Плохиш (2008-03-19 16:58:00) [9]
Move Routine
Copies bytes from a source to a destination.
Unit
System
Syntax
[Delphi] procedure Move(var Source: Type; var Dest: Type; Count: Integer);
Description
Move copies Count bytes from Source to Dest. No range checking is performed. Move compensates for overlaps between the source and destination blocks.
Whenever possible, use the global SizeOf function (Delphi) or the sizeof operator (C++) to determine the count.