2017-05-30 83 views
-3

下面的代碼有三個double *類型的參數。該代碼是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' *值*(而不是一個指向'double'的指針),那麼會出現錯誤。 –

+3

_「構造函數是否只接受用戶提供的double的地址?」_是的。恐怕我不明白你的問題? –

回答

1

對此有幾種可能的解釋。

可選參數:

一個可能的解釋是,Setpoint是可選的,因此你可以通過nullptr

在代碼中,如果您傳遞了空指針,則不會使用設定值。

您提到Setpoint在另一個函數中被取消引用,所以它可能不是可選的。

出PARAM:

C沒有引用,所以出PARAMS通常作爲指針傳遞。爲了進行更改的參數,其是對函數的調用者可見,把它作爲一個指針

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

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

此時foo具有5.

值在C++中可以使用引用,所以如果你想有一個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++中,您可以使用引用來獲得相同的行爲(儘管這會使對象不可分配)。

正如你可以看到有幾種可能的解釋,所以沒有進一步的細節,你真的不能肯定地說,爲什麼庫的作者,您需要使用一個指針,而不是值語義的

相關問題