现在做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型数组.

解决方案 »

  1.   

    问题1 在C中float类型好像不需要像你输入的这么麻烦的,直接赋值12.3就好了.至于提示:不能隐式将double转换为float.
    我好像遇到过,我记得当时是scanf("%F",float)中的%f 我给写错了,我不知道这个F是不是就代表了这个意思!
    问题2 不知道你是不是指的是数组无法计算,我倒是有个苯办法,写个循环从数组的开始,做个累加,把每个数据的大小都计算一边,加到累加器里面去.
      

  2.   

    1、C#默认带小数点的数字为double类型的,你的test.s1是float类型的,所以需要转换为你的s1的类型,也就是float类型;因为你用来接收12.3的变量类型是float的,所以,它要求你“创建此类型”的数;
    2、数组只是一个“引用”,也就是C/C++里面的指针,所以计算出来的size总是4byte的;另外,struct在C#里面的意义已经跟C/C++里面大不一样了,建议你好好看看他们的区别;
    3、你可以把它转换成一个内存流,然后发送:MemoryStream ms = new MemoryStream();
    IFormatter format = new BinaryFormatter();
    format.Serialize(ms,test);
                    
      

  3.   

    这些问题我都解决了:
    (2)在struct定义的时候,用Marshal为定义的数组固定分配一个空间,这样就可以计算出来了。
    (3)用指针实现,可以将struct转换为byte[],估计也只有这种方法了。
    谢谢大家的回答