niten_d0raku
@niten_d0raku

Как вернуть двумерный массив?

int** discribeTwoDimensional() {
	static int masInt[3][5];
	srand(static_cast<int>(time(0)));
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 5; j++) {
			masInt[i][j] = rand() % 100;
			printf("%d ", masInt[i][j]);
		}
		printf("\n");
	}
	return masInt; // тип возвращаемого значение не соответствует типу функции
}
  • Вопрос задан
  • 264 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
int masInt[3][5] - вот такие массивы c фиксированными размерами на самом деле хранятся одним куском и индексацию компилятор вычисляет сам. Это не int**, а int[][5]. Только этот тип нельзя вернуть из функции.

Что бы вернуть именно указатель на указатель, вам надо его так и завести и не забыть выделить по строкам:
int** masInt = new int* [3];
for (int i = 0; i < 3; ++i) {
  masInt[i] = new int[5];
}


Не забудьте только потом удалить все это добро через delete[]:
for (int i = 0; i < 3; ++i) {
  delete[] array[i];
}
delete[] array;


Но вообще, лучше не парить себе мозги и возвращать std::vector<std::array<int,5>>.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
так:
// удален не верный пример
или так:
int* discribeTwoDimensional() { 
  ... 
  return (int*)masInt; 
}

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

Возвращать статические переменные определенные внутри функции не правильный подход. Обычно такие статические переменные используются только в этой функции.
Лучше принимайте массив в параметре и инициализируйте его. Тогда и возвращать ничего не придется и подход будет правильным.
Ответ написан
@rPman
Помню очень очень давно, когда мне нужен был объект двумерный массив с заданными константами размерами (и достаточно маленький чтобы не перегружать стек), а так же мне не нравилось что двумерные массивы требовали дополнительный массив ссылок, который еще нужно было инициализировать, я создавал класс (формально два, так как перегружать оператор [] можно только один раз, для второй перегрузки нужен класс посредник), симулирующий поведение двумерного массива на одномерном, при этом сам массив определялся не как ссылка на него, а как собственно сам объект
нытье
сейчас я код свой старый не найду, мне лень но я попросил chatgpt все написать, и о чудо, bing copilot не справился (отвратительно, майкрософт испортила хороший инструмент) хотя он понял концепцию но умудрился наделать кучу ошибок, пришлось чинить, в прошлом году он прекрасно с таким простым кодом справлялся. Не так, если воспользоваться площадкой для ботов coze, там используется gpt4, то результат получается верным (нет он тоже напортачил в подсчете смещения в массиве), это именно майкрософтовский сопилот тупой
template<typename T,size_t RowNum, size_t ColNum>
class Array2D {
private:
	T arr[RowNum*ColNum];

public:
	class Proxy
	{
	private:
		T* _arr;

	public:
		Proxy(T arr[]) : _arr(arr) {}

		T& operator[](size_t index)
		{
			return _arr[index];
		}
	};

	Proxy operator[](size_t index)
	{
		return Proxy(&arr[index*ColNum]);
	}
};

typedef Array2D<int, 3, 5> mas35;

mas35 test()
{
	return *(new mas35); // с этим нужно быть предельно осторожным, так как бездумно можно получить утечки памяти
}

int main()
{
	mas35 a=test();
	a[1][0] = 5;
// ...
	return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы