Возвращаемый массив с постоянным числом членов

Интересно, как написать функцию, которая возвращает массив с постоянным количеством членов. Имеет ли это смысл вообще?
Я знаю, что могу сделать что-то подобное:

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;
}

Но это не работает. За любую помощь заранее спасибо.

0

Решение

Если вы хотите вернуть объект массива, стандартная библиотека 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 вместо.

2

Другие решения

Возвращение массива фиксированной длины обычно является признаком отсутствующей абстракции

В то время как @ 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 );
}
2

Ваш код возвращает указатель на локальную переменную, которая, скорее всего, приводит к неопределенному поведению:

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;
}
1

если вы используете 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);
0
По вопросам рекламы [email protected]