Дан стек. Нужно его реверсировать, т.е. изменить направление ссылок в стеке на противоположное, т.е. после реверсирования вершина и дно стека меняются местами. Подскажите пожалуйста, как это можно сделать
Приветствую Вас, rewer8! Создать второй, аналогичный, стек и забросить в него данные из первого стека. Потом ссылке на первый стек присвоить ссылку на второй. Ответ отправлен: 22.11.2004, 09:24 Отправитель: sir henry Отвечает Boriss
Приветствую Вас, rewer8! А как Вы стек реализовали? Через статический массив, через динамические структуры? По-умному, надо запомнить, где начало стека, где конец и направление перехода (+1 или -1). Тогда, то, что Вы просили делается просто - просто надо поменять местами. Без более подробной исходной информации вряд ли можно ответить точнее :(( Ответ отправлен: 22.11.2004, 11:21 Отправитель: Boriss
Вопрос № 549
Здраствуйте. Вот программа, но она не запускается - выводит ошибку переполнения в стеке. В меню OPtions->Memory sizes - уставнавливал стек побольше вплоть до 65520, но не помогло.Чё делать??
Добрый день, Семен! Если я правильно понял, то функция dec2hex переводит число в строку с 16-ой записью числа. Ошибка (переполнение стека) заключается в следующем: if dec2hex(a)='' then dec2hex:='0'; Этот оператор образует рекурсию, которая никогда не закончится (ср. со следующим фрагментом: s:=dec2hex(a) ; значение перемнной a НИГДЕ не изменяется) и ведёт к переполнению стека. Один из вариантов устранения - введение локальной переменной. Ещё одна ошибка: dec2hex:=hexdigit[succ(value and $F)]; предыдущее значение стирается. Правильный (работоспособный) вариант приведён в приложении.
Приложение: Ответ отправлен: 24.11.2004, 14:47 Отправитель: Василевский Александр Отвечает Boriss
Здравствуйте, Семен! !!!!!!!!!!! if dec2hex(a)='' then dec2hex:='0'; !!!!!!!!!!! Это означает вызов функции вновь!!!!!!!!! Тут никакого стека и не хватит. Нужно завести локальную переменную и с ней иметь дело. А потом присвоить ее имени функции Ответ отправлен: 24.11.2004, 15:37 Отправитель: Boriss Отвечает Strory
Приветствую Вас, Семен! Могу посоветовать поставить размер стека равным бесконечности, в теории должно помочь. ;) Семен, ты набодяжил бесконечную рекурсию, поэтому в один прекрасный момент тысячи загруженных в пямять копий функции dec2hex заполняют её всю. ЗЫ Цитата из толкового словаря: "Рекурсия - см. Рекурсия" Ответ отправлен: 25.11.2004, 21:14 Отправитель: Strory Отвечает sir henry
Здравствуйте, Семен! А Вы бы в своих опциях о размере стека полюбопытсвовали. :) Может быть какой-то шутник его в 0 выставил. :) Ответ отправлен: 25.11.2004, 09:03 Отправитель: sir henry Отвечает Snowm@n
Доброе время суток, Семен! 2 ошибки: 1) в строке "if dec2hex(a)='' then dec2hex:='0';" ты рекурсивно вызываешь саму функцию. Условия выхода нет, следовательно рекурсия бесконечна, вот стек и переполняется. Можно завести доп переменную r для результата 2) не "dec2hex:=hexdigit[succ(value and $F)];" а "r:=r+hexdigit[succ(value and $F)];" сам подумай почему 3) рабочий вариант в приложении
Приложение: Ответ отправлен: 24.11.2004, 16:29 Отправитель: Snowm@n Отвечает Ayl
Приветствую Вас, Семен! Ну ты и наворотил! Еще бы она не вылетала, когда у тебя в конце функции dex2hex производится безусловный вызов ее же. Рекурсия с неограниченной глубиной - это всегда нехватка стека при любом его размере. Твоя функция должна выглядеть примерно так (см. Приложение)
Приложение: Ответ отправлен: 24.11.2004, 17:44 Отправитель: Ayl
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.