现在做C#的开发遇到一些问题,希望大家能给我一些指导:
我现在做can通讯程序,遇到问题如下:
(1)我定义了一个结构体,有byte型,ushort,float型数据,uint,以及float型的数组,在程序里我对结构体进行初始化的时候对于定义的float型数据直接赋值如12.3,编译竟然报错说:不能隐式将double转换为float,请使用“F”后缀创建此类型。根据提示的错误我理解是直接赋值12.3,默认为double型的,需要进行强制转换如test.s1=(float)12.3,这么赋值确实没有问题,但是它提示的用"F"后缀创建此类型是什么意思呢?
(2)定义的struct包括float数组,我发现计算struct大小时,计算有误,我知道有内存对齐的问题,但是只要涉及到数组就不对了,无论我定义的数组的维数为多少,除数组外其他的大小都计算的是正确的,唯独数组部分它始终计算的值为4个字节.后来我抛开结构体,专门定义了一个float数组去计算大小,结果发现无法计算出数组的大小,请告诉我如何计算一个数组大小.
(3)进行CAN通讯时,需要把一个struct数据按每8个字节为一个帧进行发送,但是一个结构体我们通过计算内存有很多个字节,因此需要把struct类型转换为一个byte型的数组,这样可以每8个byte为单位循环的进行发送,请告知如何转换为byte型数组.
我现在做can通讯程序,遇到问题如下:
(1)我定义了一个结构体,有byte型,ushort,float型数据,uint,以及float型的数组,在程序里我对结构体进行初始化的时候对于定义的float型数据直接赋值如12.3,编译竟然报错说:不能隐式将double转换为float,请使用“F”后缀创建此类型。根据提示的错误我理解是直接赋值12.3,默认为double型的,需要进行强制转换如test.s1=(float)12.3,这么赋值确实没有问题,但是它提示的用"F"后缀创建此类型是什么意思呢?
(2)定义的struct包括float数组,我发现计算struct大小时,计算有误,我知道有内存对齐的问题,但是只要涉及到数组就不对了,无论我定义的数组的维数为多少,除数组外其他的大小都计算的是正确的,唯独数组部分它始终计算的值为4个字节.后来我抛开结构体,专门定义了一个float数组去计算大小,结果发现无法计算出数组的大小,请告诉我如何计算一个数组大小.
(3)进行CAN通讯时,需要把一个struct数据按每8个字节为一个帧进行发送,但是一个结构体我们通过计算内存有很多个字节,因此需要把struct类型转换为一个byte型的数组,这样可以每8个byte为单位循环的进行发送,请告知如何转换为byte型数组.
我好像遇到过,我记得当时是scanf("%F",float)中的%f 我给写错了,我不知道这个F是不是就代表了这个意思!
问题2 不知道你是不是指的是数组无法计算,我倒是有个苯办法,写个循环从数组的开始,做个累加,把每个数据的大小都计算一边,加到累加器里面去.
2、数组只是一个“引用”,也就是C/C++里面的指针,所以计算出来的size总是4byte的;另外,struct在C#里面的意义已经跟C/C++里面大不一样了,建议你好好看看他们的区别;
3、你可以把它转换成一个内存流,然后发送:MemoryStream ms = new MemoryStream();
IFormatter format = new BinaryFormatter();
format.Serialize(ms,test);
(2)在struct定义的时候,用Marshal为定义的数组固定分配一个空间,这样就可以计算出来了。
(3)用指针实现,可以将struct转换为byte[],估计也只有这种方法了。
谢谢大家的回答