Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2016, 22:53   #1
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию Process is terminated due to StackOverflowException [PacscalABC]

Добрый день,

Дали задание составить програмный комплекс по ТЗ. Комплекс состоит из 4-х подпрограмм (4 задания) + в теле программы меню выбора заданий с помощью ввода номера задания пользователем.

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

С проблемой столкнулся в задание №3 (3 подпрограмма-функция, в коде они идут по порядку). А именно по ТЗ к 3 заданию нужно:




Собственно когда через меню вызываю 3 подпрограмму. Выскакивает ошибка: Process is terminated due to StackOverflowException и программа просто вылетает.

Тестил на FreePascal там значение выводится без ошибок, хоть оно и очень огромное получается. А в PascalABC ругается. Может кто помочь разобраться в чем причина ?

Кусок кода с подпрограммой:

Код:
function P:real; {Задание №3}
// Описание: Находит произведение ряда от x=2 до 10*N
 var f:real;
     x,N:integer;
 begin
    N:=1; P:=1;
    for x:=2 to 10*N do {Диапозон ряда произведения}
      begin
        f:=exp(ln(12)*(x*cos(x)))-sqr(x)+sin(x)/n; {Вычисляет выражение}
        P:=P*f; {Произведение ряда}
      end;
 end;
Код программы:
Код:
function f_x:real; {Задание №1}
// Описание: Вычисляет выражение f(x)
  var  x,n:real; 
  begin
    n:=1;
    write('x= ');
    Repeat  {Блок проверки корректного ввода данных}
      readln(s);
      Val(s, x, Code); 
      if  Code <> 0 then
        Write('Некорректный ввод. Повторите: ');
    Until Code = 0;
    f_x:= exp(ln(12)*(x*cos(x)))-sqr(x)+sin(x)/n; {Вычисление функции f(x)}
  end;

function y:real; {Задание №2}
// Описание: Вычисляет 1 из 2-х выражений f(x) в зависимости от условия
  var x:real;
      N:integer;
  begin
    N:=1;
    write('x= '); {Ввод переменной х}
    Repeat  {Блок проверки корректного ввода данных}
      readln(s);
      Val(s, x, Code); 
      if  Code <> 0 then
        Write('Некорректный ввод. Повторите: ');
    Until Code = 0;  
    if x < exp(0.1*n) then y:=(exp(ln(3)*x) - sqr(x) + sin(x))/ n
     else y:=x*sin(exp(ln(x)*n)); {Проверка условия ТЗ}
  end;
  
function P:real; {Задание №3}
// Описание: Находит произведение ряда от x=2 до 10*N
 var f:real;
     x,N:integer;
 begin
    N:=1; P:=1;
    for x:=2 to 10*N do {Диапозон ряда произведения}
      begin
        f:=exp(ln(12)*(x*cos(x)))-sqr(x)+sin(x)/n; {Вычисляет выражение}
        P:=P*f; {Произведение ряда}
      end;
 end;

Procedure mas; {Задание №4}
// Описание: В матрице A размером n*n меняет местами максимальный и минимальный элементы 
 var a:array [1..15,1..15] of real;
     max,min:real;
     i,j,n:integer;
begin
  write('n= '); {Задается размер массива}
  Repeat  {Блок проверки корректного ввода данных}
    readln(s);
    Val(s, n, Code); 
    if  Code <> 0 then
      Write('Некорректный ввод. Повторите: ');
  Until Code = 0;  
  writeln; writeln('Массив:');
  for i:=1 to n do
    for j:=1 to n do
      begin
        a[i,j]:=i*j*sin(0.5*i*j); {Автоматичесое заполнение массива согласно формуле}
        write(' ',a[i,j]:2:2,' '); {Вывод исходного массива}
        if j mod n = 0 then writeln;
      end;
  max:=a[1,1]; min:=a[1,1];   
  for i:=1 to n do
    for j:=1 to n do  
      begin
        if max < a[i,j] then max:=a[i,j] {Поиск max элемента}
          else if min > a[i,j] then min:=a[i,j]; {Поиск min элемента}
      end;
  writeln; 
  writeln('max= ',max:2:2,' ','min= ',min:2:2); {Промежуточный контроль max и min элемента}
  writeln; writeln('Новый массив: ');
  for i:=1 to n do 
    for j:=1 to n do
      begin
        if max = a[i,j] then a[i,j]:=min {Замена максимального элемента}
          else if min = a[i,j] then a[i,j]:=max; {Замена минимального элемента}
        write(' ',a[i,j]:2:2,' '); {Вывод нового массива}
        if j mod n = 0 then writeln;
      end;  
  end;
    
begin
clrscr;

writeln('Меню выбора заданий: '); {Блок выбора заданий}
writeln('1 - Задание 1');
writeln('2 - Задание 2'); 
writeln('3 - Задание 3');
writeln('4 - Задание 4');
writeln; write('Введите номер задания: ');
 readln(t); writeln; clrscr;
 
case t of {Выбор подпрограммы согласно номеру задания}
1:writeln('Ответ: f(x)= ', f_x:2:2);
2:writeln('Ответ: y= ',y:2:2);
3:writeln('Ответ: P= ',P:2:2);
4:mas()
else writeln('Ошибка! Некорректный ввод!');
end;

readln;
end.
artems67 вне форума Ответить с цитированием
Старый 22.12.2016, 23:09   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Подозреваю, что ошибка тут:
Код:
    P:=P*f; {Произведение ряда}
Имя функции присутствует в правой части.
Опиши отдельную переменную, например Proizvedenie
Выполни операции с ней.
При выходе из п/п: P := Proizvedenie.
А так получается рекурсивный вызов.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 22.12.2016, 23:19   #3
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

ViktorR, Вы правы. Спасибо, теперь всё работает.
artems67 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Variable inaccessible here due to optimization BLACK_RAIN Общие вопросы Delphi 18 12.04.2015 18:22
Необработанное исключение типа "System.StackOverflowException" [Smarik] Общие вопросы .NET 1 15.08.2013 13:49
Terminated в потомке класса TThread Dr. MefistO Общие вопросы Delphi 4 13.02.2013 16:10
C#(перехват нового экземпляра класса StackOverflowException) Anett// Помощь студентам 0 12.05.2011 22:26
(process.h) Компилятор говорит Process не объявлен Парсифаль Общие вопросы C/C++ 0 15.02.2010 00:27