0

値と参照の両方で構造体を渡す例を見てきました。コードはコンパイルされますが、正常に動作しません。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 
}; 

メイン メソッドでは、そのインスタンスを作成します。

    struct package p; //create a new instance of Package

今私はそれを関数に参照(ポインタ - 私はCを使用しているため)で渡します:

   getPackage(&p);

関数 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();

}   

これは受信機能です。

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 のバイトが正しく更新されますか? また、別の場所で使用したい場合、パッケージ p を返却する必要がありますか? 私はこれを尋ねるので....

ここで、次を使用して、パッケージ p を値で別の関数に渡します。

sendSine(p);

この関数は、パッケージ 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 を手動で設定してテストしたため、必要な結果が得られたため、構造体の途中でエラーが発生する必要があります-どこにあるのかわかりません... 誰か助けてくれませんか?

4

1 に答える 1

0

受信機能が問題の手順のようです。次のように、受信用のスタブ置換を作成してみてください。

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

       return X;
    }

次に、完全なアプリケーションを実行してみてください。それが機能する場合は、戻って、既に作成されたコメントのいくつかに従って元の受信を再考してください。

于 2013-08-01T05:38:27.303 に答える