Вернуть 2d массив из переполнения стека

Внутри функции я создаю 2d массив, который заполняет себя из текстового файла и должен быть возвращен в main. Массив остается постоянным во всей программе.

Я знаю, что об этом часто спрашивают, но я всегда получаю один из двух ответов:

Используйте std :: vector или std :: array или другую функцию STD. Я не очень понимаю, как они работают, есть ли какой-нибудь сайт, объясняющий их и как они действуют по сравнению с обычными массивами? Есть ли какие-то специальные #include, которые мне нужны?

Или же

Используйте указатель на массив и верните указатель. Во-первых, на некоторые ответы на этот вопрос он, очевидно, не работает из-за локальных массивов. Как я могу сказать, когда это работает и не работает? Как я могу использовать этот массив обратно в основной функции?

У меня больше проблем с концепцией указателей и std :: вещи, чем с реальным кодом, поэтому, если есть сайт, который, как вы знаете, объясняет это особенно хорошо, не стесняйтесь просто добавить это.

0

Решение

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

#include <vector>
#include <iostream>

using array2D = std::vector< std::vector< int > >;

array2D MyFunc(int x_size, int y_size)
{
array2D array(y_size, vector< int >(x_size));

int i = 0;
for (int y = 0; y < array.size(); y++)
{
for (int x = 0; x < array[y].size(); x++)
{
// note the order of the index
array[y][x] = i++;
}
}

return array;
}

int main()
{
array2D bob = MyFunc(10, 5);
for (int y = 0; y < bob.size(); y++)
{
for (int x = 0; x < bob[y].size(); x++)
{
cout << bob[y][x] << "\n";
}
}
}

Живой пример:
http://ideone.com/K4ilfX

3

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

Самый простой способ создать 2d массив заключается в следующем:

char (*array)[10];
array = new array[5][10];

Двумерные массивы сложно описать. Скобки выше в объявлении переменной важны, чтобы сообщить компилятору array указатель на массив из 10 символов

Это действительно важно понимать указатели с C а также C++ если не использовать std:: коллекции. Даже тогда, указатели широко распространены, и неправильное использование может иметь разрушительные последствия для программы.

0

Похоже, вы новичок в C ++. Если это действительно так, я бы посоветовал использовать массивы на данный момент, потому что вы, вероятно, не будете использовать то, что дают вам контейнеры STL. Теперь поговорим об указателях.

Вы правы в том, что если вы объявите в своей функции локальный массив, функция main не будет иметь к нему доступа. Однако это не тот случай, если вы динамически распределять массив с использованием new ключевое слово. Когда вы используете new чтобы выделить свой массив, вы, по сути, говорите компилятору зарезервировать кусок памяти для вашей программы. Вы можете получить к нему доступ, используя указатель, на самом деле это просто адрес того куска памяти, который вы зарезервировали. Следовательно, вместо передачи всего массива в основную функцию все, что вам нужно сделать, это передать указатель (адрес) на этот массив.

Вот некоторые соответствующие объяснения. Я добавлю к ним, как я нахожу больше:

0
По вопросам рекламы [email protected]