Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Вниз

Секция Initialization   Найти похожие ветки 

 
sasami737   (2003-08-21 18:04) [0]

Есть такой вопрос:

"Кто может подсказать, от чего зависит порядок обработки секции
Initialization в модулях программы? В.В.Фаронов в своей книге "Delphi 5"
пишет, что согласно порядку их описания в файле проекта. А вот у меня они
вызываются непонятно как - никакой зависимости от файла проекта я не
наблюдаю. Порядок в файле проекта мною менялся вручную, а как было в
начале - я не помню (т.к. ок. 20 модулей, а вопросом заинтересовался только
что)... Может в этом дело? А порядок обработки finalization обратный
данному?"

Был такой ответ:

"Порядок инициализации завистит еще от использования одними модулями других.
Если идет порядок Uses a,b,c; причем в модуле b используется c, то приоритет
с становится выше (c должен быть уже проинициализирован при инициализации
b), и порядок становится a,c,b."

Это понятно. А если в этом модуле ссылка на тот, а том ссылка на этот. Как тогда?


 
sasami737   (2003-08-23 13:15) [1]

Никто, никто не знает?


 
nikkie   (2003-08-23 13:19) [2]

>А если в этом модуле ссылка на тот, а том ссылка на этот.
циклические ссылки в interface компилятор не пропускает.


 
nikkie   (2003-08-23 13:20) [3]

>А если в этом модуле ссылка на тот, а том ссылка на этот.
циклические ссылки в interface компилятор не пропускает.


 
Anatoly Podgoretsky   (2003-08-23 14:04) [4]

А причем тут циклические ссылки, когда он говорит о таком
dpr
uses b,a; // a,b

unit a
uses c,d;

unit b
uses d,c;


 
nikkie   (2003-08-23 14:23) [5]

>А причем тут циклические ссылки, когда он говорит о таком
я не телепат, что имелось в виду я не знаю. имхо, фраза
>А если в этом модуле ссылка на тот, а том ссылка на этот.
описывает ситуацию с циклическими ссылками.


 
sasami737   (2003-08-23 14:52) [6]

Сори, не ясно выразился. Допустим

unit a
uses b;

unit b
uses c;

unit c
uses a;


 
nikkie   (2003-08-23 14:56) [7]

никакой разницы. если все эти uses в interface, то получишь ошибку "Circular unit reference".


 
Anatoly Podgoretsky   (2003-08-23 14:58) [8]

А вот это уже циркулярная ссылка


 
sasami737   (2003-08-23 15:01) [9]

Так, еще раз сори. Типа того:

unit a
interface
uses b;

unit b
interface
uses c;

unit c
implementation
uses a;


 
nikkie   (2003-08-23 15:13) [10]

в общем ты понял, что есть разница между interface и implementation...

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

ЗЫ вот и не говорите после этого, что паскаль проще, чем си...


 
sasami737   (2003-08-23 15:39) [11]

>в общем ты понял, что есть разница между interface и implementation...

да вообще-то я давно об этом подозревал :)

Эксперимент, конечно, хорошо. Но что-то не приходит в голову - как его провести.

Да и должны же быть люди на этом сайте, которые знают порядок вещей. Мастера все таки :)


 
Anatoly Podgoretsky   (2003-08-23 16:03) [12]

Так все в порядке, больше нет цркулярных взаимозависимостей.
Общее правило помещать uses в implementation если нет нужды в нем в разделе interface
Если проанализировать следующее то будет видно, что

unit a
uses b;
Требуется откомпилировать b, откладываем компиляцию a и переходим к компиляции b

unit b
uses c;
Требуется откомпилировать c, откладываем компиляцию b и переходим к компиляции c

unit c
uses a;
Требуется откомпилировать a, откладываем компиляцию c и переходим к компиляции a
Упсб мы зациклились!


 
sasami737   (2003-08-23 16:10) [13]

Anatoly Podgoretsky, блин, да вопрос в том, что если так:

unit c
implementation
uses a;

То в каком порядке будут инициализированы модули?


 
nikkie   (2003-08-23 16:13) [14]

>Но что-то не приходит в голову - как его провести.
program Project1;
{$APPTYPE CONSOLE}
uses
Unit1;
begin
end.

unit Unit1;
interface
implementation
uses Unit3;
initialization
Writeln("Unit1");
end.

и т.д.

>Anatoly Podgoretsky
Если бы все было так просто... Если uses b находится в implementation юнита a, то будет ли отложена компиляция a до тех пор, пока не откомпилируется b?


 
Anatoly Podgoretsky   (2003-08-23 16:28) [15]

sasami737 (23.08.03 16:10) [13]
Меня никогда не интерсовала инициализация, от нее я вижу больше вреда, чем пользы, особенно если она сделана в компонентах, пользоваться ею надо в исключительных случаях и уж никак не делать ее завязаной.

nikkie © (23.08.03 16:13) [14]
uses b находится в implementation, то отложена не будет, поскольку она не приводит к зависимости, то есть после компиляции интерфейсной части и при вынужденных переходах на компиляцию других модулей, компиляции продолжится в А, как только бужут откомпилированы связанные модули.

В данном случае модуль зависит только от А и не зависит от С, Это нужно для того что бы в секции interface иметь все необходимые типы и функции из другого модуля, иначе эту секцию построить нельзя.


 
nikkie   (2003-08-23 17:03) [16]

от нее я вижу больше вреда, чем пользы, особенно если она сделана в компонентах, пользоваться ею надо в исключительных случаях и уж никак не делать ее завязаной.

золотые слова!

uses b находится в implementation, то отложена не будет

имхо, это неверно. пример:

unit Unit1;
interface
implementation
uses Unit2;
dfdsfsdf

initialization
Writeln("Unit1");
end.

unit Unit2;
interface
implementation
dsfsdfsd
initialization
Writeln("Unit2");
end.

компилятор D6 выдает ошибку:
[Fatal Error] Unit1.pas(4): Could not compile used unit "Unit2.pas"
то есть Unit2 компилялся до Unit1.

Надо еще сказать, что порядок компиляции и порядок вызова initialization - вещи разные. Хотя и не исключено, что они совпадут.


 
Anatoly Podgoretsky   (2003-08-23 17:18) [17]

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

initialization не связана с компиляцией, это действует во время исполнения программы.


 
sasami737   (2003-08-23 17:22) [18]

nikkie, очень интересный вопрос... тоже хотелось бы знать ответ



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.013 c
7-33821
Pauk
2003-06-26 19:11
2003.09.11
Принтеры


1-33555
Lamerr
2003-08-29 09:26
2003.09.11
Изменение Options StringGrid-а в ран-тайм


3-33470
SPIRIT
2003-08-20 16:15
2003.09.11
Ваще касяк !!!


3-33518
Lazy Cat
2003-08-19 02:47
2003.09.11
SQL запрос


1-33600
evgeny_krasilov
2003-09-01 11:30
2003.09.11
TOleContainer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский