2017-05-30 6 views
-3

以下のコードはdouble *型の3つの引数を持っています。このコードはArduinoのPIDライブラリの一部であり、ユーザーは通常、「入力」の項の引数としてアナログポートや何らかの種類のセンサーを読み取って、「設定値」の値として固定値またはユーザー制御変数を与えます" 期間。しかし引数はdouble *型です。ユーザーがダブルを入力したときにエラーを表示してはいけませんか?このコンストラクタコードはポインタを引数としてどのように取っていますか?

PID::PID(double* Input, double* Output, double* Setpoint, 
     double Kp, double Ki, double Kd, int ControllerDirection) 
{ 
    myOutput = Output; 
    myInput = Input; 
    mySetpoint = Setpoint; 
    inAuto = false; 

    PID::SetOutputLimits(0, 255); // default output limit corresponds to 
            // the arduino pwm limits 

    SampleTime = 100;    // default Controller Sample Time is 0.1 seconds 

    PID::SetControllerDirection(ControllerDirection); 
    PID::SetTunings(Kp, Ki, Kd); 

    lastTime = millis()-SampleTime; 
} 

コンストラクタは単に、ユーザーが提供する、二重のアドレスを取得していますか?

ユーザが温度データを読み取っていた場合は、double temp = AnalogRead(1)と言ってください。だから、アナログピン1から何が入ってきても、myOutputは入ってくる温度の読み取り値のアドレスになりますか?

myInput、myOutputおよびmySetpointは、別のメンバー関数で参照解除されます。

double input = *myInput; 
double error = *mySetpoint - input; 
+1

を使用する必要がありますなぜあなたは本当に確かに言うことはできません詳細なしのであなたは、いくつかの可能な説明がある見ることができるように、[MCVEを投稿してください]。現在あなたの質問にはあなたが話しているctorを使用していません。 –

+0

あなたはどのようにクラスを使用しますか?実際にどのような引数をコンストラクタに提供していますか? 'double' * value *(' double'へのポインタではない)を指定すると、エラーが発生します。 –

+3

_ "コンストラクタはユーザーが提供するダブルのアドレスを取るだけですか?"私はあなたの質問を得ることができないのだろうか? –

答えて

1

これについてはいくつかの説明があります。

オプションの引数:

一つの可能​​な説明はSetpointがオプションであるということですので、あなたはnullptrを渡すことができます。

ヌルポインタを渡した場合、設定点は使用されません。

Setpointは別の関数で参照解除されると述べているので、オプションではない可能性があります。外のparam

:通常のポインタとして渡され、アウトのparamsよう

Cは、参照を持っていません。関数の呼び出し元に表示されるパラメータを変更するために、この時点でポインタ

void setFoo(double* in) 
{ 
    *in = 5; 
} 

double foo; 
setFoo(&foo); // pass the memory address of your variable 

として渡しfooは++ことができますC 5.

の値を有します参照を使用するので、out-paramを使用したいが、ユーザーが値を指定する必要がある場合は、double& Setpointを使用します。

は、外部の変化が見えるように:

はおそらく、最も可能性のある説明は、あなたがSetpointのアドレスを提供できるようにすることで、後でSetpointの値を変更した場合、その後、オブジェクトは、それらの変化を観察します。

double setpoint = 1; 

PID p(&input, &output, &setpoint, ...) 

p.foobar(); // setpoint=1 

setpoint = 3; 
p.foobar(); // setpoint=3 

また、C++では、参照を使用してこの同じ動作を得ることができますが、オブジェクトを割り当て不能にすることもできます。

ライブラリの作者は、ポインタの代わりにすることにより、値のセマンティクス

関連する問題