Изменение правила деления на 0

180
09 июля 2018, 23:10

Что нужно изменить, или возможно хукнуть (перехватить) для изменения правила деления? В моих задачах при делении числа на 0 должен получаться 0. Меня интересует именно изменение предписанного алгоритма

Answer 1
#include <iostream>    
using namespace std;
class Int_type {
    int k;
public:
    Int_type(int i = 0) : k(i) {}
    Int_type& operator ++() { ++k; return *this; }
    Int_type operator ++(int) { Int_type t; ++(t.k); return t; }
    Int_type& operator =(const int& i) { k = i; return *this; }
    Int_type& operator /=(const int& i) { k = i ? k / i : 0; return *this;}
    operator  int() const { return k; }
};
inline Int_type operator /(const Int_type& n, const int& i)
{
    Int_type t = n;
    t /= i;
    return t;
}

Можете использовать обьекты класса вместо обьектов типа int и делить на ноль

int main()
{   
    Int_type i;
    i = 19;
    ++i;
    cout << i << endl << i/ 2 << endl << i - 2 <<endl << i * 2  << endl 
         << i/0;
    return 0;
}
Answer 2

Спасибо большое за ответ. И все же так как ответов не было долгое время, придумал свое решение через фильтр исключений. Должно работать на все int в 32-битном приложении. Здесь при вызове исключения фильтр проверяет вид операции и заменяет регистр с нулем на единицу. А дальше перепрыгивает на следующую инструкцию

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
    cout << "Exception code: 0x" << hex << (int)pExceptionInfo->ExceptionRecord->ExceptionCode << " Exception address: 0x" << (DWORD)pExceptionInfo->ContextRecord->Eip << endl;
    if ((int)pExceptionInfo->ExceptionRecord->ExceptionCode == 0xc0000094)
    {
        DWORD presentEIP = (DWORD)pExceptionInfo->ContextRecord->Eip;
        byte EIPvalue[2];
        EIPvalue[0] = *(byte*)presentEIP;
        EIPvalue[1] = *(byte*)(presentEIP + 0x1);
        if (EIPvalue[0] == 0xF7 && EIPvalue[1] == 0xF9)
        {
            pExceptionInfo->ContextRecord->Ecx = 1;
            cout << "Forced ECX to 1 [1]" << endl;
        }
        else if (EIPvalue[0] == 0xF7 && EIPvalue[1] == 0x7D)
        {
            _asm add DWORD PTR SS : [EBP - 8], 1;
            pExceptionInfo->ContextRecord->Eip += 3;
            cout << "Forced ECX to 1 [2]" << endl;
        }
        else return EXCEPTION_CONTINUE_SEARCH;
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    return EXCEPTION_CONTINUE_SEARCH;
}
int f(int x, int y, int
    z) {
    return 2 + x / (2 / (y - z));
}
int main()
{
    AddVectoredExceptionHandler(true, (PVECTORED_EXCEPTION_HANDLER)ExceptionFilter); // Registers our vectored exception handler which is going to catch the exceptions thrown.
    int res = f(2, 3, 3); //F7F9
    cout << "Result: " << dec << res << endl; 
    getchar();
    int zero = 1 * 0;//F77D F8
    int i;
    i = 1 + 5 / zero;
    cout << "Result: " << dec << i << endl;
    getchar();
    return 0;
}
READ ALSO
Ошибка C2679 бинарный &ldquo;&lt;&lt;&rdquo;: не найден

Ошибка C2679 бинарный “<<”: не найден

Изучаю C++ по книге, и при написании такого кода

207
Что выполняют данные участки кода?

Что выполняют данные участки кода?

Собственно сами участки кода:

194
Как передать кнопку в слот QT

Как передать кнопку в слот QT

У меня есть кнопка button_one и слот Paint_orb который по сигналу Clicked делает вот что :

151