КИТА unofficial

Компьютерный => Программирование => Тема начата: Магнетон Бора от Сентябрь 11, 2008, 04:00:42



Название: Обработка исключительных ситуаций в языки С++
Отправлено: Магнетон Бора от Сентябрь 11, 2008, 04:00:42
В сфере недавних событий появилась одна маленькая, но весьма маленькая проблемка: в любой программе учебной, научной и т.п. могут возникать исключительные ситуации, которые необходимо обрабатывать. Такие ситуации в С++ обрабатываются с помощью генерации исключений, для этого используются операторы throw, catch и т.д. А теперь, уважаемые, знатоки, внимание вопрос: "Почему эти операторы никак не хотят работать в среде Borland C3.1? Операторы выделяются белым цветом, как положено, но при компиляции программы вылезают ошибки, связанные с использованием этих самых операторов."
 :(
ЗЫ: Просьба не предлагать сменить среду на другую, нужна именно эта.  :)


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: EvilMax от Сентябрь 11, 2008, 04:01:46
Извини, друг, но ответ на твой вопрос "потому что надо сменить среду, так как в этой версии обработка исключений не реализована" :D


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: Магнетон Бора от Сентябрь 11, 2008, 04:08:31
Извини, друг, но ответ на твой вопрос "потому что надо сменить среду, так как в этой версии обработка исключений не реализована"

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


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: naxellar от Сентябрь 11, 2008, 04:16:59
Магнетон Бора, а какой интерфейс и графики в прогой под DOS, и плюс на висте незапашет.


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: EvilMax от Сентябрь 11, 2008, 04:18:34
Извини, друг, но ответ на твой вопрос "потому что надо сменить среду, так как в этой версии обработка исключений не реализована"

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

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


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: Магнетон Бора от Сентябрь 11, 2008, 04:23:55
Магнетон Бора, а какой интерфейс и графики в прогой под DOS, и плюс на висте незапашет.

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

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


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

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


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: EvilMax от Сентябрь 11, 2008, 04:31:24
Увы. Или забить на графику BGI и пользоваться примитивными функциями рисования WinAPI (рисовать линии, выводить шрифт, делать заливку). BGI была дана чтобы освоить принципы. Если освоил, то разберешься и с рисованием примитивов в других библиотеках.

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


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: Alder от Сентябрь 11, 2008, 04:34:22
artri, кстати да. Я тоже так делал в свое время :) Ничего там сложного нету. Выложи им примерчик.


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: artri от Сентябрь 11, 2008, 04:37:53
artri, только чтобы это заработало минимум в хрюнделе и он смог защитить при сдаче ;) ИМХО, рано ему до подходов с модификацией Instruction Pointer.

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


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: Магнетон Бора от Сентябрь 11, 2008, 04:41:52
EvilMax, спасибо за совет, буду юзать карсовой без генерации исключений. :-)
(Отправлено в: Сентябрь 11, 2008, 04:39:59 )
 artri, чисто ради спортивного интереса покажи этот примерчик, и объясни по-подробнее )))


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: Артем от Сентябрь 11, 2008, 04:42:22
artri, если не сложно выложи пожалуйста примерчик. ИУС-07, и я в том числе, будем тебе благодарны :)


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: artri от Сентябрь 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 возможно надо будет инлайн коды переписать, т.к. насколько я помню там как-то хитро состояние регистров из стека извлекается


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: Alder от Сентябрь 11, 2008, 05:21:26
artri, слегка подправил пост - русские сообщения видны теперь. Да, я тоже так делал :) По-моему достаточно простой для понимания способ.


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: artri от Сентябрь 11, 2008, 05:26:02
artri, слегка подправил пост - русские сообщения видны теперь. Да, я тоже так делал :) По-моему достаточно простой для понимания способ.

Ага, особенно inline инструкции  :D


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: Артем от Сентябрь 11, 2008, 05:52:02
artri, спс за код, буду разбирать.


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: zer_owlet от Сентябрь 11, 2008, 10:22:55
кстати, по поводу "рано" -- Мокрый это давал на 1-м курсе..... и в паскале его пример работал на ура... знаю, потому что делал на 5-м курсе курсовой для какого-то 1-курсника и там надо было ))


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: EvilMax от Сентябрь 11, 2008, 11:18:35
кстати, по поводу "рано" -- Мокрый это давал на 1-м курсе..... и в паскале его пример работал на ура... знаю, потому что делал на 5-м курсе курсовой для какого-то 1-курсника и там надо было ))
Хм. Наверное, я перваков недогружаю :D Сделаю выводы. Поставим цель, чтобы "средний студент" не только там дизайнил ОО-софт, но и мог наваять по-шурику обработку исключительных ситуаций с инлайн-кодом ;)


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: FazU от Сентябрь 11, 2008, 11:29:45
я перваков недогружаю Смеющийся
все перваки идите в деканат! вам пора.... :D


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: zer_owlet от Сентябрь 12, 2008, 04:24:36
кстати, по поводу "рано" -- Мокрый это давал на 1-м курсе..... и в паскале его пример работал на ура... знаю, потому что делал на 5-м курсе курсовой для какого-то 1-курсника и там надо было ))
Хм. Наверное, я перваков недогружаю :D Сделаю выводы. Поставим цель, чтобы "средний студент" не только там дизайнил ОО-софт, но и мог наваять по-шурику обработку исключительных ситуаций с инлайн-кодом ;)

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


Название: Re: Обработка исключительных ситуаций в языки С++
Отправлено: Магнетон Бора от Сентябрь 13, 2008, 09:04:48
Жаль, конечно, что это пример реализован на Паскале, но все-равно не понятно некоторые вещи... И не думаю, ИМХО что стоит сейчас мучится с юзаньем инлайн функций, уж лучше плотнее подойти к глубокому изучению метода решения поставленной задачи. :-)