c#c structt 数组

C#调用Matlab中结构数组和单元数组的类型转换 - MATLAB的日志,人人网,MATLAB的公共主页
好久不发状态了,大家还在吗?还在学习MATLAB么?
C#调用Matlab中结构数组和单元数组的类型转换
关于C#调用Matlab的问题,simwe的zccbest已经在前面的帖子里面讲的很详细我只想在这里说下结构体和单元数组的类型转换问题。Matlab的结构数组和C#是不同的,而Matlab的单元数组,C#没有,所以在Matlab程序中使用结构数组和单元数组作为输入和输出的时候,如何传化为C#的数据类型,就是一个值得探讨的问题,matlab提供了MWArray程序集可以处理这个问题:下面是我写的一个m文件:function [x,y,z] = StructCellExample(a,b,c)if nargin == 0&&& a.m = 1;&&& a.n = 2;&&& b ={rand(2),rand(2)};&&& c = 'Hello,World!';endx = a.m + a.n;y = struct('p',cell(size(b)),'q',cell(size(b)));for i =1 :length(b)&&& y(i).p = sum(b{i}(:));&&& y(i).q = max(b{i}(:));endz = fliplr(c);用deploytool编译成dll,程序集:SCtest类:Demo&&编写C#代码using Susing System.Collections.Gusing System.Lusing System.Tusing MathWorks.MATLAB.NET.Arrays.using SCtestNnamespace StructCellExample{&&& class Program&&& {&&&&&&& static void Main(string[] args)&&&&&&& {&&&&&&&&&&& string[] mn = new string[2];&&&&&&&&&&& mn[0] = "m";&&&&&&&&&&& mn[1] = "n";
&&&&&&&&&&& double[,] b1 = new double[2, 2];&&&&&&&&&&& double[,] b2 = new double[2, 2];&&nbsp...
阅读(2223)|
人人移动客户端下载10798人阅读
.NET(37)
如有雷同,不胜荣幸,若转载,请注明
C#中自定义类数组和结构数组的使用
最近在很多项目中发现很多时候给定的数组要实现某个逻辑或处理很是麻烦,一维数组,二维数组,,,等等需要经过n多转换,还不如自己写一个自定义数组,既方便又节省时间,以下是类数组,其实相当于定义了一个实体类一样,只是使用的时候写成数组的形式在用
public RGB(byte r,byte g,byte b)
this.red =
this.green =
this.blue =
以上定义了形如实体类一样的一个类
类数组在使用的时候需要注意的是:必须要实例化
Class Test
RGB[] rgb = newRGB[image.width*image.height];
byte red,green,
rgb[0] = newRGB(red,green,blue);
rgb[1].red =
rgb[1].green =
rgb[1].blue =
rgb[2].red =
//这样就可以使用了
下面是定义一个结构体
struct HSI
public int&
public int&
Class Test2
HSI[] hsi = new HSI[image.width*image.height];
hsi[0].hue =
hsi[0].saturation =
hsi[0].intensity =
hsi[1].hue =
//这样使用结构数组
综上所述,就自定义类数组和自定义结构数组的简单使用做个总结,以便以后使用的时候注意,避免犯我同样的错误,欢迎大家斧正
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:314232次
积分:2761
积分:2761
排名:第8638名
原创:55篇
转载:10篇
评论:131条
(1)(1)(2)(2)(2)(1)(1)(1)(1)(1)(2)(2)(2)(2)(9)(5)(2)(6)(8)(8)(6)C#两种序列化方式比较
Photon服务器虽然支持哈希表和字典类型甚至于Vector3结构体的直接传输,但是不支持结构体的直接传输,传输结构体之前必须先序列化。所谓序列化无非就是将数据结构转换成可存储或者可传输的数据类型(通常是字节流。)。所谓反序列化就是将字节流还原成具体的数据类型(结构体,整型等)。下面列举了两种序列化方式。明天应该会倾向用第一种,像第二种动不动就250个字节毕竟太费网络流量。第一种:需要:using System.Runtime.InteropSusing S结构体类似以下[StructLayout(LayoutKind.Sequential),Serializable] //第一个属性是指定顺序不可变,第二个是可序列化public struct Test{& & //如果以第二种方式序列化,不用担心string长度不够,但是开销很大,转换后的byte数组长度为2的n次方& & //如果以第一种方式传输而不指定长度,会乱码,string默认以4个字节传输。& & [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 12)] //转换后的byte数组长度为12+4+4+2& && && && & public Test(string s,int x, int y)& & {& & & & this.str =& & & & this.x =& & & & this.y =& & }}//将Byte转换为结构体类型(序列化)& & public static byte[] StructToBytes(object structObj, int size)& & {& & & & //StructD& & & & //int num = 2;& & & & byte[] bytes = new byte[size];& & & & IntPtr structPtr = Marshal.AllocHGlobal(size);& & & & //将结构体拷到分配好的内存空间& & & & Marshal.StructureToPtr(structObj, structPtr, false);& & & & //从内存空间拷贝到byte 数组& & & & Marshal.Copy(structPtr, bytes, 0, size);& & & & //释放内存空间& & & & Marshal.FreeHGlobal(structPtr);& & & && & }& & //将Byte转换为结构体类型(反序列化)& & public static object BytesToStruct(byte[] bytes, Type type)& & {& & & & int size = Marshal.SizeOf(type);& & & & if (size & bytes.Length)& & & & {& & & & & && & & & }& & & & //分配结构体内存空间& & & & IntPtr structPtr = Marshal.AllocHGlobal(size);& & & & //将byte数组拷贝到分配好的内存空间& & & & Marshal.Copy(bytes, 0, structPtr, size);& & & & //将内存空间转换为目标结构体& & & & object obj = Marshal.PtrToStructure(structPtr, type);& & & & //释放内存空间& & & & Marshal.FreeHGlobal(structPtr);& & & && & }第二种:需要:using System.Runtime.Serialization.Formatters.Busing System.IO;结构体只需要加上[Serializable]属性就行,实现简单些,但开销大。& & /// &summary&&& & /// 反序列化&& & /// &/summary&&& & /// &param name=&data&&数据缓冲区&/param&&& & /// &returns&对象&/returns&&& & public static object Deserialize(byte[] data)& & {& & & & BinaryFormatter formatter = new BinaryFormatter();& & & & MemoryStream rems = new MemoryStream(data);& & & & data =& & & & return formatter.Deserialize(rems);& & }& & /// &summary&&& & /// 序列化&& & /// &/summary&&& & /// &param name=&data&&要序列化的对象&/param&&& & /// &returns&返回存放序列化后的数据缓冲区&/returns&&& & public static byte[] Serialize(object data)& & {& & & & BinaryFormatter formatter = new BinaryFormatter();& & & & MemoryStream rems = new MemoryStream();& & & & formatter.Serialize(rems, data);& & & & return rems.GetBuffer();& & }
请各位遵纪守法并注意语言文明C#中常量\枚举\结构及数组的运用
又一天结束了,今天在云和学院学习的知识下面继续来做总结。
一、常量\枚举\结构的运用
常量:const &类型 常量名 = 常量值
确定数量、确定值的几个取值:东西南北、男女、上中下。
枚举: enum Gender{male,female}
字符串与枚举的转换:(Gender)(Enum.Parse( typeof(Gender),&male&));每一个值都对应一个数字
结构体:访问修饰符struct结构名
& 定义结构成员
tatic void Main(string[] args)
& & & &const int &PI = 3.14;
& & & &PI = 3.20;
enum QQStatus{online,offline,hidden}
QQStatus status = QQStatus.
3,结构体和枚举的运用
&定义一个结构类型Person,有三个成员,分别为姓名,性别,年龄 性别用枚举类型
&声明两个Person类型的变量,分别表示 张三 男 &18岁/ 小兰 女 16岁
class Program
& & & &public enum Gender {femal,meal};
& & & &public struct person { public &Gender &}
& & & &static void Main(string[] args)
& & & & & &//定义一个结构类型Person,有三个成员,分别为姓名,性别,年龄 性别用枚举类型
& & & & & &//声明两个Person类型的变量,分别表示 张三 男 &18岁/ 小兰 女 16岁
& & & & & &person p1 = new person();
& & & & & &p1.name = &张三&;
& & & & & &p1.gender = Gender.
& & & & & &p1.age = 18;
& & & & & &person p2 = new person();
& & & & & &p2.name = &小兰&;
& & & & & &p2.gender = Gender.
& & & & & &p2.age = 16;
& & & & & &Console.WriteLine(&大家好,我是{0},是个{1}生,今年{2}岁&,p1.name,p1.gender,p1.age);
& & & & & &Console.WriteLine(&大家好,我是{0},是个{1}生,今年{2}岁&, p2.name, p2.gender, p2.age);
& & & & & &Console.ReadKey();
& & & &} & &&
保存多个值;几乎任意类型都可以声明数组; int[] nums = new int[3];int[] nums = {5,3,8};
in[]nums=new int[3]{1,2,3};int[]nums=new int[]{2,3,5};
int[] nums = new int[3]{5,3,8}//个数和声明数必须一致
int[] nums = new int[5]{5,3,8}//错误
int[] nums = new int[]{5,3,8}//正确,可以省略数组个字
数组的声明:以上四种
使用索引器访问指定编号位置的元素,访问数组元素:nums[0]、nums[1]。索引从0开始。取到的元素的类型就是数组元素的类型。还可以对数组元素进行赋值。
常见问题:求平均值,求最大值,求和,排序
Array排序 和反序
数组里面都是人的名字,分割成:例如:老杨|老苏|老邹&&
string names = &&;
string[] name = new string[8] { &老杨&, &老苏&, &老邹&, &老虎&, &老牛&, &老蒋&, &老王&, &老马& };
for (int i = 0; i & name.Length - 1; i++)
& & names += name[i] + &|&;
Console.Write(names + name[name.Length - 1]);
Console.ReadKey();
&将一个整数数组的每一个元素进行如下的处理:如果元素是正数则将这个位置的元素的值加1,如果元素是负数则将这个位置的元素的值减1,如果元素是0,则不变。
for (int i = 0; i & num.L i++)
& & & & & Console.WriteLine(num[i]);
& & & Console.WriteLine(&----------------------------&);
for (int i = 0; i & num.L i++)
& & & & & if(num[i]&0)
& & & & & {
& & & & & & & num[i]--;
& & & & & }
& & & & & else if (num[i] & 0)
& & & & & {
& & & & & & & num[i]++;
& & & & & }
& & & & & else
& & & & & {
& & & & & & &&
& & & & & }&
& & & & &&br& & & & & & & & & &Console.WriteLine(&现在的值是:{0}&,num[i]);
& & & & & &
& & &}&br& & & & & & & & & Console.ReadKey();
&将一个字符串数组的元素的顺序进行反转。{&我&,&是&,&好人&} {&好人&,&是&,&我&}。第i个和第length-i-1个进行交换
string &[] str = {&我&,&是&,&好人& };
for (int i = 0; i & str.Length/2; i++)
& &string temp = str[i];
& &str[i] = str[str.Length - 1 - i];
& &str[str.Length - 1 - i] = &&
for (int i = 0; i & str.L i++)
& & Console.Write(str[i]);
& &Console.ReadKey();
&从一个整数数组中取出最大的整数,最小整数,总和,平均值
int[] num = { 51, 21, 82, 41, 10, -5 };
int max = 0;
int min = 0;
int sum = 0;
for (int i = 0; i & num.L i++)
& & if (num[i] & max)
& & & & max = num[i];
& & else if (num[i] & min)
& & & & min = num[i];
& & sum = sum + num[i];
Console.WriteLine(&最大的整数是:{0},最小的整数是:{1}&, max, min);
Console.WriteLine(&总和是{0},平均值是:{1}&, sum, sum /num.Length);
Console.ReadKey();
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'在C#中如何在函数参数中返回结构数组?-.NET教程,C#语言-虚拟主机资讯|虚拟主机动态
产品服务快速通道
----------------
==域名注册==
英文域名注册
中文域名注册
==网站推广==
==虚拟主机==
----------------
双线路虚拟主机
基本型虚拟主机
商用型虚拟主机
论坛型虚拟主机
功能型虚拟主机
Vip合租虚拟主机
虚拟主机性能对比
虚拟主机免费试用
机房速度测试
----------------
==租用托管==
服务器租用
----------------
==企业邮局==
购买企业邮局
----------------
==付款方式==
----------------
==联系我们==
您当前位置:->-> ->
在C#中如何在函数参数中返回结构数组?-.NET教程,C#语言
作者:网友供稿
  西部数码-全国虚拟主机10强!20余项管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:&
