КИТА unofficial
Май 06, 2024, 03:34:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Обработка исключительных ситуаций в языки С++  (Прочитано 15069 раз)
Описание темы: если кто-то владеет нужной информацией просьба поделиться знаниями
0 Пользователей и 1 Гость смотрят эту тему.
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« : Сентябрь 11, 2008, 04:00:42 »

В сфере недавних событий появилась одна маленькая, но весьма маленькая проблемка: в любой программе учебной, научной и т.п. могут возникать исключительные ситуации, которые необходимо обрабатывать. Такие ситуации в С++ обрабатываются с помощью генерации исключений, для этого используются операторы throw, catch и т.д. А теперь, уважаемые, знатоки, внимание вопрос: "Почему эти операторы никак не хотят работать в среде Borland C3.1? Операторы выделяются белым цветом, как положено, но при компиляции программы вылезают ошибки, связанные с использованием этих самых операторов."
 Грустный
ЗЫ: Просьба не предлагать сменить среду на другую, нужна именно этаУлыбка
Записан
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #1 : Сентябрь 11, 2008, 04:01:46 »

Извини, друг, но ответ на твой вопрос "потому что надо сменить среду, так как в этой версии обработка исключений не реализована" Смеющийся
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #2 : Сентябрь 11, 2008, 04:08:31 »

Извини, друг, но ответ на твой вопрос "потому что надо сменить среду, так как в этой версии обработка исключений не реализована"

Нак какую среду ее поменять лучше всего? Моё задаие предполагает построение графиков, пользовательского интерфейса и т.п. В билдере, я так понимаю исключение работают, но там не получается использовать графические функции Borland C 3.1. Как же теперь быть?
Записан
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #3 : Сентябрь 11, 2008, 04:16:59 »

Магнетон Бора, а какой интерфейс и графики в прогой под DOS, и плюс на висте незапашет.
Записан
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #4 : Сентябрь 11, 2008, 04:18:34 »

Извини, друг, но ответ на твой вопрос "потому что надо сменить среду, так как в этой версии обработка исключений не реализована"

Нак какую среду ее поменять лучше всего? Моё задаие предполагает построение графиков, пользовательского интерфейса и т.п. В билдере, я так понимаю исключение работают, но там не получается использовать графические функции Borland C 3.1. Как же теперь быть?

Если нужна BGI-графика, то единственный выход - не обрабатывать исключения.
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #5 : Сентябрь 11, 2008, 04:23:55 »

Магнетон Бора, а какой интерфейс и графики в прогой под DOS, и плюс на висте незапашет.

Виста меня интересуют сейчас меньше всего, а большего всего - курсовой проект, в котором пользовательский интерфейс и графики функций необходимо реализовывать вручную.
(Отправлено в: Сентябрь 11, 2008, 04:21:50 )
 
Если нужна BGI-графика, то единственный выход - не обрабатывать исключения.

Т.е. просто вместе генерации исключений ставить кучу проверок и тем самым портить полезный код ?
Записан
artri
Cтудент
*

Карма: +1/-0
Offline Offline

Сообщений: 85


artri@jabber.ru


« Ответ #6 : Сентябрь 11, 2008, 04:30:04 »

Когда-то такая проблема стояла применительно к Borland Pascal 7.0. Решение было найдено в одной из книг Фаронова. Точно уже не помню, но где-то так: т.к. адрес текущей инструкции сохраняется в паре регистров ЦП CS:IP, предлагалось где-то сохранять значение этих регистров, после чего переопределялась стандартная функция паскаля, вызываемая при возникновении исключения, в которой для регистров CS:IP устанавливалось сохраненное значение. Этот подход был когда-то использован в курсовой работе по программированию. Оно даже работало :-D

Думаю, что реализовать нечто похожее можно и в Borland C3.1. Если интересно, могу выложить модуль на паскале с примерами использования Улыбка
Записан

oDesk Certified Java Developer
- Телепатический локатор, - пояснил Петрович, вытирая руки ветошью.- Основной инструмент аналитика, позволяющий напрямую извлекать технические требования из головы заказчика. (с) Трое в серверной, не считая админа. Глава 8. Тестеры и аналитики
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #7 : Сентябрь 11, 2008, 04:31:24 »

Увы. Или забить на графику BGI и пользоваться примитивными функциями рисования WinAPI (рисовать линии, выводить шрифт, делать заливку). BGI была дана чтобы освоить принципы. Если освоил, то разберешься и с рисованием примитивов в других библиотеках.

artri, только чтобы это заработало минимум в хрюнделе и он смог защитить при сдаче Подмигивающий ИМХО, рано ему до подходов с модификацией Instruction Pointer.
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #8 : Сентябрь 11, 2008, 04:34:22 »

artri, кстати да. Я тоже так делал в свое время Улыбка Ничего там сложного нету. Выложи им примерчик.
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
artri
Cтудент
*

