Реализовать функцию возвращающую указатель на один из массивов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Компилятор Atmel Studio 7. Имеется 10 двумерных массивов. Хочу реализовать функцию возвращающую указатель на один из массивов.
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;
    }
}
В данном варианте выдает ошибку несовместимого типа указателя (return from incompatible pointer type) Если пробую через дополнительную переменную:
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;
}
выдает ошибку (перевод из google) "назначение делает целое число от указателя без приведения" (assignment makes integer from pointer without a cast) Перебрал кучу статей в интернете, но пока не могу понять что я делаю не так.

Решение задачи: «Реализовать функцию возвращающую указатель на один из массивов»

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];

Объяснение кода листинга программы

  1. Объявлены массивы Symbol_0, Symbol_1 и т.д.
  2. Объявлен массив Symbol_0_Rows, Symbol_1_Rows и т.д.
  3. Массив Symbol_0_Rows содержит адреса массивов Symbol_0[0], Symbol_0[1], Symbol_0[2], Symbol_0[3].
  4. Массив Symbol_1_Rows содержит адреса массивов Symbol_1[0], Symbol_1[1], Symbol_1[2], Symbol_1[3] и т.д.
  5. Функция SymbolSelect_4str принимает в качестве параметра unsigned char sym.
  6. В зависимости от значения sym, функция возвращает указатель на один из массивов.
  7. Значение sym равно 5, поэтому функция возвращает Symbol_5_Rows.
  8. Переменная a получает значение Symbol_5_Rows.
  9. a[3] обращается к третьему элементу массива Symbol_5_Rows, который является указателем на массив Symbol_5[3].
  10. a[3][8] обращается к 8-му элементу массива Symbol_5[3], который является значением элемента этого массива.
  11. Значение переменной x будет равно значению элемента массива Symbol_5[3][8].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5
Похожие ответы