头晕脑涨地研究了一天,就为了实现在函数的参数中返回结构数组。
现供大家分享,节省学习时间。
&&/// &summary&
&&/// 用户信息结构
&&/// &/summary&
&&public struct tuser
&&/// &summary&
&&/// 获得所有注册用户
&&/// &/summary&
&&/// &param name=&userinfo&&返回用户信息结构&/param&
&&public bool getusers(out tuser[] g_userinfo)
&&&userop.tuser[] f_
&&&int currec = 0;&&//初始化记录计数器
&&&int rec_count =0; //计算总记录数
&&&sqlconnection myconn = new sqlconnection(connectionstring);
&&&string cmd=&select * from & +m_&&//sql查询语句
&&&sqlcommand mycmd=new sqlcommand(cmd,myconn);
&&&mycmd.connection.open(); //打开连接
&&&sqldatareader adr = //创建数据读取器
&&&&adr = mycmd.executereader();
&&&&while(adr.read ())
&&&&&rec_count += 1;
&&&&myconn.close();&&//关闭数据库连接
&&&&mycmd.connection.open (); //打开数据库连接
&&&&&adr = mycmd.executereader ();
&&&&&f_tuser = new userop.tuser[rec_count];
&&&&&while(adr.read())
&&&&&&f_tuser[currec].loginname = adr[&us_loginname&].tostring();
&&&&&&f_tuser[currec].loginpass = adr[&us_loginpass&].tostring ();
&&&&&&f_tuser[currec].truename = adr[&us_truename&].tostring ();
&&&&&&f_tuser[currec].email = adr[&us_email&].tostring ();
&&&&&&f_tuser[currec].level = int32.parse (adr[&us_level&].tostring ());&&&
&&&&&&currec += 1;
&&&&&g_userinfo = f_
&&&&&myconn.close (); ///关闭连接
&&&&&myconn.close();
&&&&&f_tuser = new userop.tuser[1];
&&&&&f_tuser[0].loginname = &&;
&&&&&f_tuser[0].loginpass = &&;
&&&&&f_tuser[0].truename = &&;
&&&&&f_tuser[0].email = &&;
&&&&&f_tuser[0].level = 0;
&&&&&g_userinfo = f_
&&&&myconn.close ();
&&&&f_tuser = new userop.tuser[1];
&&&&f_tuser[0].loginname = &&;
&&&&f_tuser[0].loginpass = &&;
&&&&f_tuser[0].truename = &&;
&&&&f_tuser[0].email = &&;
&&&&f_tuser[0].level = 0;
&&&&g_userinfo = f_
///////////////// 在web form中调用如下:
&&private void button3_click(object sender, system.eventargs e)
&&&ksbm.userop.tuser[] f_ // = new ksbm.userop.tuser(); ///为什么不&new& 一个结构数组呢?因为传进来的已是我们要的数据了,所以只要开辟一个存储空间就行了.
&&&ksbm.userop f_usop = new ksbm.userop();
&&&bool ret=f_usop.getusers (out f_tuser); ///调用函数,取得结构数组及信息
&&&if(f_tuser.length !=0) //数据长度为0时,表明无返回数据.
&&&&for(int iloop=0;iloop&f_tuser.iloop++) ///遍历数组并输出到客户端的浏览器
&&&&&response.write (f_tuser[iloop].loginname);
&&&&&response.write (f_tuser[iloop].loginpass);
&&&&&response.write (f_tuser[iloop].truename);
&&&&&response.write (f_tuser[iloop].email);
&&&&&response.write (f_tuser[iloop].level);
文章整理:西部数码--专业提供、服务
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
文章页数:&
??????????
??????????
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
版权所有 西部数码()
CopyRight (c) 2002~ all right reserved.
公司地址:四川省成都市金牛区一环路北一段99号环球广场24楼 邮编:610031
电话总机:028-08 38
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028- 财务QQ:
售前咨询QQ:2182518
售后服务QQ:}

我要回帖

更多关于 c struct 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信