Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Pascal строки https://www.cyberforum.ru/ pascal/ thread698899.html
Ввести строку S1 с помощью оператора readln. Определить количество гласных в ней. В строку S2 вводить информацию посимвольно с помощью readkey, конец ввода - знак препинания. Ввести строку S3....
Найти сумму,и кол-во элементов массива>1,найти кол-во элементов массива,равных == 3 и 5 Pascal
Найти сумму,и кол-во элементов массива >1 (используя for) Найти кол-во элементов массива,равных == 3 и 5(используя for)
Проблемы с оператором if и else Pascal
Program N; uses crt; var x1, {Первый корень} x2, {Второй корень} D, {Дискриминант} a, {Значение a} b, {Значение b} c {Значение c} : real;
Pascal Написать программу для подсчета произведения последовательных натуральных чисел в диапазоне от 5 до 10 1.Написать программу для подсчета произведения последовательных натуральных чисел в диапазоне от 5 до 10. 2.Написать программу для вывода на экран таблицы умножения на 9. https://www.cyberforum.ru/ pascal/ thread698819.html
Pascal Дан символьный файл f. Определить, являются ли два последних символа файла цифрами https://www.cyberforum.ru/ pascal/ thread698744.html
Дан символьный файл f. Определить, являются ли два последних символа файла цифрами. Если да, то установить, является ли число, образованое этими цифрами четным или же нечетным.
Нужно вывести в случайном порядке чётные до 10, и нечётные до 11 Pascal
Нужна программа, в которой можно вывести числа до 10 четные(2, 4, 6, 8, 10), и до 11 не четные(1, 3, 5, 7, 9, 11) в случайном порядке. Заранее спасибо.
Pascal Каждый элемент в двумерном массиве больший 7 домножить на результат целочисленного деления этого элемента на 7
Ввести двумерный массив A (NxM) . Каждый элемент в массиве больший 7 домножить на результат целочисленного деления этого элемента на 7. Массив вывести до и после преобразования.
Pascal Найти во введенном предложении количество слов, у которых совпадают первая и последняя буква у меня есть такая задачка, её надо переделать под такое условие: составить программу поиска во введенном предложении количества слов, у которых совпадают первая и последняя буква. b:=0 for i:=1 to... https://www.cyberforum.ru/ pascal/ thread698697.html
Pascal Составить программу ввода значений и вычисления длины этого вектора https://www.cyberforum.ru/ pascal/ thread698654.html
Дан вектор {z1},i=1,...,50. Составить программу ввода значений и вычисления длины этого вектора по формуле L=корень из z12+z22+...+z502
Pascal номер наименьшего элемента массива Помогите пожалуйста написать программу в паскале: Составить* программу для вычисления S - сумма элементов массива с нечетными номерами; T - произведение всех элементов массива; U - номер... https://www.cyberforum.ru/ pascal/ thread698622.html
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30856 / 20179 / 7873
Регистрация: 22.10.2011
Сообщений: 35,034
Записей в блоге: 6
18.04.2015, 12:10 0

Подключаемые модули

18.04.2015, 12:10. Просмотров 58036. Ответов 1
Метки (Все метки)

Ответ


Существует еще несколько особенностей работы с модулями.


1. Описание в нескольких модулях одинакового идентификатора
2. Циклическая зависимость модулей (circular unit reference)


Первая из них заключается в том, что при описании в нескольких модулях одинакового идентификатора (будь то имя типа, переменной, константы, или подпрограммы) и при подключении этих модулей друг к другу или к основной программе, при обращении к тем самым дублирующимся идентификаторам будет подразумеваться тот, который описан в последнем из подключенных модулей. Например, имеем:

Первый модуль:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
unit u1;
 
interface
 
type 
  TestType = array[1 .. 10] of integer;
  
procedure TestProc;
 
implementation
 
procedure TestProc;
begin
  writeln('TestProc from u1');
end;
 
end.
Второй модуль:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
unit u2;
 
interface
 
type
  TestType = integer;
  
procedure TestProc;
 
implementation
 
procedure TestProc;
begin
  writeln('TestProc from u2');
end;
 
end.
Основная программа:
Pascal
1
2
3
4
5
uses u1, u2;
 
begin
  TestProc; { Вывод: "TestProc from u2" }
