Могут ли конструкторы записи сделать константы записи более краткими? - PullRequest
3 голосов
/ 29 ноября 2011

У меня есть некоторые табличные данные:

Foo       Bar
-------------
fooes     42
bars      666 
...

Итак, я объявляю структуру сущности:

type TFoo = record
  Foo: string;
  Bar: Integer
end;

и таблица сущностей:

const FOOES = array [M..N] of TFoo = (
  // Have to specify the field names for each record...
  (Foo: 'fooes'; Bar:  42),
  (Foo: 'bars';  Bar: 666)
  { so on }
);

Как видите, это выглядит довольно многословно и избыточно, и это потому, что я инициализирую все поля для всех записей. И есть много редактирования, если я копирую табличные данные, подготовленные в другом месте. Я бы предпочел не перечислять все поля и придерживаться более лаконичного стиля C, то есть только констант. И вот приходит конструктор записей ...

Могут ли конструкторы записи помочь мне в этом случае?

Вот пример на C. Вы заметите, что нам не нужно указывать имена полей в каждом объявлении:

#include <stdio.h>

typedef struct {
        char    foo[10];
        int     bar;
} foo;

int main(void) {
        /* Look here */
        foo FOOES[2] = {{"foo", 42}, {"bar", 666}};
        int i = 0;
        for (; i < 2; i++) {
                printf("%s\t%d\n", FOOES[i].foo, FOOES[i].bar);
        }
        return 0;
}

Ответы [ 3 ]

3 голосов
/ 29 ноября 2011

A const - это только для чтения var, который загружается / отображается в коде при запуске исполняемого файла.

Вы можете создать запись var (или * 1006).* но переопределяя записываемый параметр const ), затем инициализируйте его в секции инициализации устройства.

var FOOES = array [M..N] of TFoo;

....

initialization
  SetFooArray(FOOES,['fooes',42,'bar',230]);
  ...
end.

Пользовательская функция SetFooArray() поместит все параметры array of const в FOOES..

Я иногда использую эту технику для инициализации вычислимых массивов (например, таблиц преобразования или поиска).Иногда имеет смысл вычислить один раз при запуске огромный массив, сохранив несколько килобайт const в исходном коде с несколькими строками кода.

Но я не уверен, что это того стоиттвой случай.Декларация const по умолчанию немного многословна, но это не проблема, если вы используете Ctrl + C / Ctrl + V или находите и заменяете.Он является наиболее стандартным, безопасным при последующем изменении макета записи (тогда как конструкция C может компилироваться без ошибок) и создаст истинную константу.

2 голосов
/ 29 ноября 2011

Конструкторы записей только во время выполнения, и поэтому для констант ваше текущее решение является единственным вариантом.

0 голосов
/ 29 ноября 2011

Если вы хотите, чтобы это было сделано в источнике, то, что вы уже набрали, это ваш ответ. Конечно, вы можете поместить данные в отдельные массивы и инициализировать их таким образом, но это может сделать ваш код грязным.

Вы также можете сохранить их в текстовом файле (формат Foo = Bar) и прочитать их в TStringList во время выполнения (SL.LoadFromFile()). Но даже при сортировке TStringList это будет гораздо менее эффективно (например, MyVariable := SL.Values['Foo1'];).

Существует миллион способов решения этой проблемы вне исходного кода. Взяв его в другом направлении, поместите данные в Excel и создайте макрос Excel, чтобы построить источник, и поместите его в буфер обмена, чтобы вставить в файл PAS. Это не будет слишком сложно и, вероятно, проще, чем форматирование кода Delphi в среде IDE.

...