C ++ возвращает массив из функции - PullRequest
5 голосов
/ 05 января 2012

Мне нужно прочитать массив в моей функции, извлечь данные, а затем вернуть массив из функции.

Массив будет содержать только 2 значения.

Вот что я хочу сделать в концепции:

int myfunction(int my_array[1])
{
    int f_array[1];
    f_array[0] = my_array[0];
    f_array[1] = my_array[1];

    // modify f_array some more

    return f_array;
}

Я читал об указателях и т. Д., Но очень запутался и был бы признателен за простой пример того, как лучше всего подойти к этому!

Спасибо!

Ответы [ 8 ]

9 голосов
/ 05 января 2012

Вы не можете вернуть n встроенный массив в C ++.

Если вы новичок в c ++ и запутались в указателях, вы действительно не хотите использовать массивы (по крайней мере, не встроенные массивы). Вместо этого используйте std::vector<int> или, если у вас есть только определенное количество элементов, и вы хотите выразить это (и вам действительно нужна лучшая производительность), используйте boost::array<int, N>. (Или даже std::array<int, N>, если вы запрограммируйте в C++11 (если вы не знаете, программируете ли вы в C++11, скорее всего, вы этого не сделаете). Например:

std::vector<int> myfunction(const std::vector<int>& my_array) {
  std::vector<int> f_array;
  for(int i = 0; i < my_array.size(); ++i)
    f_array.push_back(my_array[i]);
  return f_array;
}

boost::array<int, 2> myfunction(const boost::array<int, 2>& my_array) {
  boost::array<int, 2> f_array;
  f_array[0] = my_array[0];
  f_array[1] = my_array[1];
  return f_array;
}

Затем вы можете сделать свой код копирования проще (посмотрите на конструкторы и функции-члены любого класса, который вы решите использовать, а также алгоритмы STL). Пример:

std::vector<int> myfunction(const std::vector<int>& my_array) {
  std::vector<int> f_array(m_array);
  ...
  return f_array;
}

В качестве еще одного пункта в вашем коде есть ошибка: вы определяете my_array как int my_array[1], то есть массив с одним элементом, но вы получаете доступ к двум элементам (my_array[0] и my_array[1]), доступ к my_array[1] выходит за пределы (int foo[N] имеет место для N элементов, начиная с индекса 0 и заканчивая индексом N-1). Я полагаю, вы действительно имеете в виду int my_array[2].

4 голосов
/ 05 января 2012
std::array<int,2> myfunction(int * my_array)
{
    std::array<int,2> f_array;
    f_array[0] = my_array[0];
    f_array[1] = my_array[1];

    // modify f_array some more

    return f_array;
}

Обратите внимание, что в качестве параметра int my_array[1] в точности совпадает с int my_array[1000], int my_array[] или int * my_array. Это просто указатель, а значение размера не имеет смысла. Это не относится к обычным объявлениям массивов, только к параметрам.

Чтобы убедиться, что вам передаются только массивы размера 2, вы можете взять массив по ссылке:

std::array<int,2> myfunction(int (&my_array)[2])
1 голос
/ 05 января 2012

Если у вас будет строго 2 элемента в массиве, я предлагаю std::pair

typedef std::pair<int,int> int_pair;

int_pair myfunction(int_pair ip)
{
  ip.first *= 0.12;
  ip.second -= 355; 
  return ip;
}
1 голос
/ 05 января 2012

Если вам когда-нибудь понадобятся только два значения, я бы посмотрел на std :: pair , в конце концов, это то, для чего оно существует. Он также имеет правильную семантику копирования (перемещения в c ++ 11) для правильной работы.

0 голосов
/ 23 марта 2014

C ++ не позволяет возвращать весь массив в качестве аргумента функции.Однако вы можете вернуть указатель на массив, указав имя массива без индекса.

Чтобы вернуть одномерный массив из функции, вы должны объявить функцию, возвращающую указатель, как показано ниже:

int * myfunc(){
      static int arr[size_of_array];
      /*

       code for manipulation of arr

       */
    return arr;
   }

Переменные, объявленные в теле функции, уничтожаются сразу после выхода из функционального блока.Таким образом, мы должны объявить int arr[size_of_arr] как static.Это выделит память для int arr[size_of_arr] в куче и гарантирует, что она не будет уничтожена, как только мы покинем функциональный блок.

Способ вызова myfunc() описан ниже:

int *myarray;
myarray=myfunc();

Теперь массив, возвращаемый myfunc(), сохраняется в myarray

0 голосов
/ 05 января 2012

Вы не можете вернуть массив из функции, но вы можете добавить второй аргумент для массива "out":

void foo(int array_in[], int array_out[], int array_size)
{
    for (int i = 0; i < array_size; i++)
        array_out[i] = array_in[i];
}
0 голосов
/ 05 января 2012

Массив с двумя значениями должен быть объявлен как int my_array[2]. В любом случае, вы не можете копировать массивы по значению. Вы сказали, что у вас будет только два целых объекта. Поэтому я предлагаю вам использовать pair<int,int> вместо.

using namespace std;
pair<int,int> myfunction(pair<int,int> my_array)
{
  pair<int,int> f_array;
  f_array.first = my_array.first;
  f_array.second = my_array.second;

  // modify f_array some more

  return f_array;
}
0 голосов
/ 05 января 2012

Вы не можете вернуть массив в C или C ++.

Поскольку вы работаете в C ++, используйте контейнерный класс вместо необработанного массива.A std::vector или boost::array были бы хорошими вариантами.

...