end.
При сборке программы не будет никаких проблем, несмотря на одинаковые идентификаторы, а вот при запуске отработает та процедура, которая описана в модуле u2 (поскольку он подключен позже, чем u1). Если поменять порядок подключения модулей:
Pascal
1
2
3
4
5
uses u2, u1;
 
begin
  TestProc; { Вывод: "TestProc from u1" }
end.
, и пересобрать программу, то теперь отработает TestProc из модуля u1.

Для того, чтобы использовать идентификатор из модуля, подключенного НЕ последним, нужно указать, в каком именно модуле он описан:
Pascal
1
2
3
4
5
uses u2, u1;
 
begin
  u2.TestProc; { Теперь будет  вызвана процедура из u2, независимо от порядка подключения }
end.
Но если с подобной процедурой программа хотя бы будет компилироваться, то при попытке использовать другой тип (массив вместо скалярного типа, например), будут большие проблемы:

Pascal
1
2
3
4
5
6
7
8
uses u1, u2;
 
var 
  i : integer;
  a : TestType;
begin
  for i := 1 to 10 do a[i] := i; { Ошибка, нелегальный квалификатор (Illegal Qualifier) }
end.
, хотя казалось бы, модуль подключен к программе, и все должно работать. Незнание этой особенности очень часто приводит к недоразумениям, особенно при использовании VCL/LCL или других библиотек совместно с модулем Windows. Например, как вот тут: Создать объект Bitmap для загрузки изображения
Решение - точно такое же, как и в предыдущем случае. Либо поменять местами названия модулей в списке uses, либо использовать полное имя типа:
Pascal
1
a : u1.TestType;

Еще одна особенность - подключение первого модуля ко второму, а второго - к первому. Так называемая циклическая зависимость (circular unit reference). Вот пример (он, правда, синтетический, но основная идея понятна. При работе с теми же VCL/LCL тоже довольно часто встречается подобная ошибка, когда нужно связать две формы между собой) :

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
unit u1;
 
interface
uses u2;
 
procedure PrintFirst;
procedure PrintFirstSecond;
 
implementation
 
procedure PrintFirst;
begin
  writeln('Print first');
end;
procedure PrintFirstSecond;
begin
  writeln('Print first');
  PrintSecond;
end;
 
end.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
unit u2;
 
interface
uses u1;
 
procedure PrintSecond;
procedure PrintSecondFirst;
 
implementation
 
procedure PrintSecond;
begin
  writeln('Print Second');
end;
procedure PrintSecondFirst;
begin
  writeln('Print Second');
  PrintFirst;
end;
 
end.
Основная программа
Pascal
1
2
3
4
5
uses u1, u2;
 
begin
  PrintFirstSecond;
end.
Этот проект компилироваться не будет, потому что присутствует циклическая зависимости: первый модуль ссылается на второй, а второй - на первый. Для того, чтобы решить проблему, достаточно перенести раздел Uses в любом из модулей (либо в обоих) из секции Interface в секцию Implementation:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
unit u1;
 
interface
 
procedure PrintFirst;
procedure PrintFirstSecond;
 
implementation
uses u2; { <--- Раньше было в Interface }
 
procedure PrintFirst;
begin
  writeln('Print first');
end;
procedure PrintFirstSecond;
begin
  writeln('Print first');
  PrintSecond;
end;
 
end.
, и проблема будет решена, программа компилируется и запускается. Когда хотя бы один из ссылающихся друг на друга модулей подключается в разделе Implementation, компилятор умеет разруливать такую зависимость.

Это связано с тем, что для возможности использования модуля компилятор должен откомпилировать его хотя бы частично, только Interface-часть, чтобы знать, какие сущности, объявленные в этом модуле, могут быть использованы извне, и если хотя бы один из модулей частично откомпилирован (в приведенном выше примере это будет u1, в его интерфейсной части теперь нет никаких недомолвок и еще неизвестных модулей), то другой также прекрасно соберется.

Вернуться к обсуждению:
Подключаемые модули
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2015, 12:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Модули
Помогите!!Не врубаюсь в тему модули!Надо решить... Разработать модуль, реализующий функции...

Модули
составить модуль работы с комплексными числами:сложения, вычитания, умножения, деления, модуль...

Модули
Доброго времени суток. Ребят решил задачу ща с выложу код! Мне учитель сказал сделать ее по...

Модули. КР
Создать модуль для работы с векторами и матрицами (ввод, вывод, сложение, произведение,...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.