Карма: +1/-0
Offline Offline

Сообщений: 85


artri@jabber.ru


« Ответ #9 : Сентябрь 11, 2008, 04:37:53 »

artri, только чтобы это заработало минимум в хрюнделе и он смог защитить при сдаче Подмигивающий ИМХО, рано ему до подходов с модификацией Instruction Pointer.

EvilMax, ИМХО, если сильно нужно именно там, где инструментария нормального нет, то можно и Instruction Pointer модифицировать.
Записан

oDesk Certified Java Developer
- Телепатический локатор, - пояснил Петрович, вытирая руки ветошью.- Основной инструмент аналитика, позволяющий напрямую извлекать технические требования из головы заказчика. (с) Трое в серверной, не считая админа. Глава 8. Тестеры и аналитики
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #10 : Сентябрь 11, 2008, 04:41:52 »

EvilMax, спасибо за совет, буду юзать карсовой без генерации исключений. :-)
(Отправлено в: Сентябрь 11, 2008, 04:39:59 )
 artri, чисто ради спортивного интереса покажи этот примерчик, и объясни по-подробнее )))
Записан
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #11 : Сентябрь 11, 2008, 04:42:22 »

artri, если не сложно выложи пожалуйста примерчик. ИУС-07, и я в том числе, будем тебе благодарны Улыбка
Записан
artri
Cтудент
*

Карма: +1/-0
Offline Offline

Сообщений: 85


artri@jabber.ru


« Ответ #12 : Сентябрь 11, 2008, 05:10:49 »

Модуль диагностики:
Код:
Unit diagnost;

INTERFACE

Uses crt,us;

type jumprec=record
              spsave,bpsave:word;
              jmpptr:pointer;
             end;

Var
oldexit:pointer;
    jumping:jumprec;

procedure userexit;far;

procedure setjmp(var jmpdest:jumprec);
InLine($5F/$26/$89/$25/$26/$89/
         $6D/$02/$E8/$00/$00/$58/$05/$0C/$00/$26/$89/$45/$04/$26/$8C/$4D/$06);

procedure longjmp(var  jmpdest:jumprec);
inline($5F/$07/$26/$8B/$25/$26/$8B/$6D/$02/$26/$FF/$6D/$04);

                    IMPLEMENTATION

{процедура наш обработчик исключительных ситуаций}
procedure userexit;
Const
      w3:word=1811;
      w4:word=2875;
var
  txt:string;

begin
 case exitcode of
  1:txt:='Неверный номер функции';
  2:txt:='Не найден файл';
  3:txt:='Не найден путь';
  100:txt:='Ошибка чтения с диска';
  101:txt:='Ошибка записи на диск';
  106:txt:='Неверный числовой формат';
  150:txt:='Диск защищен от записи';
  152:txt:='Не готов диск';
  154:txt:='Ошибка в исходных данных';
  200:txt:='Деление на ноль';
  202:txt:='Переполнение стека';
  203:txt:='Переполнение кучи';
  205:txt:='Переполнение при операции с плавающей запятой';
  206:txt:='Исчезновение порядка при операции с плавающей запятой';
  207:txt:='Недопустимая операция с плавающей запятой';
  else txt:=' Ошибка процесса ';
 end;{case}

{показываем сообщение об ошибке в отдельном окошке}
 rame(19,7,61,13,15,4,' ! ОШИБКА ! ');
 window(lo(w3)+1,hi(w3)+1,lo(w4)+1,hi(w4)+1);
 textbackground(red);
 textcolor(white);
 clrscr;
 setnocursor;
 writeln(txt);
 writeln('Нажмите любую клавишу для продолжения');
 window(lo(w1)+1,hi(w1)+1,lo(w10)+1,hi(w10)+1);
 readkey;

{удаляем временные файлы, восстанавливаем стандартные настройки окружения}
 go_out;

{здесь выполняется переход на сохраненную точку}
 exitcode:=0;
 erroraddr:=nil;
 longjmp(jumping);
end;

{********************************************}

                    END.

Пример использования:
Код:
Program main;
uses meny,textin,dos,crt,us,diagnost;
var casing,n:byte;
    s1,s2,total_s:string;
    epsilon:real;
    icount:integer;
begin

{здесь создаем точку сохранения состояния}
setjmp(jumping);
casing:=10;
exitproc:=@userexit;

{здесь выполняется какой-то код}
repeat
  menu(casing);
  menu_process(casing);
until (casing=253)or(casing=50);

{здесь восстанавливаем стандартный обработчик ошибок}
exitproc:=nil;
end.

Где-то так, кстати, для Borland C 3.1 возможно надо будет инлайн коды переписать, т.к. насколько я помню там как-то хитро состояние регистров из стека извлекается
« Последнее редактирование: Сентябрь 11, 2008, 05:25:04 от artri » Записан

