Принимая целое число в качестве параметра и возвращая массив - PullRequest
1 голос
/ 19 декабря 2010

Я хочу создать функцию, которая принимает целое число в качестве параметра и возвращает массив в C ++. Это псевдокод, который я имел в виду:

function returnarray(integer i)
{
    integer intarr[i];

    for (integer j = 0; j < i; j++) { intarr[j] = j; }

    return intarr;
}

Я попробовал распространенный способ объявления returnarray как функции *, возвращающей указатель, но тогда я не могу взять целое число в качестве моего параметра. Я также не могу назначить j для intarr [j]. Я действительно хотел бы избежать создания указателя на int, чтобы я мог использовать параметр.

Есть ли способ сделать это и иметь возможность присваивать j для intarr [j] без указания на него указателя?

EDIT:

забыл написать, что я хочу избегать векторов. Я использую их, только если мне действительно нужно! (мои причины мои).

Спасибо: D

Ответы [ 5 ]

10 голосов
/ 19 декабря 2010

Вы не можете вернуть выделенный стеком массив - он выйдет из области видимости и память будет освобождена. Кроме того, C ++ не позволяет размещать в стеке массивы переменной длины. Вы должны использовать std :: vector.

std::vector<int> returnarray(int i) {
    std::vector<int> ret(i);
    for(int j = 0; j < i; j++) ret[j] = j;
    return ret;
}
5 голосов
/ 19 декабря 2010

ваш код даже близко не соответствует действующему c ++, поэтому я предполагаю, что вы абсолютный новичок

использование std::vector

#include <vector>

std::vector<int> yourFunction( int n )
{
    std::vector<int>  result;
    for( int i = 0;  i < n;  ++i )
    {
        result.push_back( i );
    }
    return result;
}

Отказ от ответственности: код не тронут руками компиляторов.

Приветствия и hth.,

1 голос
/ 19 декабря 2010

Два замечания перед использованием превосходного решения @DeadMG:

1) Вы никогда не хотите избегать векторов.Если v является вектором и вам действительно нужен указатель, вы всегда можете получить указатель на первый элемент, написав &v[0].

2) Вы не можете вернуть массив.Вы вернете указатель на новую зону памяти, которую вам придется удалить, как только закончите с ней.Векторы - это только массивы с возможностью автоматического удаления, поэтому вы не потеряете память.

0 голосов
/ 19 декабря 2010

Не то, чтобы я особенно рекомендовал этот подход в целом, но вы можете использовать шаблоны для этого, не прибегая к динамическому распределению памяти. К сожалению, вы не можете возвращать массивы из функций, поэтому вам нужно будет возвращать структуру с массивом внутри.

template <int N>
struct int_array_type {
    int ints[N];
};

template <int N>
int_array_type<N> returnarray() {
    int_array_type<N> a;
    for (int i = 0; i < N; ++i)
        a.ints[i] = i;
    return a;
}

...

int_array_type<10> u = returnarray<10>();
std::copy(u.ints, u.ints+sizeof(u.ints)/sizeof(u.ints[0]),
    std::ostream_iterator<int>(std::cout, "\n"));
0 голосов
/ 19 декабря 2010

Вам необходимо использовать динамическую память.Как то так

int* returnArray(int size) {
    int* array = new int[size];
    for(int i = 0; i < size; ++i)
        array[i] = i;
    return array;
}
...