Текущий архив: 2008.04.13;
Скачать: CL | DM;
Вниз
Преобразовать структуру в массив байт и наоборот. Найти похожие ветки
← →
Kolan © (2008-03-19 16:45) [0]Здравствуйте,
есть вт такая структура:
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
?
← →
Kolan © (2008-03-19 16:58) [1]А, наверно делов в том что в TFlashPage есть еще и PageNumber. И первые 4 айта попадают туда… Как же заполнить только массив?
← →
Плохиш © (2008-03-19 16:58) [2]
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.
← →
Kolan © (2008-03-19 17:01) [3]Добавил 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;
Вроде все правильно…
← →
Johnmen © (2008-03-19 17:12) [4]
> Kolan ©
А такvar
?
ADeviceParams: TDeviceParams;
AFlashPage : TFlashPage absolute ADeviceParams;
← →
Kolan © (2008-03-19 17:17) [5]> А так
function ConvertDeviceParamsToFlashPageEx(ADeviceParams: TDeviceParams): TFlashPage;
var
TempDeviceParams: TDeviceParams;
TempFlashPage : TFlashPage absolute ADeviceParams;
begin
TempDeviceParams := ADeviceParams;
Result := TempFlashPage;
end;
Так тоже работает. А разница есть? absolute я лучьше понимаю, чем манипуляции с указателями :)
← →
Kolan © (2008-03-19 17:18) [6]Гхм.
function ConvertDeviceParamsToFlashPageEx(ADeviceParams: TDeviceParams): TFlashPage;
var
TempFlashPage : TFlashPage absolute ADeviceParams;
begin
Result := TempFlashPage;
end;
← →
Johnmen © (2008-03-19 17:20) [7]Вопрос:
> А разница есть?
Ответ:> absolute я лучьше понимаю
:)
← →
Johnmen © (2008-03-19 17:44) [8]
> Kolan © (19.03.08 17:18) [6]
> Гхм.
Что, не работает? :)
А как же указание var или const для параметра? Отдаешь на откуп компилятору?
← →
Johnmen © (2008-03-19 17:46) [9]И, кстати, а зачем вообще функцию? Используй глобальные переменные.
Страницы: 1 вся ветка
Текущий архив: 2008.04.13;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.021 c