Реализовать функцию возвращающую указатель на один из массивов - C (СИ)
Формулировка задачи:
Компилятор Atmel Studio 7.
Имеется 10 двумерных массивов. Хочу реализовать функцию возвращающую указатель на один из массивов.
В данном варианте выдает ошибку несовместимого типа указателя (return from incompatible pointer type)
Если пробую через дополнительную переменную:
выдает ошибку (перевод из google) "назначение делает целое число от указателя без приведения" (assignment makes integer from pointer without a cast)
Перебрал кучу статей в интернете, но пока не могу понять что я делаю не так.
unsigned char **SymbolSelect_4str (unsigned char sym) { switch (sym) { case 0: return &Symbol_0; case 1: return &Symbol_1; case 2: return &Symbol_2; case 3: return &Symbol_3; case 4: return &Symbol_4; case 5: return &Symbol_5; case 6: return &Symbol_6; case 7: return &Symbol_7; case 8: return &Symbol_8; case 9: return &Symbol_9; } }
unsigned char **SymbolSelect_4str (unsigned char sym) { unsigned char **temp; switch (sym) { case 0: **temp = &Symbol_0; break; case 1: **temp = &Symbol_1; break; case 2: **temp = &Symbol_2; break; case 3: **temp = &Symbol_3; break; case 4: **temp = &Symbol_4; break; case 5: **temp = &Symbol_5; break; case 6: **temp = &Symbol_6; break; case 7: **temp = &Symbol_7; break; case 8: **temp = &Symbol_8; break; case 9: **temp = &Symbol_9; break; } return **temp; }
Решение задачи: «Реализовать функцию возвращающую указатель на один из массивов»
textual
Листинг программы
const unsigned char Symbol_0[4][19] = { ... }; const unsigned char *const Symbol_0_Rows[4] = { &Symbol_0[0], &Symbol_0[1], &Symbol_0[2], &Symbol_0[3] }; const unsigned char Symbol_1[8][62] = { ... }; const unsigned char *const Symbol_1_Rows[8] = { &Symbol_1[0], &Symbol_1[1], &Symbol_1[2], &Symbol_1[3], ... и т.д. }; // И т.д. для всех массивов // А затем const unsigned char *const *SymbolSelect_4str (unsigned char sym) { switch (sym) { case 0: return Symbol_0_Rows; case 1: return Symbol_1_Rows; case 2: return Symbol_2_Rows; case 3: return Symbol_3_Rows; case 4: return Symbol_4_Rows; case 5: return Symbol_5_Rows; case 6: return Symbol_6_Rows; case 7: return Symbol_7_Rows; case 8: return Symbol_8_Rows; case 9: return Symbol_9_Rows; } } // И далее const unsigned char *const *a = SymbolSelect_4str(5); unsigned char x = a[3][8];
Объяснение кода листинга программы
- Объявлены массивы Symbol_0, Symbol_1 и т.д.
- Объявлен массив Symbol_0_Rows, Symbol_1_Rows и т.д.
- Массив Symbol_0_Rows содержит адреса массивов Symbol_0[0], Symbol_0[1], Symbol_0[2], Symbol_0[3].
- Массив Symbol_1_Rows содержит адреса массивов Symbol_1[0], Symbol_1[1], Symbol_1[2], Symbol_1[3] и т.д.
- Функция SymbolSelect_4str принимает в качестве параметра unsigned char sym.
- В зависимости от значения sym, функция возвращает указатель на один из массивов.
- Значение sym равно 5, поэтому функция возвращает Symbol_5_Rows.
- Переменная a получает значение Symbol_5_Rows.
- a[3] обращается к третьему элементу массива Symbol_5_Rows, который является указателем на массив Symbol_5[3].
- a[3][8] обращается к 8-му элементу массива Symbol_5[3], который является значением элемента этого массива.
- Значение переменной x будет равно значению элемента массива Symbol_5[3][8].
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д