Задать вопрос
mrjbom
@mrjbom

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

Имеется заголовочный файл с двухмерным массивом, я пытаюсь вернуть указатель на этот массив через функцию.
Массив объявлен таким образом в .h файле
static bool symbol_Bool_Map_English_Upper_A[16][15] = { ... };

Там же объявлена функция которая возвращает на него указатель
bool** getSymbolBoolMap(char symbol)
{
	switch (symbol)
	{
	case 'A':
		return (bool**)symbol_Bool_Map_English_Upper_A;
		break;
	default:
		break;
	}
}

И в main коде я пытаюсь вывести значения
int main()
{
	bool** arrayPtr = getSymbolBoolMap('A');

	if (arrayPtr == nullptr)
		std::cout << "error\n";

	for (int j = 0; j < 16; ++j)
	{
		for (int i = 0; i < 15; ++j)
		{
			std::cout << arrayPtr[j][i] << " ";
		}
		std::cout << std::endl;
	}
	return 0;
}


У меня падает исключение при попытке получить доступ к элементу, хотя я проверяю всё на nullptr и указатель не нулевой, нулевым он становится только при попытке доступа к элементу.
  • Вопрос задан
  • 1501 просмотр
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
typedef bool SymbolBoolMap[16][15];
static SymbolBoolMap symbol_Bool_Map_English_Upper_A = { ... };

и возвращай [const] SymbolBoolMap&.

Вообще есть два разных метода организации многомерных массивов: кусок памяти M×N и одномерный массив[M] указателей на массивы[N].
Если для одномерных массивов кусок памяти длины N впрямую конвертируется в указатель (и даже при определённых условиях всё работает), то в многомерных первое и второе НЕСОВМЕСТИМЫ.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
solotony
@solotony
покоряю пик Балмера
bool** это не указатель на двумерный массив, а указатель на указатель на bool

используй typedef что бы все было ясно и понятно

typedef bool row[15];
typedef row matrix[16];

p.s. хотя конечно в C++ надо было бы все это добро обернуть в класс
Ответ написан
Ваш ответ на вопрос

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

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