Интересно, как написать функцию, которая возвращает массив с постоянным количеством членов. Имеет ли это смысл вообще?
Я знаю, что могу сделать что-то подобное:
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;
}
И он возвращает массив с двумя членами. Но на самом деле для «возврата» рекомендуется ожидать указатель на массив и неважно, сколько у него элементов.
Но если каким-то непредсказуемым образом будет
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;
}
Но это не работает. За любую помощь заранее спасибо.
Если вы хотите вернуть объект массива, стандартная библиотека 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;
}
Сделал бы это. Другие преимущества включают в себя отсутствие висячих ссылок и необходимость иметь дело с беспорядочным распределением памяти. Короткая и сладкая совокупность.
Есть также другой ответ, если вы имеете дело с комплексными числами. Не изобретай колесо, а используй std::complex
вместо.
В то время как @ StoryTeller’s ответ является правильным для того, что вы спросили в прямом смысле, Можно также сказать, что вы действительно хотите вернуть не массив из 2-х чисел — вы хотите вернуть комплексное число.
Теперь, в отличие от @ StefanLechner’s предложение, Я предлагаю вам использовать класс стандартной библиотеки для комплексных чисел, указанных с помощью чисел с плавающей точкой, чтобы соответствовать вашему текущему выбору точности:
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
};
}
и в вашем даже более конкретном случае просто выполните:
std::complex<float> WojtekEQgraph::_Wk_N(float k)
{
return std::polar<float>( 1.0f, -2.0f * double_Pi * k );
}
Ваш код возвращает указатель на локальную переменную, которая, скорее всего, приводит к неопределенному поведению:
float comp[2];
...
return comp;
Непосредственный ответ на ваш вопрос будет использовать std::array<float, 2>
тип данных.
Однако кажется, что вы хотите «злоупотребить» массивом для выражения комплексного числа. Я бы предложил ввести класс и вернуть объект этого класса:
struct ComplexNumber{
float real;
float imaginary;
}
ComplexNumber WojtekEQgraph::_Wk_N(float k) {
ComplexNumber c;
c.real = ...
c.imaginary = ...
return c;
}
если вы используете 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);