Исключение System.Drawing.dll
Делаю калькулятор на Windovs Forms в VS 2010. Задача в том, чтобы сделать вычислительные команды на Ассемблере. Для этого использую математический сопроцессор. После нажатия на "=" появляется ответ, но если курсор убрать с кнопки, то приложение сразу крашится и вылетает с таким исключением:
"Необработанное исключение типа "System.Runtime.InteropServices.ExternalException" произошло в System.Drawing.dll Дополнительные сведения: В GDI+ возникла ошибка общего вида."
Скорее всего проблема в сопроцессоре, если делать без него, то все ок.
Код:
// Kursovaya.cpp: главный файл проекта.
#include "stdafx.h"
#include "Form1.h"
using namespace Kursovaya;
[STAThreadAttribute]
int main()
{
// Включение визуальных эффектов Windows XP до создания каких-либо элементов управления
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// Создание главного окна и его запуск
Application::Run(gcnew Form1());
}
Фрагмент кода, отвечающий за обработку нажатия на "="
private: System::Void button21_Click_1(System::Object^ sender, System::EventArgs^ e) {
double res;
b=System::Convert::ToDouble(textBox1->Text);
switch(actions){
case 1:
// res=one(a,b);
textBox1->Text = System::Convert::ToString(one(a,b));
textBox2->Clear();
break;
case 2:
//result = a - b;
textBox1->Text = System::Convert::ToString(two(a,b));
textBox2->Clear();
break;
case 3:
result = a * b;
textBox1->Text = System::Convert::ToString(result);
textBox2->Clear();
break;
case 4:
result = a / b;
textBox1->Text = System::Convert::ToString(result);
textBox2->Clear();
break;
default:
break;
}
}
Код Ассемблера P.S. Знаю, что в .h файле код нельзя писать, позже исправлю.
#include <math.h>
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h >
#ifndef ONE_H
#define ONE_H
double one(float a, float b) {
double result;
_asm{
FLD a
FLD b
FADD st(0), st(1)
FST result
}
return result;
}
#endif ONE_H
Ответы (1 шт):
Все оказалось намного проще, чем кажется, нужно просто освободить стек и добавить две строки кода
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include "StdAfx.h"
#include "one.h"
double one(double a, double b) {
double result;
_asm{
fld a
fld b
fadd st(0),st(1)
fst result
FFREE ST(0)
FFREE ST(1)
}
return result;
}