Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разделение и управление записями в массивах: сравнение Fortran 90 и Delphi

Delphi , Синтаксис , Записи и Множества

Разделение и Управление Записями в Массивах: Сравнение Fortran 90 и Delphi

Введение

В процессе перевода кода из Fortran 90 в Delphi возникла интересная задача, связанная с обработкой массивов записей. Язык Fortran предоставляет удобный способ разделения полей структур на отдельные массивы для дальнейшей работы с ними. В данной статье мы рассмотрим, как решается подобная задача в Delphi.

Проблема

Исходный код на Fortran 90 содержит определение типа WallInfo и динамический массив записей этого типа:

TYPE WallInfo
  CHARACTER(len=40) :: Name
  REAL              :: Azimuth
  REAL              :: Tilt
  REAL              :: Area
  REAL              :: Height
END TYPE WallInfo

TYPE(WallInfo), ALLOCATABLE, DIMENSION(:) :: Wall

В коде Fortran возможна передача отдельных полей из массива записей в функции:

CALL HeatFlow(Wall%Area, Wall%Azimuth)

Delphi-программист сталкивается с проблемой, так как Delphi не поддерживает подобный синтаксис для работы с массивами записей напрямую. Необходимо разработать функцию или метод для извлечения отдельных полей в виде массивов.

Решение

В Delphi есть возможность использования расширенного RTTI (Runtime Type Information), который позволяет работать с типами и их полями на уровне метаданных. Это дает возможность написать обобщенную функцию, которая будет принимать массив записей и имя поля, а затем создавать новый массив только из значений этого поля.

Пример такой функции:

uses
  System.SysUtils,
  System.Rtti;

type
  TFieldArray<TArrElemType, TFieldType> = class
  public
    class function Extract(const Arr: TArray<TArrElemType>; const FieldName: String): TArray<TFieldType>;
  end;

class function TFieldArray<TArrElemType, TFieldType>.Extract(const Arr: TArray<TArrElemType>; const FieldName: String): TArray<TFieldType>;
var
  Ctx: TRttiContext;
  LArrElemType: TRttiType;
  LField: TRttiField;
  LFieldType: TRttiType;
  I: Integer;
begin
  Ctx := TRttiContext.Create;
  try
    LArrElemType := Ctx.GetType(TypeInfo(TArrElemType));
    LField := LArrElemType.GetField(FieldName);
    LFieldType := Ctx.GetType(TypeInfo(TFieldType));
    if LField.FieldType <> LFieldType then
      raise Exception.Create('Типы не совпадают');
    SetLength(Result, Length(Arr));
    for I := 0 to High(Arr) do
      Result[I] := LField.GetValue(@Arr[I]).AsType<TFieldType>;
  finally
    Ctx.Free;
  end;
end;

type
  WallInfo = record
    Name: array[0..39] of Char;
    Azimuth: Real;
    Tilt: Real;
    Area: Real;
    Height: Real;
  end;

procedure HeatFlow(const Area, const Azimuth: TArray<Real>);
begin
  // Образец использования функций Area и Azimuth в процедуре.
end;

var
  Wall: TArray<WallInfo>;
begin
  SetLength(Wall, 2);

  // Инициализация данных...
  HeatFlow(
    TFieldArray<WallInfo, Real>.Extract(Wall, 'Area'),
    TFieldArray<WallInfo, Real>.Extract(Wall, 'Azimuth')
  );
end;

Заключение

В статье рассмотрено использование расширенного RTTI для работы с массивами записей в Delphi. Это решение позволяет избежать написания множества специализированных функций для каждого поля и упрощает процесс обработки данных.

При переводе кода из Fortran 90 в Delphi важно учитывать различия в подходах к работе с массивами и структурами, что может потребовать дополнительной адаптации алгоритмов.

Создано по материалам из источника по ссылке.

Статья описывает процесс обработки массивов записей в языках Fortran 90 и Delphi, с акцентом на разные подходы к управлению записями в этих языках и предлагает решение для Delphi с использованием расширенного RTTI.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Записи и Множества ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:59:48/0.0034101009368896/0