Главная страница
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.021 c
15-1204034089
sds
2008-02-26 16:54
2008.04.13
Есть программа которая работает с БД.


15-1204171796
MBo
2008-02-28 07:09
2008.04.13
Delphi Survey на русском


2-1205830626
031178
2008-03-18 11:57
2008.04.13
Запрос !!!


2-1205522486
DJ_UZer
2008-03-14 22:21
2008.04.13
Подсветка в richedite


15-1201783465
DevilDevil
2008-01-31 15:44
2008.04.13
Помогите компонентом-табличкой...