【问题标题】:How is this constructor code taking pointers as arguments? [closed]这个构造函数代码如何将指针作为参数? [关闭]
【发布时间】:2017-05-30 15:57:17
【问题描述】:

下面的代码有三个 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;

【问题讨论】:

  • 请发帖minimal reproducible example。您的问题当前包含的内容甚至没有使用您正在谈论的 ctor。
  • 你如何使用这个课程?您实际上向构造函数提供了哪些参数?如果您提供double (而不是指向double 的指针),那么是的,将会出错。
  • "构造函数是否只取用户提供的双精度地址?" 是的。恐怕我不明白你的问题?
  • yes - 如果用户将双精度值传递给需要指向双精度值的指针的函数,用户将收到错误消息。不,'地址'没有完成。显示一些您预计会失败但正在运行的代码
  • 完全符合预期。操作符的地址就是你获取指针的方式。

标签: c++ class pointers arduino dereference


【解决方案1】:

对此有几种可能的解释。

可选参数:

一种可能的解释是Setpoint是可选的,所以你可以通过nullptr

在代码中,如果您传递了一个空指针,则不使用设置点。

您提到Setpoint 在另一个函数中被取消引用,因此它可能不是可选的。

输出参数:

C 没有引用,因此输出参数通常作为指针传递。为了对函数调用者可见的参数进行更改,请将其作为指针传递

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

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

此时foo 的值为5。

在 C++ 中,您可以使用引用,因此如果您想要一个输出参数,但要求用户提供一个值,您可以使用 double& Setpoint

允许外部更改可见:

可能最可能的解释是允许你提供Setpoint的地址,然后如果你稍后更改Setpoint的值,对象会观察到这些变化。

double setpoint = 1;

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

p.foobar(); // setpoint=1 

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

同样,在 C++ 中,您可以使用引用来获得相同的行为(尽管这会使您的对象不可赋值)。

正如您所看到的,有几种可能的解释,所以如果没有进一步的细节,您无法确定为什么库作者要求您使用指针而不是按值语义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多