2017-05-30 2 views
-3

Der folgende Code hat drei Argumente vom Typ double *. Der Code ist Teil einer Arduino-PID-Bibliothek, und der Benutzer würde typischerweise einen analogen Port oder eine Art Sensor als Argument für den Begriff "Eingabe" und einige feste Werte oder vom Benutzer gesteuerte Variablen als den Wert des "Sollwerts" eingeben "Begriff. Aber das Argument ist vom Typ double *. Sollte der Benutzer keinen Fehler bekommen, wenn er ein Double liefert?Wie nimmt dieser Konstruktor Code Zeiger als Argumente?

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; 
} 

Hat der Konstruktor nehmen Sie nur die Adresse des Doppel, dass der Benutzer zur Verfügung stellt?

Wenn der Benutzer einige Temperaturdaten gelesen hat, sagen Sie zweimal temp = AnalogRead (1). Also, was liest alles, was vom analogen Pin 1 kommt, würde myOutput nur die Adresse dieser eingehenden Temperaturmesswerte sein?

myInput, myOutput und mySetpoint werden in einer anderen Elementfunktion de-referenziert.

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

Bitte senden Sie uns eine einen Zeiger anstelle der Semantik von-Wert verwenden [MCVE ].Was deine Frage momentan enthält, benutzt nicht einmal den Kern, von dem du sprichst. –

+0

Wie * benutzen * Sie die Klasse? Welche Argumente liefern Sie dem Konstruktor? Wenn Sie einen 'double' * Wert * (und nicht einen Zeiger auf ein' double') angeben, dann wird ein Fehler angezeigt. –

+3

_ "Nimmt der Konstruktor nur die Adresse des Double, die der Benutzer bereitstellt?" _ Ja. Ich fürchte, ich bekomme deine Frage nicht? –

Antwort

1

Hierfür gibt es einige mögliche Erklärungen.

optionales Argument:

Eine mögliche Erklärung ist, dass Setpoint optional ist, so können Sie nullptr passieren.

Wenn Sie im Code einen Nullzeiger übergeben haben, wird kein Sollwert verwendet.

Sie haben erwähnt, dass Setpoint in einer anderen Funktion dereferenziert wird, also ist es wahrscheinlich nicht optional.

out-param:

C keine Referenzen hat, so out-params typischerweise als Zeiger übergeben werden. Um eine Änderung auf einen Parameter zu machen, die an den Aufrufer der Funktion sichtbar ist, können Sie es als foo An diesem Punkt

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

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

Zeiger übergeben hat den Wert von 5.

In C++ können Sie Verwenden Sie Verweise. Wenn Sie also einen Out-Parameter verwenden möchten, der Benutzer jedoch einen Wert angeben muss, verwenden Sie double& Setpoint.

erlauben externe Veränderungen sichtbar zu sein:

Wahrscheinlich ist die wahrscheinlichste Erklärung ist, damit Sie die Adresse Setpoint, zur Verfügung zu stellen und dann, wenn Sie den Wert Setpoint später ändern, wird das Objekt diese Änderungen beobachten .

double setpoint = 1; 

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

p.foobar(); // setpoint=1 

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

Wieder in C++ eine Referenz verwenden könnte das gleiche Verhalten zu bekommen (obwohl das wäre Ihr Objekt nicht übertragbar machen).

Wie Sie sehen, gibt es mehrere mögliche Erklärungen, also ohne weitere Details kann man wirklich nicht sicher sagen, warum die Bibliothek Autor Sie erfordert

Verwandte Themen