C++中的带有指针数组的结构体在C#上怎么封装,并作为形参传给C++dll的函数

#pragma pack(1)
struct SqJpegScliceSize
{
unsigned int scliceSize[64];

unsigned char *jpegDst[64];
};
extern "C" _declspec(dllexport) void SqGetSliceData(SqJpegScliceSize *jss)
这是C++函数和结构体
在C#上怎么写?

6个回答

 public struct SqJpegScliceSize
 {
     public uint[] scliceSize;
     public IntPtr[] jpegDst;
}
[DllImport("xxxxx.dll",ExactSpelling =false,EntryPoint = "SqGetSliceData",CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static void SqGetSliceData(out SqJpegScliceSize jss);

//初始化结构体
SqJpegScliceSize jss=new SqJpegScliceSize();
jss.scliceSize=new uint[64];
jss.jpegDst=new IntPtr[64];

//调用函数
SqGetSliceData(out jss);

unsigned char *jpegDst[64];不知道你这个意图是什么,是仅仅用来接收64个指针,还是获取64个字符串。如果是64个字符串,则需要定义64个byte类型的数组,然后获取它们的指针放到IntPtr类型的数组中。这需要用到不安全代码。

 byte[][] strs=new byte[64][];
 for(int i=0;i<64;i++)
 { 
     strs[i]=new byte[1024];
     unsafe
     {
            fixed(byte *p=strs[i])
            {
                jpegDst[i]=(IntPtr)p;
            }
     }
 }
qq_14987897
qq_14987897 刚刚试了下,但是在C++那边不能将个64个指针地址传给jss.jpegDst 0x000007FEE8D156AA (SqJpegDll.dll)处(位于 ImageViewer.exe 中)引发的异常: 0xC0000005: 写入位置 0x00000000263AE728 时发生访问冲突。
2 年多之前 回复

不是不能传递64个地址,而是传递的地址都是没有分配空间的,无法进行读写操作。你这64个指针到底指向64个char类型的变量,还是指向64个char类型的数组?不管是变量,还是数组,在传递参数之前都要分配空间。如果指向64个char类型的数组,你需要知道数组的长度是多少,并为其分配相应空间,然后使用不安全代码分别获取它们的首地址,并保存到IntPtr[]类型的数组中。另外,你还需要设置一下结构体的布局,使字节对齐为1.

设置字节对齐

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential,Pack =1)]
  public struct SqJpegScliceSize
 {
     public uint[] scliceSize;
     public IntPtr[] jpegDst;
}

[StructLayout(LayoutKind.Sequential,Pack =1)]

qq_14987897
qq_14987897 可以了。。。谢谢你,兄弟。。
2 年多之前 回复

你确定可以了?我觉得我昨天给的代码有问题。。。。。

 using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential,Pack =1)]
 unsafe public struct SqJpegScliceSize
 {
     public fixed uint scliceSize[64];
     public fixed uint jpegDst[64];//指针是unit类型的
}
qq_14987897
qq_14987897 我用另外另外一种方法实现了。。起码你给我灵感了。。。我直接将它转为Intptr来处理了。。。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

C++中的带有指针数组的结构体在C#上怎么封装,并作为形参传给C++dll的函数

#pragma pack(1) struct SqJpegScliceSize { unsigned int scliceSize[64]; unsigned char *jpegDst[64]; }; extern "C" _declspec(dllexport) void SqGetSliceData(SqJpegScliceSize *jss) 这是C++函数和结构体 在C#上怎么写?

c语言结构体中指针数组怎样赋值

定义一个结构体 struct AS { char *p[1]; }; 怎样用gets函数给指针数组赋值呢?

C#调用纯C的DLL时,结构体指针、数组、二维数组 怎么转换?

用纯C写的 迪杰斯特拉算法,封装成DLL后,用C#调用。C的结构体: ``` typedef struct _graph { int Vertex[VEXNUM]; //顶点信息 int AdjMatrix[VEXNUM][VEXNUM]; //邻接矩阵 int vexnum; //顶点数 int arcnum; //弧数 }*MyGraph; void CreatGraph(MyGraph g){} ``` 那么在C#中怎么调用呢? (数组、二维数组、结构体指针)

C++结构体中包含指针的结构体数组的排序怎么做?

C++结构体中包含指针的结构体数组的排序怎么做?关于这方面的主要问题是什么?怎么使得排序结果稳定?

关于结构体指针与结构体数组

