Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.59
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
#1

СИ++ и контроль переполнения - C++

10.11.2011, 13:03. Просмотров 2997. Ответов 20
Метки нет (Все метки)

Можно ли как-нибудь в VS включить контроль переполнения при математических вычислениях? Чтоб, например, возникало исключение. Или это можно сделать только средствами ассемблера путём контроля флагов?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2011, 13:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос СИ++ и контроль переполнения (C++):

Флаг переполнения - C++
Доброго времени суток! Подскажите, как проверить какую-либо определенную переменную типа double на переполнение (значениe -1.#IND00,...

Защита от переполнения - C++
Ребят помоги создать защиту от переполнения через функцию scanf_s и убрать нолики в конечном ответе, вот код: #include <stdio.h> ...

Переполнения безопастны? - C++
Насколько безопасна строчка: for(unsigned int b(UINT_MAX); ++b != UINT_MAX;) или такое нужно писать только так: unsigned int b(0);...

Как отловить переполнения? - C++
Есть проект dll, в в нём экспортируемая функция, возвращающая BOOL, требуется при переполнении любой вещественной операции в теле этой...

Ошибка переполнения буфера - C++
При первом запуске програма работает, после второго появляеться ошибка переполнения буфера. В чем дело?#include <iostream> #include...

Проверка переполнения double - C++
Добрый день! Подскажите пожалуйста, где можно почитать теорию. Нужно решить задачу, написать функции на С++, которые бы проверяли ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 13:03 #16
-=ЮрА=-, если вы внимательно посмотрите код обёртки, то увидите, что я не включал туда никакого контроля. Реально внутри обёртки должен быть код, подобный вашему (лучше, конечно, ассемблерный вариант). А использование её в программе сведётся как раз к выражениям вида

C++
1
double_v dub = a + 15 * sqrt(b) + c;
Весь этот код проверки будет внутри обёртки и код вычислений станет читабельным. В вашем варианте всё это дело придётся писать перед каждой операцией, причём составные выражения вроде того, которое я привёл выше, будет невозможно сделать.
0
-=ЮрА=-
11.11.2011, 13:25
  #17

Не по теме:

Цитата Сообщение от talis Посмотреть сообщение
сли вы внимательно посмотрите код обёртки, то увидите, что я не включал туда никакого контроля
- я поэтому и писал.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
возможно вы именно как обворачивать без обработки исключений представить хотели
, Замечание сделал на случай вдруг ТС ещё не имеет достаточного багажа знаний и напрямую попытается использовать ваш код, это не претензия к вам былаНа счёт остального соглашусь, я делал под начинающего, у вас как должно быть в программе уже набившего руку программиста

1
LosAngeles
Заблокирован
11.11.2011, 14:30 #18
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
    OVERFLOW_ASSERT(label) macro
        throw exception if OF == 1 || CF == 1
    params:
        label - name of label for compiler, so avoid of using the same name twice!
    return:
        code for MSVC or code for g++
*/
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
    #define OVERFLOW_ASSERT(label) \
    __asm { JNO label }; \
    __asm { JNC label }; \
    throw std::overflow_error("This is SPARTAAAA!"); \
label:
#elif defined(__GNUG__)
    #define OVERFLOW_ASSERT(label) \
    __asm__ ("JNO label" \
            "JNC label"); \
    throw std::overflow_error("This is SPARTAAAA!"); \
    __asm__ ("label:");
#endif
 
 
 
template< typename _Tp >
struct var
{
    _Tp data;
 
    var( const _Tp d ) : data(d) {};
 
    var<_Tp> & operator+=( const var<_Tp> d )
    {
        data += d.data;
        OVERFLOW_ASSERT(addition)
        return *this;
    }
 
    var<_Tp> & operator*=( const var<_Tp> d )
    {
        
        data *= d.data;
        OVERFLOW_ASSERT(multiplication)
        return *this;
    }
 
    _Tp & operator*()
    {
        return data;
    }
 
    operator _Tp()
    {
        return data;
    }
};
Добавлено через 9 минут
talis, кстати говоря в чём смысл 44 строки в твоём листинге? там же built-in оператор используется, и как бы нельзя проверить переполнение, а то я уже было обрадовался
1
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 14:41 #19
LosAngeles, да, спасибо. Должно быть так:

C++
1
a = int_v(12) + 8;
0
Evg
Эксперт CАвтор FAQ
17821 / 6031 / 388
Регистрация: 30.03.2009
Сообщений: 16,563
Записей в блоге: 26
11.11.2011, 15:01 #20
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Можно ли как-нибудь в VS включить контроль переполнения при математических вычислениях? Чтоб, например, возникало исключение. Или это можно сделать только средствами ассемблера путём контроля флагов?
О каких переполнениях идёт речь?

Если речь идёт о целочисленных переполнениях, то в современных процессорах вроде бы нет возможности сделать так, чтобы возникало прерывание при переполнении. Возможно только пощупать соответствующие целочисленные флаги непосредственно после выполнения операции, а потому нужно весь кусок (который вычисляет операцию и вызывает прерывание) полностью писать на ассемблере

Если же речь идёт о плавающих вычислениях, то оно как правило процессорами поддерживается, потому что прерывания требуются по стандарту ieee-754. Для этого есть стандартные функции типа http://linux.die.net/man/3/feenableexcept но они, насколько я знаю, входят в стандарт Си99
4
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
18.11.2011, 13:51  [ТС] #21
Цитата Сообщение от Evg Посмотреть сообщение
О каких переполнениях идёт речь?
Ну пока только о целочисленных. Посмотрев варианты, я всё-таки решил, что самое эффективное - ассемблерная вставка.
Цитата Сообщение от Evg Посмотреть сообщение
Если речь идёт о целочисленных переполнениях, то в современных процессорах вроде бы нет возможности сделать так, чтобы возникало прерывание при переполнении. Возможно только пощупать соответствующие целочисленные флаги непосредственно после выполнения операции, а потому нужно весь кусок (который вычисляет операцию и вызывает прерывание) полностью писать на ассемблере
А прерывыания в принципе не нужны, достаточно просто установки в true некоторого внешнего флага при переполнении.

Добавлено через 6 минут
Просто я думал может где в настройках компилятора есть контроль переполнения, так было бы проще.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2011, 13:51
Привет! Вот еще темы с ответами:

Ошибка переполнения массива - C++
Здравствуйте. Задача легкая,нужно создать массив из 1000000 элементов,и найти 1000001,и вывести сообщение что не найден такой элемент. Но...

Избавиться от переполнения буфера (asm) - C++
Всем привет, на вашем форуме первый раз) Имея базовые знания по C++ и Assembler решил сварганить такую штуку: // test.cpp: определяет...

Отлов исключения переполнения буфера - C++
Вот код #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;locale.h&gt; #include &lt;exception&gt; using namespace std; ...

39+ (-39) будет ли установлен флаг переполнения? - C++
Если выполнить в ячейке 1 байт двоичное сложение чисел 39 и -39 то это приведет к появлению единицы в 9-м разряде за пределом байта, а в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.11.2011, 13:51
Ответ Создать тему
Опции темы

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