Return 成员数为常量的数组
Return array with const number of members
我想知道如何编写 returns 数组成员数不变的函数。这有意义吗?
我知道我可以做这样的事情:
float* WojtekEQgraph::_Wk_N(float k)
{
float comp[2];
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
它 returns 有两个成员的数组。但实际上 "return" 推荐期望指向数组的指针,无论它有多少成员。
但是如果以某种不可预知的方式会有
float comp[3]
或 float comp[1]
我希望 return comp;
会给我错误。
我该怎么做?
我试过了:
float[2] WojtekEQgraph::_Wk_N(float k)
{
float comp[2];
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
但是没有用。如有任何帮助,请提前致谢。
如果你想return一个数组对象,C++标准库拼写为std::array
。所以将它应用到你的例子中:
std::array<float, 2> WojtekEQgraph::_Wk_N(float k)
{
std::array<float, 2> comp;
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
会的。其他优点包括没有悬挂引用和需要处理混乱的内存分配。简短而甜蜜的聚合。
如果您处理的是复数,还有另一个答案。不要 re-invent 轮子,而是使用 std::complex
。
如果您使用的是 c++11,一种解决方案是使用 std::array
std::array< float, 2 > WojtekEQgraph::_Wk_N(float k)
{
std::array< float, 2 > comp;
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
另一种方法是将数组传递给方法:
void WojtekEQgraph::_Wk_N(float k, float comp[2])
{
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
}
float comp[2];
obj._Wk_N(0, comp);
您的代码 return 是一个指向局部变量的指针,这很可能会产生未定义的行为:
float comp[2];
...
return comp;
您问题的直接答案是使用 std::array<float, 2>
数据类型。
但是,您似乎想要"abuse"一个数组来表示一个复数。我建议引入 class 和 return 这个 class 的对象:
struct ComplexNumber{
float real;
float imaginary;
}
ComplexNumber WojtekEQgraph::_Wk_N(float k) {
ComplexNumber c;
c.real = ...
c.imaginary = ...
return c;
}
返回 fixed-length 数组通常是缺少抽象的标志
虽然@StoryTeller 的 是您 字面意思 所问的正确 ,但也可以说您真正想要 return 的是不是 "array of 2 floats" - 你想要 return 一个复数。
现在,与@StefanLechner 的 不同,我建议您将标准库的 class 用于复数,用浮点数指定以适合您当前的精度选择:
std::complex<float> WojtekEQgraph::_Wk_N(float k)
{
return {
cos(-2.0f * double_Pi * (float)k), // Real number
sin(-2.0f * double_Pi * (float)k), // Imag number
};
}
在您的 even-more-specific 案例中,只需执行:
std::complex<float> WojtekEQgraph::_Wk_N(float k)
{
return std::polar<float>( 1.0f, -2.0f * double_Pi * k );
}
我想知道如何编写 returns 数组成员数不变的函数。这有意义吗? 我知道我可以做这样的事情:
float* WojtekEQgraph::_Wk_N(float k)
{
float comp[2];
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
它 returns 有两个成员的数组。但实际上 "return" 推荐期望指向数组的指针,无论它有多少成员。 但是如果以某种不可预知的方式会有
float comp[3]
或 float comp[1]
我希望 return comp;
会给我错误。
我该怎么做?
我试过了:
float[2] WojtekEQgraph::_Wk_N(float k)
{
float comp[2];
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
但是没有用。如有任何帮助,请提前致谢。
如果你想return一个数组对象,C++标准库拼写为std::array
。所以将它应用到你的例子中:
std::array<float, 2> WojtekEQgraph::_Wk_N(float k)
{
std::array<float, 2> comp;
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
会的。其他优点包括没有悬挂引用和需要处理混乱的内存分配。简短而甜蜜的聚合。
如果您处理的是复数,还有另一个答案。不要 re-invent 轮子,而是使用 std::complex
。
如果您使用的是 c++11,一种解决方案是使用 std::array
std::array< float, 2 > WojtekEQgraph::_Wk_N(float k)
{
std::array< float, 2 > comp;
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
另一种方法是将数组传递给方法:
void WojtekEQgraph::_Wk_N(float k, float comp[2])
{
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
}
float comp[2];
obj._Wk_N(0, comp);
您的代码 return 是一个指向局部变量的指针,这很可能会产生未定义的行为:
float comp[2];
...
return comp;
您问题的直接答案是使用 std::array<float, 2>
数据类型。
但是,您似乎想要"abuse"一个数组来表示一个复数。我建议引入 class 和 return 这个 class 的对象:
struct ComplexNumber{
float real;
float imaginary;
}
ComplexNumber WojtekEQgraph::_Wk_N(float k) {
ComplexNumber c;
c.real = ...
c.imaginary = ...
return c;
}
返回 fixed-length 数组通常是缺少抽象的标志
虽然@StoryTeller 的
现在,与@StefanLechner 的
std::complex<float> WojtekEQgraph::_Wk_N(float k)
{
return {
cos(-2.0f * double_Pi * (float)k), // Real number
sin(-2.0f * double_Pi * (float)k), // Imag number
};
}
在您的 even-more-specific 案例中,只需执行:
std::complex<float> WojtekEQgraph::_Wk_N(float k)
{
return std::polar<float>( 1.0f, -2.0f * double_Pi * k );
}