gpt4 book ai didi

c++ - 如果我不打印函数参数的值,它会转换为零

转载 作者:行者123 更新时间:2023-11-28 01:22:58 25 4
gpt4 key购买 nike

我认为这是一个错误或者我不知道但是下面的代码打印了零...

double sinWave(double dAmplitude, double dFrequency, double dTime) {
std::cout << dFrequency;
return dAmplitude*sin(HzToRad(dFrequency)*dTime);

}

auto soundWave(double dAmplitude, double dFrequency) {
return [&](double x) { return sinWave(dAmplitude, dFrequency, x); };
}

这里如果在 soundWave 函数中打印 dFrequency 值,它包含正确的值。有人可以回答我为什么会这样吗

double sinWave(double dAmplitude, double dFrequency, double dTime) {
std::cout << dFrequency <<"\n";
return dAmplitude*sin(HzToRad(dFrequency)*dTime);
}

auto soundWave(double dAmplitude, double dFrequency) {
std::cout << dFrequency << "\n";
return [&](double x) { return sinWave(dAmplitude, dFrequency, x); };
}

这是 mi 的主要功能...

int main() {
auto sound = soundWave(1, octaveOf(note<B>::mFrequency, 3));
sound(1);
// for(double t = 0.0; t < 1000.0; t+=0.0001){
// std::cout << "Frequency: " << sound(1) << "\n";
// Beep(sound(t), 1);
// }
}

其中 note::mFrequency 是 30.87Hz,octaveOf 有下一个代码:

constexpr double octaveOf(double dFrecquency, int n) {
return dFrecquency*pow(2,n);
}

最佳答案

问题源于您的 lambda 通过引用捕获这一事实。在 soundWave 中,dAmplitudedFrequency 都限定在函数的生命周期内,因此当您通过引用捕获它们并返回 lambda 时,lambda 是引用不再存在的对象并使用它们是未定义的行为。

您需要做的是按值捕获,这样 lambda 就会得到它自己的函数参数拷贝,这些参数将在 lambda 的生命周期内存在。将 soundWave 更改为

auto soundWave(double dAmplitude, double dFrequency) {
return [=](double x) { return sinWave(dAmplitude, dFrequency, x); };
// ^ = means capture by value (make a copy)
}

将解决问题。

关于c++ - 如果我不打印函数参数的值,它会转换为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55245679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com