• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Модуль

  • Автор темы Автор темы ZEKE
  • Дата начала Дата начала

ZEKE

Новые
Регистрация
15 Фев 2011
Сообщения
23
Реакции
0
Баллы
0
Модуль

Здравствуйте. Помогите пожалуйста. Никак не могу разобраться с модулями. Совсем беда. Имеется главная программа и сам модуль. Нужно чтобы из главной программы переменная N передавалась модулю. Модуль подсчитывает функцию с этой переменной и выводит ответ в переменную S. И эту переменную с ответом нужно взять с модуля в главную программу. Модуль подключал через uses. Все равно ничего не получается.
 
Потерпите - в конце лета к нам обещал заглянуть наш экстрасенс, у него-то мы и узнаем, на каком языке пишется программа, а также получим возможность посмотреть на листинги программы и модуля. Раньше, к сожалению, никак.
 
Извиняюсь, думал это не особо важно.

Код основной программы:
Код:
Program zad1;
uses crt,zad2;
var
y1,y2,y3,y4,z,n,h,x:real;
i,x1,x2,r:integer;
p:string;
begin
for i := 1 to 100 do
begin
writeln;
writeln('1 - Zadacha 1, 2 - Zadacha 2');
read(r);
case r of
1:begin
x:=0;
writeln('vvedite x1,x2,h:');
read(x1,x2,h);
writeln('Shag          Argument             Otvet');
for i:=1 to 1000 do
begin
if(x>x2)
then break;
x:=x1+((i-1)*h);
if(x<=3)
then
p:='ne prinadlegit osyam';
if(x>=3) and (x<=9)
then
begin
p:='prinadlegit osyam 3<x<9';
y1:=(2*x*x+3*x+1)/(x+cos(x)*cos(x));
y2:=(2*sin(x))*(sin(x));
z:=y1*y1+y2;
z:=z+z;
end;
if(x>9)
then
begin
p:='prinadlegit osyam x>9';
y3:=(sin(x)/cos(x)+x+exp(-x));
y4:=(2*sin(x))*(sin(x));
z:=y3*y3+y4;
z:=z+z;
end;
writeln(' ',x,'     ',p,'     ',z:8:2);
end;
end;
2:begin
writeln(Zad2.s);
end;
end;
end;
end.

Код модуля:
Код:
unit zad2;
 interface
var
 a:array[1..1000] of integer;
 b:array[1..1000] of integer;
 i,n,s,i1:integer;
 Procedure zad1(s:integer);
 implementation
Procedure zad1(s:integer);
begin
 s:=0;
 i1:=0;
 randomize;
 for i:=1 to n do 
  begin
   a[i]:=70-random(100);
   write(a[i]:4);
   if abs(a[i])<sqr(i)
   then
   begin
       s:=s+a[i];
       i1:=i1+1;
       b[i1]:=i;
       end;
       writeln('sum= ',s);
       end;
    writeln;
        for i:=1 to i1 do
        write(b[i]:5);

end;
end.
 
Прежде всего - Паскаль не допускает одинакового наименования программы и процедуры, а у Вас и там, и там - zad1. Попробуйте для начала переименовать программу, а можете и вовсе первую строку (Program ...;) выбросить - она необязательна.
 
Переименую. Меня больше интересует как исполнить то, что я описал в шапке темы. Ибо, не как не могу разобраться как передать значение переменной модулю, и обратно. Нужно ли создаваться файл TPU главной программе? чтобы модуль мог читать из нее параметры?
 
Переименую. Меня больше интересует как исполнить то, что я описал в шапке темы. Ибо, не как не могу разобраться как передать значение переменной модулю, и обратно. Нужно ли создаваться файл TPU главной программе? чтобы модуль мог читать из нее параметры?
Тут всё очень просто.
Когда Вы присоединяете модуль, его процедуры и функции абсолютно ничем не отличаются от процедур и функций, написанных в самом теле программы. Переменные, описанные Вами в разделе Interface, становятся глобальными переменными программы. Но чтобы это произошло, нужно либо предварительно оттранслировать модуль, либо при трансляции программы воспользоваться функцией Make или Build - тогда модуль оттранслируется автоматически.
А проблемы могут возникнуть вот где. Необходимо в опциях Вашего Паскаля открыть пункт Directories и настроить так, чтобы пакет искал файл TPU именно там, где он оказался после трансляции, а не где попало.
Вроде всё.
 
Написал в теле главной программы:
Код:
 zad2.n:=5; 
 writeln(zad2.s);
Но в ответ выводится только 0.
Не могу понять, как передать переменной, которая находится в модуле число. И вывести из модуля переменную S.
Может нужно что-то еще?
 
Написал в теле главной программы:
Код:
 zad2.n:=5; 
 writeln(zad2.s);
Но в ответ выводится только 0.
Не могу понять, как передать переменной, которая находится в модуле число. И вывести из модуля переменную S.
Может нужно что-то еще?
Нужно.
Исправить две ошибки.
1. В теле программы запустить процедуру zad1 на выполнение, т.е. добавить строку:
Код:
 zad2.n:=5; 
 zad1(zad2.s);
 writeln(zad2.s);
2. (Очень важно!!!). Исправить заголовок процедуры zad1. Поскольку s - выходной параметр, то перед ним обязательно должен стоять var. Иначе говоря, правильно так:
Код:
Procedure zad1(var s:integer);
 
Спасибо большое, Владимир. Разобрался с задачей. Хоть Вы смогли популярно объяснить)
 

Похожие темы

Назад
Сверху