目前开发遇到一个问题,有一个动态库dll,需要传进去一个结构体数组,函数为 opt_api_init(InfoInitMarket* InitMarketInfo); 这个是结构体 typedef struct tagInfoInitMarket { char commID[COMMODITY_ID + 1]; //合约编码 char classID[CLASS_ID + 1]; //品种代码 char instrumentType; //合约类型:期货:F,看涨期权:C,看跌期权:P double tick; //最小变动价位 long lastTradeDate; } 然后我要在数据库里查询到这些数据,传入结构体数组,数组数目不确定,再调用那个函数。请问我应该怎么来实现。我是这样写的 tagInfoInitMarket *m_pInfoinit; while(pdb->more()) //遍历查询出来的数据 { m_pInfoinit = new struct tagInfoInitMarket; memset(m_pInfoinit,0,sizeof(m_pInfoinit)); strcpy(m_pInfoinit->commID,pDB->Get("QQDM").c_str(),sizeof(m_pInfoinit->commID)); strcpy(m_pInfoinit->classID,pDB->Get("DMQZ").c_str(),sizeof(m_pInfoinit->classID)); } 这样写对吗?那我要怎么样遍历结构体数组啊?或者有没有其他办法,拜托各位大神了!

C语言的函数,指针,数组,结构体

如何才能学好C语言中的函数,指针,数组,结构体,并且能够灵活快速的编写程序。

结构体数组指针可以直接赋值给结构体指针吗?

有一个结构体比如为 struct A { struct *B; struct *C; }; struct B { int id; int pin; }; struct C { int a; int b; }; 定义初始化struct B和struct C: struct B b__arry[2] = {{12, 34}, {56, 78}}; struct C c__arry[2] = {{12, 34}, {56, 78}}; 问题: 1. 能否这样初始化struct A? struct A a = {b_arry, c_arry}; struct A里的成员是结构体指针而b_arry和c_arry是结构体数组的地址。 2. 结构体经过以下传递会不会造成数据的混乱? 比如有一个函数void func (void *arg); 往函数里面传参,如func (&a); (a按照问题1里进行了初始化); 在函数里,是这样对参数进行转换的: void func (void *arg) { struct A *p = (struct A *)arg; } 问题是用p取出里面的数据时发现都错了,但是在func函数外面取出数据都是正确的,我猜想是否因为void *arg的arg保存的是一个单纯的地址,并没有结构信息,所以当对它进行转换的时候它并不能识别里面有数组信息。

关于c语言结构体指针数组的问题

我有一个数组,里面每个成员都是结构体指针,我应该怎么给这个数组分配空间?

结构体指针数组指向结构体类型数组的问题

``` #include<stdio.h> #include<stdlib.h> struct student { char num; char name[10]; int grade; }; void swap(struct student *p[],int n) { int k,m,i,j; struct student *d; k=0;m=n-1; while(k<m) { j=m-1;m=0; for(i=k;i<=j;i++) if(((*p[i]).grade)>((*p[i+1]).grade)) {d=p[i];p[i]=p[i+1];p[i+1]=d;m=i;} j=k+1;k=0; for(i=m;i>=j;i--) if(((*p[i-1]).grade)>((*p[i]).grade)) {d=p[i];p[i]=p[i-1];p[i-1]=d;k=i;} } return; } main() { int i; struct student *q[13]; struct student h[13]= { {2,"Lin",92}, {3,"Zhang",87}, {4,"Zhao",72}, {5,"Ma",91}, {9,"Zhen",85}, {11,"Wang",100}, {12,"Li",86}, {13,"Xu",83}, {16,"Mao",78}, {17,"Hao",95}, {20,"Lu",82}, {21,"Song",76}, {22,"Wu",88} }; for(i=0;i<13;i++) ** *q[i]=h[i];** printf("学号(num) 姓名(name) 成绩(grade)\n"); for(i=0;i<13;i++) printf(" %02d %s %d\n",h[i].num,h[i].name,h[i].grade); printf("------------------------------\n"); swap(q,13); for(i=0;i<13;i++) printf(" %02d %s %d\n",(*q[i]).num,(*q[i]).name,(*q[i]).grade); } ``` 0x00BB16B0 处有未经处理的异常: 0xC0000005: 写入位置 0xCCCCCCCC 时发生访问冲突。(代码中加粗的行: *q[i]=h[i];),这是为什么呢?

C# 嵌套结构体 和byte 数组互相转换?

现在需要udp 发送一个结构体数据 结构体类型大概如下 struct A { int a; } struct B { int b; } struct C { A a; B b; } 现在要发送 结构体C类型的数据, 请问各位大神,怎样将此类结构体转换为byte数组!

初学者问一个关于c中二级指针与结构体的问题

#include<stdio.h> #include<stdlib.h> typedef struct node{ int num; char ch; }NODE; int main(void){ int n,i; NODE **F; printf("input n:"); scanf("%d",&n); F=(NODE**)malloc(n*sizeof(NODE*)); printf("input num and ch:"); for(i=0;i<n;++i){ F[i]=(NODE*)malloc(sizeof(NODE)); scanf("%c",&F[i]->num);//fflash(stdin); scanf("%d",&F[i]->ch);//fflash(stdin); }printf("输入结束\n"); for(i=0;i<n;++i){ printf("%d",F[i]->num); printf("%c",F[i]->ch); }printf("输结束\n"); for(i=0;i<n;++i) free(F[i]); free(F); }就是想使F成为指向结构体的指针数组,然后通过F对个元素赋值,并输出 输出结果: input n:3 input num and ch: 1 a 2 b 3 c 输入结束 -842150646.-842150624?842150559.输结束 Press any key to continue 输出结果是怎么回事呢?

C++嵌套结构体带数组 转C#

下面的c++代码怎么转为C#代码呢,求大神指点 C++代码: struct can_frame { uint32 can_id; uchar can_dlc; uchar __pad; uchar __res0; uchar __res1; uchar data[8]; }; typedef struct tagZCAN_Transmit_Data { can_frame frame; UINT transmit_type; }ZCAN_Transmit_Data; int main() { ZCAN_Transmit_Data can_data; can_data.frame.can_id =1 can_data.frame.can_dlc =8 can_data.transmit_type = 0_; result = ZCAN_Transmit(channel_handle_, &can_data, 1); }

C语言中结构体中的数组,不能直接赋值吗

设有定义:struct{char mark[12];intnum1;double num2;}t1,t2;若变量均已正确赋初值,则以下语句中错误的是(C) (A) t1=t2; (B) t2.num1=t1.num1; (C) t2.mark=t1.mark;//mark为结构体中的数组,不能直接赋值?? (D) t2.num2=t1.num2; ​====如题参考答案说为结构体中的数组,不能直接赋值,为什么呢?那应该怎么赋值呢?求大侠指教

malloc怎么返回结构体指针数组的首地址

typedef struct student{ int id; }s ,*sp; main(){ sp p1=(sp)malloc(10*sizeof(sp)); // 假设1 sp * p2=(sp *)malloc(10*sizeof(sp)); // 假设2 } 如果我要malloc一个长度为10 的结构体指针数组的话 假设1 和假设2 哪个返回了结构体指针数组的首地址? 哪个正确呢

C语言 socket 如何发送带指针的结构体?

发送一个带指针的结构体,我知道怎么发送? 先把结构体转换成字符串,然后发出。 但是接收的时候,怎么接收到结构体中?thanks!

C语言 如何将两个结构体数组中的每一个单元对应交换?

如何将两个结构体数组中的每一个单元对应交换? 如何将两个结构体数组中的每一个单元对应交换?如何将两个结构体数组中的每一个单元对应交换?如何将两个结构体数组中的每一个单元对应交换?

C语言结构体中数组的问题

我在创建结构体的时候出错了,能帮我看看是怎么回事吗?![********图片说明](https://img-ask.csdn.net/upload/201508/27/1440677116_238807.jpg)![图片说明](https://img-ask.csdn.net/upload/201508/27/1440678736_587671.jpg)

函数指针和数组指针的区别,函数指针在结构体中怎么实现排序?

求咨询下,结构体浮点数组的排序,多重条件用函数指针传参数给库函数怎么实现排序呢?

在C语言中,要引用结构体数组成员时,究竟应该用箭头还是点?

我是C语言的初学者,在学习结构体的时候发现了一个和书籍和网上资料不符的地方。根据我在网上找到的资料,点(.)是用于结构体变量访问成员,箭头(->)是用于结构体指针访问成员。 在调用结构体TS中的Num变量时,因为我并未使用指针变量,理论上应该是“TS.Num”,但是在编译的过程中,编译器会自动将其转化为“TS->Num”,而且转化后能顺利识别运行,而如果强行将其改成点则会出现无法编译的问题。我想确认这种差异究竟是因为编译环境的影响,还是因为我忽略了什么因素? 下面是我测试用的代码,我使用的系统是64位Windows7,使用的编译器是Visual Studio 2019。 ``` #include<stdio.h> #include<math.h> #include"Mine.h" struct Data { int Num; char Name[20]; char Sex; }; int main(void) { int i; struct Data test; struct Data TS[10]; test.Num = 10; TS->Num = 20; printf("%d,%d\n", test.Num, TS->Num); } ```

C语言,结构体数组的引用问题

struct { char name[20]; int count; }man[]={ {"aaa",0}, {"bbb",0}, {"ccc",0} },human[10]; int main() { int i,j; for (i=0;i<=2;i++) { printf("第%d位投票,请输入候选人的名字:",i+1); scanf("%s",&human[i].name); for(j=0;j<=2;j++) { if("aaa"==human[i].name) { man[0].count+=1; } } } for(i=0;i<=2;i++) { printf("%s票数为:%d\n",man[i].name,man[i].count); } } ``` ``` 为什么man[0].count的值没有自增?

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

相关热词 c# 局部 截图 页面 c#实现简单的文件管理器 c# where c# 取文件夹路径 c# 对比 当天 c# fir 滤波器 c# 和站 队列 c# txt 去空格 c#移除其他类事件 c# 自动截屏
立即提问