Последовательность unit'ов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

имею чтото типа этого:
commandline.pas=
unit commandline;
......
begin
commandmanager.init
end.
GDBCommandsElectrical.pas=
unit GDBCommandsElectrical;
interface
uses
commandline,
...................
begin
commandmanager.CommandRegister(@Wire);
end.
Второй день не могу понять почему commandmanager.CommandRegister(@Wire) срабатывает раньше commandmanager.init?
В delphi всё работает нормально
Alexander

Сообщение Alexander »

Не begin, а initialization.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Всегда думал что это одно и тоже. Но с initialization тоже работает не в том порядке.
Janus
постоялец
Сообщения: 134
Зарегистрирован: 07.11.2005 16:06:49

Сообщение Janus »

По идее, секции инициализации модулей выполняются в том порядке, в котором модули указаны в uses.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

program CAD;
{$IFDEF FPC}{$MODE DELPHI}{$APPTYPE GUI}{$ENDIF}
uses
commandline,
log,
sysinfo,
windows,
messages,
mygl;
..............
end;
В главном модуле commandline подключается первым, но его инициализация всеравно идет не первая
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Очень странно, но можно попробовать указать явно: -Fasystem,commandline, если я ничего не путаю - возможно, не -Fa, а другой ключик.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Эхх. снова топчусь по этим граблям.
Когда писал на delphi и lazarus по очереди - нужда заставила инициализацию uses модулей делать руками, т.к. в delphi и lazarus получались разные последовательности выполнения initialization. отказался от delphi, хочу сделать по человечески.

zcad.dpr - главный файл проекта:

Код: Выделить всё

uses
  ............
  varman,
  UUnitManager,
  ............


UUnitManager.pas:

Код: Выделить всё

interface
uses Varman,
  ............



Varman.pas - в interface uses много всего, UUnitManager естественно нет, т.к. всё компилится и перекрестных ссылок нет

инициализация UUnitManager вызывается до инициализации varman - как такое может быть?

ЗЫ. торжественно сам себе вручаю золотую лопату
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

А нельзя в начале модуля UUnitManager прописать инициализацию Varman?

UUnitManager.pas:

Код: Выделить всё

interface
uses Varman,
  ............
  ............
begin
вызов некой процедуры из Varman которая потянет за собой инициализацию всего модуля;
.............
end.

Не уверен что сработает, но...
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Нет, от наличия кода в секции инициализации ниче не меняется, с пустыми секциями всё также.
В проекте под сотню юнитов, лог процесса инициализации показывает очень хитрые порядки инициализации, ни с какими uses не совпадающие. видимо оно так и должно быть.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Стало интересно, если зависимости позволяют, на предыдущей версии компилятора всё тоже самое?
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

судя по дате моего первого сообщения так было еще в 2.0
проблему решил разделением обного модуля с большим списком implementation uses на несколько. на этот модуль были ссылки и из Varman и из UUnitManager.
Ответить