Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Pascal Установить в Debian что-нибудь похожее интерфейсом IDE на Turbo Pascal https://www.cyberforum.ru/ pascal/ thread1260862.html
Подскажите, что и как можно установить в Debian что-нибудь похожее интерфейсом IDE на Turbo Pascal. Спасибо. Добавлено через 3 минуты Да, ещё желательно, чтоб была совместимость с синтаксисом...
Pascal В массиве удалить все элементы кратные заданному числу
Задать три массива: один случайными целыми числами, второй вещественными положительными числами, третий - целыми числами в диапазоне значений от h до f. В первом массиве удалить все элементы кратные...
Вывести K-e степени чисел из заданного набора Pascal
Вариант4. Даны целые числа K, N и набор из N вещественных чисел: A1, A2, …,AN. Вывести K-e степени чисел из данного набора: (A1)^K, (A2)^K, …, (AN)^K. ^cтепень
Pascal Вычислить значение y в зависимости от х функции очень нуждаюсь в помощи.. нужно вычислить значение y в зависимости от х функции... https://www.cyberforum.ru/ pascal/ thread1260635.html
Pascal Задать массив вещественными числами от а до в, в количестве n и найти сумму всех цифр чисел кратных трем https://www.cyberforum.ru/ pascal/ thread1260321.html
Задать массив вещественными числами от а до в , в количестве n и найти сумму всех цифр чисел кратных трем
Задать массив целыми числами в диапазоне [0.100] и удалить все элементы , у которых последняя цифра 8 Pascal
Задать массив целыми числами в диапазоне и удалить все элементы , у которых последняя цифра 8
Pascal Если в строке, размещенной в динамической памяти, нет символа +, то оставить текст без изменения
Если в строке,размещенной в динамической памяти,нет символа +,то оставить текст без изменения, иначе каждую из цифр, предшествующую первому вхождению символа + заменить символом -.помогите сделать на...
Pascal Найти в последовательности самую длинную подпоследовательность, состоящую только из положительных чисел Найти в заданной последовательности самую длинную подпоследовательность, состоящую только из положительных чисел. используя текстовые файлы https://www.cyberforum.ru/ pascal/ thread1260267.html
Pascal Написать программу, в которой задается число, а компьютер его угадывает https://www.cyberforum.ru/ pascal/ thread1259883.html
помогите пожалуйста, написать программу, в которой я задаю число, а компьютер угадывает это число. количество попыток ограничено ?
Pascal Дан текст содержащий сведения об успеваемости учащихся. Определить средний балл каждого ученика Задача:Дан текст содержащий сведения об успеваемости учащихся, разделенное запятой.Каждое сведение содержит фамилию, имя ученика и оценки по 4 предметам, и заканчивается ".". Определить средний... https://www.cyberforum.ru/ pascal/ thread1259643.html
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30869 / 20190 / 7875
Регистрация: 22.10.2011
Сообщений: 35,050
Записей в блоге: 6
22.09.2014, 21:19  [ТС] 0

Как не надо писать программы

22.09.2014, 21:19. Просмотров 17383. Ответов 4
Метки (Все метки)

Ответ


RunTime error 202: Stack overflow error
(или "Программа вылетает с переполнением стека")

Причиной этого является то, что в стеке закончилось место для размещения локальных переменных подпрограммы. То есть, если есть программа:
Pascal
1
2
3
4
5
6
7
8
9
procedure a;
var arr: array[1 .. 20000] of byte;
begin
  arr[1] := 0;
end;
 
begin
  a;
end.
, то при попытке ее выполнить произойдет переполнение стека (размер стека по умолчанию равен 16Кб = 16384 байта, а здесь - попытка разместить 20000 байт).
(Также эта ошибка очень часто возникает при разработке - неправильной, естественно - рекурсивных подпрограмм. Об этом - чуть ниже)

