Что нужно изменить, или возможно хукнуть (перехватить) для изменения правила деления? В моих задачах при делении числа на 0 должен получаться 0. Меня интересует именно изменение предписанного алгоритма
#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;
}
Спасибо большое за ответ. И все же так как ответов не было долгое время, придумал свое решение через фильтр исключений. Должно работать на все 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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть кнопка button_one и слот Paint_orb который по сигналу Clicked делает вот что :