c#怎么定义结构体中的二维数组

时间:2022-08-30 19:43:36
我在c++中定义了一个这样的结构
typedef struct Field55
{
char ctag[100][5];
int iLen[100];
char cValue[100][512];
}ICINFOTEMP;
然后再c#中这样定义
public struct ICINFO 
    {
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100*5)]
        public string [] tag;
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100)]
        public int [] Len;
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 100 * 512)]
        public string [] Value;
    }
编译时报错“内部限制:结构太复杂或太大”。请问大大,该如何修改?

10 个解决方案

#1


SizeConst 把这个值改小点


http://apps.hi.baidu.com/share/detail/34088407

#2


不会C++ ,路过。

#3


楼主,你这样声明肯定是不对的,那是一维数组的方式,
“[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100*5)]
  public string [] tag;”
这个声明的意思:500个string数组,但每个string是多大,编译器完全不知!这就违背的互操作的初衷:它必须知道具体的结构体大小!

#4


并不是非托管调用的char都用string代替,仅当以空零结束的in类型字符串采用string的。

你这个用byte二维数组就可以了。传参之前分配即可。

#5


引用 4 楼 isjoe 的回复:
并不是非托管调用的char都用string代替,仅当以空零结束的in类型字符串采用string的。

你这个用byte二维数组就可以了。传参之前分配即可。


能具体给出定义和初始化的代码么?

#6


封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:

  将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:

1、定义子结构体:

    [StructLayout(LayoutKind.Sequential)]
    public struct str
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
        public string name;
    }


2、外层结构体:对于C++:
   [StructLayout(LayoutKind.Sequential)]
    public struct ICINFO  
    {
        ............
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]  //注意:这里对应一维数组        public str[] name;
    }

#7


封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:

  将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:

1、定义子结构体:

  [StructLayout(LayoutKind.Sequential)]
  public struct str
  {
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
  public string name;
  }


2、外层结构体:对于C++:
  [StructLayout(LayoutKind.Sequential)]
  public struct ICINFO   
  {
  ............
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] [b ]//注意:这里对应一维数组[/b]    

   public str[] name;
  }

#8


引用 7 楼 sdl2005lyx 的回复:
封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:

  将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:

1、定义子结构体:

  [StructLayout(LayoutKind.Sequential)]
  public struct str
  {
  [Marsha……

麻烦你帮那3个变量都帮我弄好行么?我刚改了调试下,还是提示结构太复杂或太大。

#9


晕,我给把“char cValue[100][512];”都跟你写了,剩下就char ctag[100][5]; 做法都一样,

照样你也它高出来,你怎么还要我写!

有点气愤:你如果是我的手下,肯定被开除!希望你培养自己的良好习惯!

#10


引用 9 楼  的回复:
晕,我给把“char cValue[100][512];”都跟你写了,剩下就char ctag[100][5]; 做法都一样,

照样你也它高出来,你怎么还要我写!

有点气愤:你如果是我的手下,肯定被开除!希望你培养自己的良好习惯!


霸气

#1


SizeConst 把这个值改小点


http://apps.hi.baidu.com/share/detail/34088407

#2


不会C++ ,路过。

#3


楼主,你这样声明肯定是不对的,那是一维数组的方式,
“[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100*5)]
  public string [] tag;”
这个声明的意思:500个string数组,但每个string是多大,编译器完全不知!这就违背的互操作的初衷:它必须知道具体的结构体大小!

#4


并不是非托管调用的char都用string代替,仅当以空零结束的in类型字符串采用string的。

你这个用byte二维数组就可以了。传参之前分配即可。

#5


引用 4 楼 isjoe 的回复:
并不是非托管调用的char都用string代替,仅当以空零结束的in类型字符串采用string的。

你这个用byte二维数组就可以了。传参之前分配即可。


能具体给出定义和初始化的代码么?

#6


封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:

  将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:

1、定义子结构体:

    [StructLayout(LayoutKind.Sequential)]
    public struct str
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
        public string name;
    }


2、外层结构体:对于C++:
   [StructLayout(LayoutKind.Sequential)]
    public struct ICINFO  
    {
        ............
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]  //注意:这里对应一维数组        public str[] name;
    }

#7


封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:

  将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:

1、定义子结构体:

  [StructLayout(LayoutKind.Sequential)]
  public struct str
  {
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
  public string name;
  }


2、外层结构体:对于C++:
  [StructLayout(LayoutKind.Sequential)]
  public struct ICINFO   
  {
  ............
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] [b ]//注意:这里对应一维数组[/b]    

   public str[] name;
  }

#8


引用 7 楼 sdl2005lyx 的回复:
封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:

  将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:

1、定义子结构体:

  [StructLayout(LayoutKind.Sequential)]
  public struct str
  {
  [Marsha……

麻烦你帮那3个变量都帮我弄好行么?我刚改了调试下,还是提示结构太复杂或太大。

#9


晕,我给把“char cValue[100][512];”都跟你写了,剩下就char ctag[100][5]; 做法都一样,

照样你也它高出来,你怎么还要我写!

有点气愤:你如果是我的手下,肯定被开除!希望你培养自己的良好习惯!

#10


引用 9 楼  的回复:
晕,我给把“char cValue[100][512];”都跟你写了,剩下就char ctag[100][5]; 做法都一样,

照样你也它高出来,你怎么还要我写!

有点气愤:你如果是我的手下,肯定被开除!希望你培养自己的良好习惯!


霸气