C 我传递结构作为值和引用的方法正确吗?

C 我传递结构作为值和引用的方法正确吗?,c,struct,C,Struct,我已经看过了通过值和引用传递结构的示例。我的代码可以编译,但不能正常工作。我用C来编程一个微控制器,所以很难检查它是否工作正常,但我没有得到想要的输出 因此,根据说明,我首先定义我的结构: struct package //define a structure type called package. { unsigned char wavType,startFreq1,startFreq2,startFreq3,startFreq4,

我已经看过了通过值和引用传递结构的示例。我的代码可以编译,但不能正常工作。我用C来编程一个微控制器,所以很难检查它是否工作正常,但我没有得到想要的输出

因此,根据说明,我首先定义我的结构:

 struct package //define a structure type called package.
{
    unsigned char 
            wavType,startFreq1,startFreq2,startFreq3,startFreq4,
            stopFreq1,stopFreq2,
            stopFreq3,stopFreq4,step,dura,amp,sett; //define bytes to use 
}; 
在main方法中,我创建了它的一个实例:

    struct package p; //create a new instance of Package
现在我通过引用(指针-因为我使用C)将其传递给函数:

   getPackage(&p);
unsigned char receive(void)
{
 unsigned char dataR = 0x00;

for(signed char i = 0; i <=7 ;i++)
{

    dataR |= PORTBbits.RB1 << i; //move the value on the data pin to a bit in dataR

}

return dataR;
}
在函数getpackage()中,我更新p的各个元素的值:

 getPackage(struct package *p) //Get data package
{
p->wavType = receive();
p->startFreq1 = receive();
p->startFreq2 = receive();
p->startFreq3 = receive();
p->startFreq4 = receive();
p->stopFreq1 = receive();
p->stopFreq2 = receive();
p->stopFreq3 = receive();
p->stopFreq4 = receive();
p->step = receive();
p->dura = receive();
p->amp = receive();
p->sett = receive();

}   
这是接收功能:

   getPackage(&p);
unsigned char receive(void)
{
 unsigned char dataR = 0x00;

for(signed char i = 0; i <=7 ;i++)
{

    dataR |= PORTBbits.RB1 << i; //move the value on the data pin to a bit in dataR

}

return dataR;
}
此函数使用包p中的字节值:

void sendSine(struct package p)
{

dataL = p.startFreq1; 
dataH = p.startFreq2; 
send(dataL,dataH);

dataL = p.startFreq3; 
dataH = p.startFreq4;
send(dataL,dataH);

}

我知道函数send(dataL,dataH)正在工作,因为我已经通过手动设置dataL和dataH对它进行了测试,并且得到了所需的结果,所以在使用结构的过程中一定会出现错误-我只是不知道在哪里。。。如果可能的话,有人能帮我吗

接收功能似乎就是所讨论的过程。尝试为receive编写存根替换,例如:

    unsigned char receive(void)
    {
       unsigned char X = 'a';  
       // or whatever value you want to simulate as being received

       return X;
    }

然后试着运行完整的应用程序,如果它能正常工作,那么返回并根据已经做出的一些评论重新思考您的原始接收。

dataR |=PORTBbits.RB1“我建议您在for循环之外定义您的签名字符I”-为什么“现在,你不能按值传递一个结构”——如果我告诉你,你可以怎么办?考虑“无符号char x= PurbBist.RB1;dataR |=x@TimMottram这意味着在读取RB1后,RB1的状态将更改为下一位(假设为串行通信)。是这样吗?@Tim,如果你有一个指向struct的指针,你可以使用
->
操作符访问struct的内容:
p->wavType
。点运算符用于直接结构,而不是指向的指针。谢谢,您的回答是正确的,接收函数是发生错误的地方。首先,我不能使用带符号的字符进行移位,它必须是一个int。其次(相当尴尬的是),在获取新数据之前,我没有清除dataR。因此,当接收的数据为0时,旧值是持久的。谢谢你的帮助。