gaerelva 2024-07-26 10:49 采纳率: 83.3%
浏览 2
已结题

c++ extern c实现代码如何写

c++代码 打包 dll 给 c#使用
这几个方法 如何实现
尤其带参数Ploy&的函数 如何在extern c里面定义和实现,要完整代码,谢谢

我的c++代码如下

#pragma once
#include  <iostream>
#include  <fstream>
#include  <cmath>
using namespace std;

/////////////////////////////////////////////
//提供C#代码使用
/////////////////////////////////////////////
extern "C" {
//下面代码可能不对
    __declspec(dllexport) void* poly_create(int nn, double *pp);
    __declspec(dllexport) void poly_poly_mul(void* ptr1,void* ptr2);
    __declspec(dllexport) void
}
public class  Poly
{
private: 
    int N;         //多项式次数
    double  *p;    //多项式系数存储空间首地址
public:
    Poly(int nn=0, double *pp=NULL)  //构造函数
    { 
        N = nn;  p=pp;
    }
    double poly_value(double);  //多项式求值
    void poly_mul(Poly&,Poly&);  //多项式相乘
    void poly_div(Poly&,Poly&,Poly&);   //多项式相除
};


/////////////////////////////////////////////
//多项式相乘 s = p*q
/////////////////////////////////////////////
void Poly::poly_mul(Poly& q, Poly& s)
{
    int i,j;
    for (i=0; i<=s.N; i++) s.p[i]=0.0;
    for (i=0; i<=N; i++)
        for (j=0; j<=q.N; j++)
            s.p[i+j]=s.p[i+j] + p[i]*q.p[j];
    return ;
}

/////////////////////////////////////////////
//多项式相除 s = p/q 余 r
/////////////////////////////////////////////
void Poly::poly_div(Poly& q, Poly& s, Poly& r)
{
    int i,j,mm,ll;
    for (i=0; i<=s.N; i++) s.p[i]=0.0;
    if (q.p[q.N]+1.0==1.0) return;
    ll=N;
    for (i=(s.N)+1; i>=1; i--)
    { 
        s.p[i-1]=p[ll]/(q.p[q.N]);
        mm=ll;
        for (j=1; j<=q.N; j++)
        { 
            p[mm-1]=p[mm-1]-s.p[i-1]*(q.p[(q.N)-j]);
            mm=mm-1;
        }
        ll=ll-1;
    }
    for (i=0; i<=r.N; i++) r.p[i]=p[i];      
    return;
}

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-07-26 10:51
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    好的,下面我将详细解答如何在C++中使用extern "C"实现代码打包成DLL供C#使用,特别是带有参数Poly&的函数。

    1. 分析问题

    用户需要在C++中定义和实现带有参数Poly&的函数,并通过extern "C"导出这些函数,以便在C#中使用。

    2. 解决方案

    为了在C++中导出函数并在C#中使用,我们需要完成以下步骤:

    1. 在C++中定义和实现带有参数Poly&的函数。
    2. 使用extern "C"__declspec(dllexport)导出这些函数。
    3. 在C#中使用DllImport属性导入这些函数。

    3. 详细步骤

    3.1 C++代码

    首先,我们需要修改C++代码,确保正确导出函数。

    #pragma once
    #include <iostream>
    #include <fstream>
    #include <cmath>
    using namespace std;
    
    // 定义Poly类
    class Poly {
    private:
        int N;         // 多项式次数
        double* p;     // 多项式系数存储空间首地址
    public:
        Poly(int nn = 0, double* pp = NULL) {
            N = nn;
            p = new double[nn + 1];
            if (pp) {
                for (int i = 0; i <= nn; i++) {
                    p[i] = pp[i];
                }
            }
        }
        ~Poly() {
            delete[] p;
        }
        double poly_value(double);  // 多项式求值
        void poly_mul(Poly&, Poly&);  // 多项式相乘
        void poly_div(Poly&, Poly&, Poly&);   // 多项式相除
    };
    
    // 多项式相乘 s = p * q
    void Poly::poly_mul(Poly& q, Poly& s) {
        int i, j;
        for (i = 0; i <= s.N; i++) s.p[i] = 0.0;
        for (i = 0; i <= N; i++)
            for (j = 0; j <= q.N; j++)
                s.p[i + j] = s.p[i + j] + p[i] * q.p[j];
        return;
    }
    
    // 多项式相除 s = p / q 余 r
    void Poly::poly_div(Poly& q, Poly& s, Poly& r) {
        int i, j, mm, ll;
        for (i = 0; i <= s.N; i++) s.p[i] = 0.0;
        if (q.p[q.N] + 1.0 == 1.0) return;
        ll = N;
        for (i = (s.N) + 1; i >= 1; i--) {
            s.p[i - 1] = p[ll] / (q.p[q.N]);
            mm = ll;
            for (j = 1; j <= q.N; j++) {
                p[mm - 1] = p[mm - 1] - s.p[i - 1] * (q.p[(q.N) - j]);
                mm = mm - 1;
            }
            ll = ll - 1;
        }
        for (i = 0; i <= r.N; i++) r.p[i] = p[i];
        return;
    }
    
    // 提供C#代码使用
    extern "C" {
        __declspec(dllexport) Poly* poly_create(int nn, double* pp) {
            return new Poly(nn, pp);
        }
    
        __declspec(dllexport) void poly_poly_mul(Poly* ptr1, Poly* ptr2, Poly* result) {
            ptr1->poly_mul(*ptr2, *result);
        }
    
        __declspec(dllexport) void poly_poly_div(Poly* ptr1, Poly* ptr2, Poly* result, Poly* remainder) {
            ptr1->poly_div(*ptr2, *result, *remainder);
        }
    
        __declspec(dllexport) void poly_delete(Poly* ptr) {
            delete ptr;
        }
    }
    

    3.2 C#代码

    在C#中,我们需要使用DllImport属性导入这些函数。

    using System;
    using System.Runtime.InteropServices;
    
    public class PolyWrapper {
        [DllImport("YourDllName.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr poly_create(int nn, double[] pp);
    
        [DllImport("YourDllName.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void poly_poly_mul(IntPtr ptr1, IntPtr ptr2, IntPtr result);
    
        [DllImport("YourDllName.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void poly_poly_div(IntPtr ptr1, IntPtr ptr2, IntPtr result, IntPtr remainder);
    
        [DllImport("YourDllName.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void poly_delete(IntPtr ptr);
    }
    
    public class Poly {
        private IntPtr handle;
    
        public Poly(int nn, double[] pp) {
            handle = PolyWrapper.poly_create(nn, pp);
        }
    
        ~Poly() {
            PolyWrapper.poly_delete(handle);
        }
    
        public void PolyMul(Poly other, Poly result) {
            PolyWrapper.poly_poly_mul(handle, other.handle, result.handle);
        }
    
        public void PolyDiv(Poly other, Poly result, Poly remainder) {
            PolyWrapper.poly_poly_div(handle, other.handle, result.handle, remainder.handle);
        }
    }
    

    4. 总结

    通过以上步骤,我们成功地在C++中定义和实现了带有参数Poly&的函数,并使用extern "C"__declspec(dllexport)导出这些函数。在C#中,我们使用DllImport属性导入这些函数,并通过封装类来管理这些函数的使用。这样,C#代码就可以调用C++ DLL中的函数了。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月3日
  • 已采纳回答 7月26日
  • 创建了问题 7月26日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。