oDesk Certified Java Developer
- Телепатический локатор, - пояснил Петрович, вытирая руки ветошью.- Основной инструмент аналитика, позволяющий напрямую извлекать технические требования из головы заказчика. (с) Трое в серверной, не считая админа. Глава 8. Тестеры и аналитики
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #13 : Сентябрь 11, 2008, 05:21:26 »

artri, слегка подправил пост - русские сообщения видны теперь. Да, я тоже так делал Улыбка По-моему достаточно простой для понимания способ.
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
artri
Cтудент
*

Карма: +1/-0
Offline Offline

Сообщений: 85


artri@jabber.ru


« Ответ #14 : Сентябрь 11, 2008, 05:26:02 »

artri, слегка подправил пост - русские сообщения видны теперь. Да, я тоже так делал Улыбка По-моему достаточно простой для понимания способ.

Ага, особенно inline инструкции  Смеющийся
Записан

oDesk Certified Java Developer
- Телепатический локатор, - пояснил Петрович, вытирая руки ветошью.- Основной инструмент аналитика, позволяющий напрямую извлекать технические требования из головы заказчика. (с) Трое в серверной, не считая админа. Глава 8. Тестеры и аналитики
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #15 : Сентябрь 11, 2008, 05:52:02 »

artri, спс за код, буду разбирать.
Записан
zer_owlet
Необычные пользователи
Проректор
*

Карма: +103/-16
Offline Offline

Пол: Мужской
Сообщений: 2399



« Ответ #16 : Сентябрь 11, 2008, 10:22:55 »

кстати, по поводу "рано" -- Мокрый это давал на 1-м курсе..... и в паскале его пример работал на ура... знаю, потому что делал на 5-м курсе курсовой для какого-то 1-курсника и там надо было ))
Записан



Если бы те, кто злословит обо мне, знали, что я о них думаю, они бы ещё не то говорили.

Так хочется быть добрым и порядочным, особенно, когда понимаешь, что патронов на всех никогда не хватит..

Памятка женщинам: если ты хочешь, чтоб мужчина встал на колени - разденься и встань на четвереньки.
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #17 : Сентябрь 11, 2008, 11:18:35 »

кстати, по поводу "рано" -- Мокрый это давал на 1-м курсе..... и в паскале его пример работал на ура... знаю, потому что делал на 5-м курсе курсовой для какого-то 1-курсника и там надо было ))
Хм. Наверное, я перваков недогружаю Смеющийся Сделаю выводы. Поставим цель, чтобы "средний студент" не только там дизайнил ОО-софт, но и мог наваять по-шурику обработку исключительных ситуаций с инлайн-кодом Подмигивающий
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
FazU
Snowman
Проректор
*****

Карма: +58/-16
Offline Offline

Пол: Мужской
Награды:
3 место в фотоконкурсе \3 место в фотоконкурсе \Интересно все таки попробывать как оно работает :)I место в конкурсе поэзии \
Сообщений: 3773


Иногда камней просто не хватает...


WWW
« Ответ #18 : Сентябрь 11, 2008, 11:29:45 »

я перваков недогружаю Смеющийся
все перваки идите в деканат! вам пора.... Смеющийся
Записан

zer_owlet
Необычные пользователи
Проректор
*

Карма: +103/-16
Offline Offline

Пол: Мужской
Сообщений: 2399



« Ответ #19 : Сентябрь 12, 2008, 04:24:36 »

кстати, по поводу "рано" -- Мокрый это давал на 1-м курсе..... и в паскале его пример работал на ура... знаю, потому что делал на 5-м курсе курсовой для какого-то 1-курсника и там надо было ))
Хм. Наверное, я перваков недогружаю Смеющийся Сделаю выводы. Поставим цель, чтобы "средний студент" не только там дизайнил ОО-софт, но и мог наваять по-шурику обработку исключительных ситуаций с инлайн-кодом Подмигивающий

помню как разговаривал с некоторыми преподавателями на тему обработки прерываний -- дык для них пример Мокрого тоже был новостью )) однако, пример работал отлично Улыбка
Записан



Если бы те, кто злословит обо мне, знали, что я о них думаю, они бы ещё не то говорили.

Так хочется быть добрым и порядочным, особенно, когда понимаешь, что патронов на всех никогда не хватит..

Памятка женщинам: если ты хочешь, чтоб мужчина встал на колени - разденься и встань на четвереньки.
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #20 : Сентябрь 13, 2008, 09:04:48 »

Жаль, конечно, что это пример реализован на Паскале, но все-равно не понятно некоторые вещи... И не думаю, ИМХО что стоит сейчас мучится с юзаньем инлайн функций, уж лучше плотнее подойти к глубокому изучению метода решения поставленной задачи. :-)
Записан
Страниц: 1 2 [Все]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.111 секунд. Запросов: 33.