Wstawka do c#

0

Mam zrobione 2 programy, jeden w c# (kompletny z okienkiem z obliczeniami c#), drugi w c++ ze wstawkami z asm (obliczenia w asm). Ten w c++ działa bez problemu natomiast nie wiem jak wstawić te wstawki asm do kodu c# tak aby to działało. Byłbym bardzo wdzięczny gdyby ktoś mi z tym pomógł.

c#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public string a;
        public string b;
        public string c;
        public double p;
        public double q;
       
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            string a = this.textBox1.Text;
          
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            string b = this.textBox1.Text;
        }
        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            string c = this.textBox1.Text;
        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            string d =( this.textBox1.Text + " x^2 + " + this.textBox2.Text +" x + "+ this.textBox3.Text);
            
            textBox4.Text = d;
            int a = Convert.ToInt32(textBox1.Text); //konwertuje z string(textbox) na int do oblicznien
            int b = Convert.ToInt32(textBox2.Text);
            int c = Convert.ToInt32(textBox3.Text);
            
            double delta = ((b * b) - (4 * a * c));
            double p = (-1*((-1 * b)) / (2 * a));
            double q = (-1 * (delta / (4 * a)));
            if (a == 0) //sprawdza czy jest x^2
                {
                    textBox5.Text = ("rownanie liniowe");
                }
                else if (delta > 0)
                {

                    double x1 = (((-1 * b) - Math.Sqrt(delta)) / (2 * a));//x1
                    double x2 = (((-1 * b) + Math.Sqrt(delta)) / (2 * a));//x2
  
                    string y1 = Convert.ToString(x1);//konvertuje na string do textboxa
                    string y2 = Convert.ToString(x2);
                    string f = Convert.ToString(delta);
                    textBox5.Text = ("delta = " + f + "   x1 = " + y1 + "   x2 = " + y2);//wyswietla w textbox

                }
                else if(delta == 0){
                    double x1 = (((-1 * b) ) / (2 * a));
                    string y1 = Convert.ToString(x1);
                    string f = Convert.ToString(delta);
                    textBox5.Text = ("delta = " + f + "   x1 = " +y1);

                }
            
                else
                {
                    textBox5.Text = ("brak rozwiazan w R");
                }
                   
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void c_Click(object sender, EventArgs e)
        {

        }

        private void textBox4_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox5_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

c++

double del(double a, double b, double c, double delta, double s) {
	_asm
	{
		finit // inicjalizacja i reset koprocesora
		fld b //załadowanie zmiennej b na stos
		fmul b //pomnożenie b*b
		fld a //załadowanie zmiennej a na stos
		fld c //załadowanie zmiennej c na stos
		fmul st, st(1) //pomnożenie a ze szczytem stosu czyli c
		fld s //załadowanie stałej s czyli 4 na szczyt stosu
		fmul st, st(1) //pomnożenie stałej s czyli 4 ze starym szczytem stosu czyli a*c
		fsub st(3), st //odjęcie b*b od 4*a*c
		fxch st(3) //zamiana obliczonej delty ze szczytem stosu
		fstp delta //zdjęcie wyniku ze stosu i zapisanie go do zmiennej delta
		
		

	}
	return delta;

}
double pierwiastek(double delta)
{
	double pierw = 0;
	_asm
	{
		finit //inicjalizacja i reset koprocesora
		fld delta //załadowanie delty na stos
		fsqrt //obliczenie pierwiastka delty
		fstp pierw //zdjęcie obliczonego pierwiastka i zapisanie go do zmiennej pierw
	}
	return pierw;
}
double zero(double b, double a, double x0)
{
	
	double m = 2;
	double l = -1;
	_asm
	{
			finit //inicjalizacja i reset koprocesora
			fld b //załadowanie zmiennej b na stos
			fmul l //pomnożenie b*(-1)
			fstp x0 //zdjęcie wyniki u zapisanie go do zmiennej x0
			fld a //załadowanie zmiennej a
			fmul m //pomnożenie 2*a
			fld x0 //załadowanie x0 na stos
			fdiv st, st(1) //podzielenie -b/2*a
			fstp x0 //zdjęcie wyniku i zapiasnie go do zmiennej x0
	}
	return x0;
}
double jeden( double b, double a, double pierw)
{
	double l = -1;
	double m = 2;
	double x1 = 0;
	
	_asm {
		finit //inicjalizacja i reset koprocesora
		fld b //załadowanie zmiennej b na stos
		fmul l //pomnożenie b*(-1)
		fld pierw // załadowanie zmiennej pierw (pierwiastek z delty) na stos
		fsub st(1), st //odjęcie -b-pierw
		fstp x1 //zdjęcie wyniku i zapisanie go do zmiennej x1
		fld a //załadowanie zmiennej a
		fmul m //pomnożenie 2*a
		fld x1 //załadowanie x1 na stos
		fdiv st, st(1) //podzielenie -b-pierw/2*a
		fstp x1 //zdjęcie wyniku i zapiasnie go do zmiennej x1
	}
	return x1;
}
double dwa( double b, double a, double pierw)
{
	double l = -1;
	double m = 2;
	double x2 = 0;
	_asm {
		finit //inicjalizacja i reset koprocesora
		fld b //załadowanie zmiennej b na stos
		fmul l //pomnożenie b*(-1)
		fld pierw // załadowanie zmiennej pierw (pierwiastek z delty) na stos
		fadd st(1), st //odjęcie -b-pierw
		fstp x2 //zdjęcie wyniku i zapisanie go do zmiennej x2
		fld a //załadowanie zmiennej a
		fmul m //pomnożenie 2*a
		fld x2 //załadowanie x1 na stos
		fdiv st, st(1) //podzielenie -b+pierw/2*a
		fstp x2 //zdjęcie wyniku i zapiasnie go do zmiennej x2
	}
	return x2;
}
using namespace std;
int main()
{

	double a, b, c, delta = 0, s = 4, d = 2, x = 0, x1 = 0, x2 = 0, x0 = 0, pierw = 0;
	cout << "podaj a: ", cin >> a;
	cout << "podaj b: ", cin >> b;
	cout << "podaj c: ", cin >> c;
	delta = del(a, b, c, delta, s);
	cout << "Delta wynosi: " << delta << endl;
	pierw = pierwiastek(delta);
	cout << "Pierw wynosi: " << pierw << endl;
	if (delta < 0) cout << "Delta jest rowna 0, brak rozwiązań" << endl;
	else if (delta == 0) cout << "Delta rowna 0, x0 wynosi: " << zero(b, a, x0) << endl;
	else
	{
		x1 = jeden (b, a, pierw);
		cout << "Delta wieksza niz 0, dwa rozwiazania x1: " << x1 << endl;
		x2 = dwa( b, a, pierw);
		cout << "x2: " << x2 << endl;
	}
	system("pause");

}
0

Nie zrobisz „wstawek” w C#.
Możesz wyeksportować funkcje asemblerowe z DLL (poszukaj jak zrobić DLL-kę) i załadować ją w C# (poszukaj jak użyć natywnej DLL-ki w C#).

0

I od razu sprawdź pod kątem zgodności CLS
CLSCompliantAttribute

1 użytkowników online, w tym zalogowanych: 0, gości: 1