И опять же есть несколько способов борьбы и с этой ошибкой:
  1. Что называется "в лоб" - увеличение размера стека. Заходим в Options|Memory sizes и в поле Stack size меняем значение с 16384 (по умолчанию) на любое значение до 65535 (максимально возможное). Если это не помогло, и ошибка по-прежнему вылетает, значит переходим к способу...
  2. Выделение памяти динамически. Точно так же, как и при борьбе с переполнением сегмента данных, выделяем память через New и освобождаем через Dispose, при этом данные будут храниться не в стеке, а в "куче".
  3. Использование глобальных переменных. Я не сторонник этого метода (глобальные переменные увеличивают вероятность совершить ошибку),
    Небольшое дополнение
    глобальные переменные не обязательно описываются в самом начале программы, перед всеми процедурами и функциями. Если описать такую переменную непосредственно перед подпрограммой, в которой возникает ошибка переполнения стека, а саму эту подпрограмму - как можно ниже по тексту программы - то можно свести вероятность побочных эффектов к минимуму.

    но при возникновении переполнения стека использование глобальных переменных может помочь: ведь глобальные переменные хранятся не в стеке, а в сегменте данных, следовательно, стек разгружается.
  4. Есть ещё один способ борьбы с переполнением стека. И вот тут я бы хотел вернуться к тому фрагменту программы, который я привел выше, помните? Так вот. В таких случаях желательно не только "укоротить" размер строки в описании массива mas2, но и описывать mas2 не как переменную, а как типизированную константу:
    Pascal
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    Procedure op1;
    const 
      m2=15;
      mas2:array[1..m2] of string = (
        '1.Синий',
        '2.Зеленый',
        '3.Бирюзовый',
        '4.Красный',
        '5.Малиновый',
        '6.Коричневый',
        '7.Светло-серый',
        '8.Темно-серый',
        '9.Светло-голубой',
        '10.Светло-зеленый',
        '11.Светло-бирюзовый',
        '12.Светло-красный',
        '13.Светло-малиновый',
        '14.Желтый',
        '15.Белый'
      );
    var
        c1,c2:string;
        cf:text;
    begin
      { ... }
    Во-первых, это избавляет нас от необходимости инициализировать все элементы массива "вручную", программа становится более "стройной", а во вторых - типизированные константы не хранятся в стеке несмотря на то, что они описаны локально. Они всегда хранятся в сегменте данных, то есть, стек опять разгружается.

Что касается рекурсии:
  1. Необходимо следить за тем, что рекурсивная подпрограмма имеет условие окончания (иначе рекурсия становится бесконечной, и возникает ошибка переполнения стека), а также необходимо обращать внимание, чтобы не было того, о чем я написал вот здесь: Ошибки при организации меню
  2. Ни в коем случае не отключайте режим контроля стека через {$S-}, это не заставит автоматически программу работать правильно, а вот ошибку, предупреждающую, что в программе что-то не так, подавит... И будете потом надеяться на то, что это работает, а оказывается - нет.

Ну, и еще несколько общих рекомендаций при разработке программ:
  1. Всегда при отладке компилируйте программы с ключами
    {$R+} (Options|Compiler, группа Runtime Errors - отметить Range Checking) - это поможет найти выходы за пределы массивов, если они есть в программе. В окончательной, уже отлаженной версии, этот ключ можно убрать, это немного ускорит выполнение программы.
    {$S+} (Options|Compiler, группа Runtime Errors - отметить Stack Checking) - об этом я написал выше, помогает "поймать" переполнение стека.
  2. Будьте очень аккуратны с использованием ключа {$B}, чревато ошибками: Оптимизация


Вернуться к обсуждению:
Как не надо писать программы
6
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2014, 21:19

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

Надо ли в конце программы до end писать readln
Надо ли в конце программы до end писать readln, чтобы просто курсор перешел на след. строку и когда...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов...

Как создать программу которая бы выводила рандомно примеры и надо было правильно писать ответы
Как написать программу которая рандомно ставила примеры и надо было только писать правильные ответы...

как писать программы
как мне можно написать программу,и что для этого нужна???подскажите пожалуйста

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