精华内容
下载资源
问答
  • C#结构体数组

    千次阅读 2020-06-11 09:36:25
    结构体数组的元素类型为结构体类型,一 维结构体数组的定义语法如下: 结构体类型名[] 结构体数组名=new 结构体类型名[数组 长度]; 结构体类型名[] 结构体数组名; 结构体数组名=new 结构体类型名[数组长度]; 例如,...

    1.结构体类型的数组

    当有多个同一结构体类型的结构体实例时,可以将它们组织 成一个结构体数组。结构体数组的元素类型为结构体类型,一 维结构体数组的定义语法如下:

    结构体类型名[] 结构体数组名=new 结构体类型名[数组 长度];

    结构体类型名[] 结构体数组名;
    结构体数组名=new 结构体类型名[数组长度];

    例如,定义包括100个点的结构体数组的代码如下:

    POINT[] p=new POINT[100];

    或

    POINT[] p=new POINT[100];
    POINT[] p; p=new POINT[100];

    只有所使用的结构体类型含有带参数的构造函数时,才能对 结构体数组进行初始化。

    struct POINT 
    {   
    	public double x;//横坐标   
    	public double y;//纵坐标   
    	public POINT(double a,double b)//带参数的构造函数   
    	{     
    		x=a;
    		y=b;   
    	} 
    }; 
    static void Main() 
    {   
    	POINT[] p = {new POINT(2.0,3.1), new POINT(2.5,3.8), new POINT(5.0,8.1)};//对结构体类型数组p进行初始化 
    }
    

    引用结构体数组成员时,需要将数组的下标运算符和成员引 用运算符结合起来使用。语法形式如下:

    //结构体数组名[下标表达式].成员名

    
    p[0].x=1.0;//p[0]是一个结构体类型实例 
    p[0].y=2.0; 
    

    2.数组作为结构体的成员

    实际上,结构体的成员可以是C#支持的任意数据类型。因 此,数组也可以作为结构体成员,并且该数组的元素类型可以 是C#支持的任意数据类型。

    struct RECTANGLE 
    {
       public POINT[] p; 
    } 
     
    RECTANGLE r; 
    r.p = new POINT[4]; 
    

    引用结构体的数组成员时,需要将下标运算符和成员引用运 算符结合起来使用,语法形式如下:

    例如: 结构体.数组成员名[下标表达式]

    r.p[0].x=0; 
    r.p[1].y = 2; 
    
    展开全文
  • 解决C#结构体数组间的转化问题的由来:在写C#TCP通信程序时,发送数据时,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把...
    解决C#结构体数组间的转化问题的由来:在写C#TCP通信程序时,发送数据时,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现:
    
    (1)解决C#结构体数组间的转化之定义结构体:
    
    //命名空间  
    using System.Runtime.InteropServices;  
     
    //注意这个属性不能少  
    [StructLayoutAttribute(  
    LayoutKind.Sequential,  
    CharSet=CharSet.Ansi,Pack=1)]  
    struct TestStruct  
    ...{  
    public int c;  
    //字符串,SizeConst为字符串的最大长度  
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]  
    public string str;  
    //int数组,SizeConst表示数组的个数,在转换成  
    //byte数组前必须先初始化数组,再使用,初始化  
    //的数组长度必须和SizeConst一致,例test = new int[6];  
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]  
    public int[] test;  
    } 
    (2)解决C#结构体数组间的转化之byte数组转结构体:
    
    /** <summary>  
    /// byte数组转结构体  
    /// </summary>  
    /// <param name="bytes">byte数组</param>  
    /// <param name="type">结构体类型</param>  
    /// <returns>转换后的结构体</returns>  
    public static object BytesToStuct(byte[] bytes,Type type)  
    ...{  
    //得到结构体的大小  
    int size = Marshal.SizeOf(type);  
    //byte数组长度小于结构体的大小  
    if (size > bytes.Length)  
    ...{  
    //返回空  
    return null;  
    }  
    //分配结构体大小的内存空间  
    IntPtr structPtr = Marshal.AllocHGlobal(size);  
    //将byte数组拷到分配好的内存空间  
    Marshal.Copy(bytes,0,structPtr,size);  
    //将内存空间转换为目标结构体  
    object obj = Marshal.PtrToStructure(structPtr, type);  
    //释放内存空间  
    Marshal.FreeHGlobal(structPtr);  
    //返回结构体  
    return obj;  
    } 

     转自:http://developer.51cto.com/art/200908/143779.htm

    展开全文
  • C# 结构体数组如何保存到文件并从文件解析出来  public struct USER_RECORD  {  public uint nGroupID;  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]  public byte[] szUserID;
    C# 结构体数组如何保存到文件并从文件解析出来
      public struct  USER_RECORD
            {
                public uint nGroupID;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
                public byte[] szUserID;
                public uint nFinger;
                public uint nInstances;
                public VCOMWrapper.MX00_TEMPLATE_INSTANCE[] instanceRecords;
            }
            [StructLayout(LayoutKind.Sequential)]
            public struct MX00_TEMPLATE_INSTANCE
            {
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2048)]
                public byte[] p378Template;
            }



    List<USER_RECORD> ps = new List<USER_RECORD>();

    现在要把ps保存成文件,并且下次文件能正确解析出ps?

    如果结构体USER_RECORD没有instanceRecords,就可以把这个结构体转成Byte[], 然后写到文件,解析时,读取文件byte[]转成结构体,可是现在有VCOMWrapper.MX00_TEMPLATE_INSTANCE[], 结构体转成Byte[]失败.

    ------解决思路----------------------
    序列化比较简单写
    http://www.cnblogs.com/yzenet/p/3622833.html
    ------解决思路----------------------

            public static void Serialize(USER_RECORD rec, string path)         {            using (BinaryWriter wr = new BinaryWriter(File.OpenWrite(path)))             {                 Serialize(rec, wr);             }         }         public static USER_RECORD Deserialize(string path)         {             using (BinaryReader rd = new BinaryReader(File.OpenRead(path)))             {                 return Deserialize(rd);             }         }         private static void Serialize(USER_RECORD rec, BinaryWriter output)         {             output.Write(rec.nGroupID);             WriteByteArray(rec.szUserID, output);             output.Write(rec.nFinger);             output.Write(rec.nInstances);             if (rec.nInstances > 0)             {                 MX00_TEMPLATE_INSTANCE[] array = rec.instanceRecords;                 Debug.Assert(array != null && array.Length == rec.nInstances);                 for (int i = 0; i < rec.nInstances; i++)                 {                     MX00_TEMPLATE_INSTANCE inst = array[i];                     WriteByteArray(inst.p378Template, output);                 }             }         }         private static void WriteByteArray(byte[] data, BinaryWriter output)         {             if (data != null)             {                 output.Write(data.Length);                 output.Write(data);             }             else                 output.Write(-1);         }         private static byte[] ReadByteArray(BinaryReader input)         {             int len = input.ReadInt32();             if (len >= 0)             {                if (len > 0)                     return input.ReadBytes(len);                 else                     return new byte[0];             }             else                return null;         }         private static USER_RECORD Deserialize(BinaryReader input)         {             USER_RECORD rec = new USER_RECORD();             int len;             rec.nGroupID = input.ReadUInt32();             rec.szUserID = ReadByteArray(input);             rec.nFinger = input.ReadUInt32();             len = (int)(rec.nInstances = input.ReadUInt32());             MX00_TEMPLATE_INSTANCE[] array = new MX00_TEMPLATE_INSTANCE[len];             for (int i = 0; i < len; i++)             {                 MX00_TEMPLATE_INSTANCE inst = new MX00_TEMPLATE_INSTANCE();                 inst.p378Template = ReadByteArray(input);                 array[i] = inst;             }           rec.instanceRecords = array;
      return rec;
            }
    展开全文
  • C#结构体数组的定义

    2018-11-13 14:27:00
    但是在尝试中,发现C#中好像没有结构体数组的定义,在定义完结构体后,按照C/C++那样定义结构体数组,一直报错。请问C#确定不能定义结构体数组吗,如果可以,怎么定义,求助! class AEC { struct AEC_Entry ...
  • 结构体定义部分 unsafe public struct VCI_CAN_OBJ //使用不安全代码 { public uint ID; public uint TimeStamp; public byte TimeFlag; public byte SendType; public byte RemoteFlag;//是否是远程帧...
  • 首先我声明了几个结构体: struct STimeStamp //时间戳 { public uint sec; //秒 public ushort millsec; //毫秒 } struct SSenosrRecord //传感器数据记录 { public float fWavelength; //波长 ...
  • namespace StructArrayTest { public partial class Form1 : Form { public Form1() ...”还会提示警告 1 从未对字段“StructArrayTest.Form1.CAOZUO_STRUCT.XiangMu”赋值,字段将一直保持其默认值 null E:\VS...
  • 不然对结构体成员操作时 会提示’“Testroutingtable.SmipleRoutingTable.SourceNode”不可访问,因为它具有一定的保护级别 public void InitRoutingTable() { for (int i = 0; i ; i++) { for (int j = 0; j ...

    public struct SmipleRoutingTable
    {
    public int SourceNode;
    public int Gateway;
    public int Destination;
    public int Metric;
    }
    初始化
    public SmipleRoutingTable[,] testRoutingTable=new SmipleRoutingTable[ct, ct] ;
    结构体成员面前也要加上public
    不然对结构体成员操作时 会提示’“Testroutingtable.SmipleRoutingTable.SourceNode”不可访问,因为它具有一定的保护级别

    public void InitRoutingTable()
    {
    for (int i = 0; i < ct; i++)
    {
    for (int j = 0; j < ct; j++)
    {
    testRoutingTable[i,j].SourceNode = i;
    testRoutingTable[i,j].Gateway = 0;
    testRoutingTable[i,j].Destination = 0;
    if (i == j)
    {
    testRoutingTable[i,j].Gateway = i;
    testRoutingTable[i,j].Metric = 0;
    }
    }
    }
    }

    展开全文
  • C#抛弃了C++那种定义结构体数组直接在大括号里付值的方式。 如果用普通的初始化方法又太麻烦。 经过实践,我发现了以下的方式,可以简洁的初始化。 struct AlarmType { public string AlarmName; public ...
  • 上一篇说到C#如何向C++动态库获取结构体数组,现在说说C#如何向C++动态库发送结构体数组数据。 C++结构体数组声明如下: struct DATA { int ID; int iNum; char* szName; }; C++接口声明实现如下: void ...
  • //注意在 student这个结构体里不能赋初值 static void Main(string[] args) { Student xiaoming; xiaoming.name = "xiaoming"; xiaoming.sex = 'M'; xiaoming.age = 15; ...
  • C#调用C/C++动态库 封送结构体,结构体数组一.结构体的传递Cpp代码#define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数typedef struct{int osVersion;int majorVersion;int minorVersion;int buildNum...
  • 下面小编就为大家分享一篇基于C#调用c++Dll结构体数组指针的问题详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • c++调用C# COM 参数是结构体数组
  • C# class数组,结构体数组排序

    千次阅读 2018-09-26 21:19:16
    在类里面实现CompareTo的方法,并return要进行比较的成员,然后就可以使用sort函数对class数组进行排序了。 public class SignList : IComparable { public string Fimage { get; set; } public long Ftime { ...
  • 主要介绍了C#调用C++DLL传递结构体数组的终极解决方案的相关资料,需要的朋友可以参考下
  • 结构体数组

    2020-12-05 17:28:53
    结构体数组 定义一个学生成绩的结构体数组,编写函数对几门课程的成绩求平均成绩。 #include <stdio.h> struct stud { int yu; int shu; int wai; int wu; int hua; int sheng; }score[3]; void main() ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,408
精华内容 4,963
关键字:

c#结构体数组

c# 订阅