Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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&#1333] of Char;

  UUID: array[0&#13315] 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&#133527] 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 айта попадают туда&#133 Как же заполнить только массив?


 
Плохиш ©   (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;


Вроде все правильно&#133


 
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.016 c
15-1204446768
Dima
2008-03-02 11:32
2008.04.13
Описание компонентов для работы с БД


2-1206078470
SKIPtr
2008-03-21 08:47
2008.04.13
нужно выполнить перерисовку компонента


2-1206006900
Aleksandr
2008-03-20 12:55
2008.04.13
ID folder


2-1206010028
San1
2008-03-20 13:47
2008.04.13
Множества set of


3-1195575987
ari_9
2007-11-20 19:26
2008.04.13
Длинные (несколько суток) читающие транзакции в FB. Как лучше ?