-1

我正在做一些电机控制,而不是说 39553 编码器滴答声,我的人脑说 6.5 英寸会更容易。我想通过在编译时转换它来节省处理器开销。有没有办法用预处理器指令或模板来做到这一点?谢谢。

4

3 回答 3

0

我会为此使用 a constexpr。正如@ChrisMM 提到的,它不是预处理器,但它将在编译时而不是运行时进行评估。如果您给出的值对应于刻度和英寸之间的实际关系,您可以使用:

constexpr int toTicks(double inches) {
    return int(6085 * inches);
}

通过对 int 进行强制转换,您可以确保您永远不会要求电机移动某个刻度的一小部分。使用这样的方法唯一需要注意的是,随着时间的推移,如果您要求电机移动到一堆不同的位置而不在每次移动之间返回原点,您的原点可能会随着舍入误差从转换到诠释。

于 2020-05-30T14:11:16.620 回答
0

您可以使用用户定义的文字。例如,这里是厘米到单位米的实现:

struct meter {
    double value;
};

constexpr auto operator"" _cm(double cm) -> meter
{
    return meter{cm / 100.0};
}

constexpr auto operator"" _mm(double mm) -> meter
{
    return meter{mm / 1000.0};
}

然后像这样使用它:

auto length1 = 50_cm;
auto length2 = 500_mm;

std::cout << length1.value + length2.value; // prints 1
于 2020-05-30T14:41:54.097 回答
0

我只会使用#defines:

#define CM_PER_TICK    0.01
#define toTicks(a)   (a * CM_PER_TICK)

move(toTicks(6.5));

这将归结为

move(6.5 * 0.01);

通过使用每刻度厘米而不是每厘米刻度,我们可以摆脱除法,但您将无法摆脱任何乘法。

于 2020-05-31T22:22:40.880 回答