Ошибка Delphi E2283 Слишком много локальных констант - PullRequest
5 голосов
/ 18 августа 2010

У меня проблема с компиляцией моего кода в Delphi 2006. Я использую статический массив String:

fsi_names : array [0..FSI_NUM_VARS-1] of string;

В процедуре, которую я вызываю в начале программы, я присваиваю значения этому массиву. Этот код автоматически создается сценарием, который я написал. Он состоит из строк, похожих на следующий:

fsi_names[idFSI_FLIGHT_PATH_ANGLE] := 'FSI_FLIGHT_PATH_ANGLE';

Всего в этом массиве должно быть назначено около 2000 элементов. Я не мог найти магическое число, где умирает компилятор, но он работает с 1853, а не с 2109.

Дело в том, что мне нужен этот массив для преобразования идентификатора (который является индексом для массива) в имя в виде строки для различных приложений.

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

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

У вас есть идея, как я мог бы либо преодолеть ограничения компилятора, либо изменить свой код для достижения моей цели?

Помощь очень ценится.

Ответы [ 3 ]

3 голосов
/ 18 августа 2010

На вашем месте я бы создал простой текстовый файл ASCII с идентификаторами, чтобы строка idFSI_FLIGHT_PATH_ANGLE + 1 файла содержала строку "FSI_FLIGHT_PATH_ANGLE".Тогда я бы добавил этот файл к ресурсам приложения.Таким образом, данные будут включены в EXE-файл, и вы можете легко прочитать данные во время выполнения:

function GetNthString(const N: integer): string;
var
  RS: TResourceStream;
begin
  RS := TResourceStream.Create(hInstance, 'NAMEOFRESOURCE', RT_RCDATA);
  with TStringList.Create do
    try
      LoadFromStream(RS);
      result := Strings[N];
    finally
      Free;
    end;
  RS.Free;
end;
1 голос
/ 19 августа 2010

Я НАШЕЛ РЕШЕНИЕ!

Если я инициализирую свой массив в точке, где я его определяю, то компилятор не выдаст сообщение об ошибке:

const
  fsi_names : array [0..FSI_NUM_VARS-1] of string = (
    'NAME 0',
    'NAME 1',
    ...
    'LAST NAME'
    );

Насколько я могу судить, количество строковых литералов не ограничено, если я так делаю.

Большое спасибо за ваши идеи, один из них от mj2008 был самым полезным!

Хорошего дня

Flo

0 голосов
/ 18 августа 2010

Альтернативой является использование динамического массива

from
fsi_names : array [0..FSI_NUM_VARS-1] of string;

to
fsi_names: array of string;
SetLength(fsi_names, FSI_NUM_VARS);

Cheers

...