Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 02.11.2013
Сообщений: 27
1

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

03.03.2016, 01:19. Показов 1122. Ответов 8
Метки нет (Все метки)

Компилятор Atmel Studio 7.
Имеется 10 двумерных массивов. Хочу реализовать функцию возвращающую указатель на один из массивов.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)
Если пробую через дополнительную переменную:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)
Перебрал кучу статей в интернете, но пока не могу понять что я делаю не так.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2016, 01:19
Ответы с готовыми решениями:

Реализовать функцию, возвращающую указатель на наименьший элемент матрицы
Пожалуйста, помогите написать программу на массив Написать программу с функцией, аргументом...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая...

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

По заданной формуле реализовать функцию, возвращающую значение, и функцию, не возвращающую значение
Забыл как именно нужно написать и в чем отличая. К примеру возьмем пример: x^2+2x+3 Написать с...

8
С чаем беда...
Эксперт CЭксперт С++
9428 / 4925 / 1347
Регистрация: 18.10.2014
Сообщений: 11,464
03.03.2016, 01:40 2
А объявления самих массивов увидеть не судьба?

В любом случае, в языке С тип "двумерный массив" ('[N][M]') не совместим с типом "указатель на указатель" ('**'). Эти типы не имеют ничего общего. Именно об это вам говорит компилятор в первом случае.

Во втором случае написана вообще какая-то ерунда. Мало того, что 'temp' - неинициализированный указатель, к которому нельзя применять оператор '*'. Так еще '**temp' имеет тип 'unsigned char'. Как вы собираетесь запихнуть указатель в значение типа 'unsigned char'? Именно это у вас и пытается выяснить компилятор. Не говоря уже о том, что 'return **temp' возвращает 'unsigned char', а функция объявлена как возвращающая 'unsigned char **'.

Но все равно: если ваши массивы действительно объявлены как '[N][M]', то как ни верти, '**' здесь ни к чему и вот так сразу работать в принципе не может.
0
2 / 2 / 0
Регистрация: 02.11.2013
Сообщений: 27
03.03.2016, 01:49  [ТС] 3
А можно пример какой нибудь? И объясните пожалуйста что значит увидеть объявления самих массивов?
0
С чаем беда...
Эксперт CЭксперт С++
9428 / 4925 / 1347
Регистрация: 18.10.2014
Сообщений: 11,464
03.03.2016, 02:14 4
Цитата Сообщение от DESIER Посмотреть сообщение
И объясните пожалуйста что значит увидеть объявления самих массивов?
Что такое 'Symbol_0'? Как в программе объявлена переменная 'Symbol_0'? С каким типом? То же самое для 'Symbol_1', 'Symbol_2' и т.д.
0
2 / 2 / 0
Регистрация: 02.11.2013
Сообщений: 27
03.03.2016, 02:18  [ТС] 5
Symbol_0 и все остальные это двумерные массивы типа unsigned char
C
1
2
3
4
const unsigned char Symbol_0 [4][19] = {{0x00,0xC0,0xE0,0xF8,0xFC,0xFC,0xFE,0x7E,0x1E,0x1E,0x1E,0x7E,0xFE,0xFC,0xFC,0xF8,0xE0,0xC0,0x00},
                                            {0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC},
                                            {0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F},
                            {0x00,0x03,0x0F,0x1F,0x3F,0x3F,0x7F,0x7E,0x7C,0x7C,0x7C,0x7E,0x7F,0x3F,0x3F,0x1F,0x07,0x03,0x00}};
0
С чаем беда...
Эксперт CЭксперт С++
9428 / 4925 / 1347
Регистрация: 18.10.2014
Сообщений: 11,464
03.03.2016, 02:48 6
В такой ситуации 'unsigned char **' тут вообще ни при чем.

Либо

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const unsigned char (*SymbolSelect_4str (unsigned char sym))[4][19]
{
    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;
    }
}
 
// И далее
...
const unsigned char (*a)[4][19] = SymbolSelect_4str(5);
unsigned char x = (*a)[3][8];
Либо

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const unsigned char (*SymbolSelect_4str (unsigned char sym))[19]
{
    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;
    }
}
 
// И далее
...
const unsigned char (*a)[19] = SymbolSelect_4str(5);
unsigned char x = a[3][8];
Выбирайте, как вам больше нравится. Разумеется, желательно было бы облагородить код при помощи 'typedef', чтобы не было этих трудночитаемых монстрообразных объявлений.
0
2 / 2 / 0
Регистрация: 02.11.2013
Сообщений: 27
03.03.2016, 03:02  [ТС] 7
Я правильно понял, что во втором варианте получается предварительно не указано количество строк? Можно ли сделать наоборот когда количество строк известно а количество столбцов заранее не известно? У меня все 10 массивов имеют разное количество столбцов от 13 до 21, а количество строк всегда фиксировано.
0
С чаем беда...
Эксперт CЭксперт С++
9428 / 4925 / 1347
Регистрация: 18.10.2014
Сообщений: 11,464
03.03.2016, 03:32 8
Лучший ответ Сообщение было отмечено DESIER как решение

Решение

Цитата Сообщение от DESIER Посмотреть сообщение
У меня все 10 массивов имеют разное количество столбцов от 13 до 21, а количество строк всегда фиксировано.
Вот про это я и спрашивал, а вы все стеснялись показать объявления всех массивов.

При использовании вышеуказанных "бесплатных" методов исключить из рассмотрения можно только самый первый размер массива, т.е. в данном случае `[4]`. Никакой подвижности во втором, третьем и т.д. размерах не допускается. Могу предложить переписать код так, чтобы переменный размер оказался первым, т.е. просто поменять местами размеры.

Если это невозможно, то так запросто ничего не получится. Придется создавать дополнительные индексные структуры данных и таки через них переходить к работе с '**'. Например, для полной подвижности размеров

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
2 / 2 / 0
Регистрация: 02.11.2013
Сообщений: 27
03.03.2016, 03:44  [ТС] 9
Я уже думал поменять местами индексацию, но у меня тогда с выводом будет путаница. Спасибо за пояснительный ответ, теперь все ясно, дальше сам додумаю.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2016, 03:44

Исправить функцию, возвращающую указатель на строку
Здравствуйте, не подскажите, как нужно подправить код? char* GetString() { char x; // локальный...

Реализовать  функцию, возвращающую текущий день недели
Реализовать  функцию с именем  (day_of_week), которая возвращает текущий день недели (0 для...

Реализовать функцию CountWords(s), возвращающую количество отдельных слов в строке
Реализовать функцию CountWords(s), возвращающую количество отдельных слов в строке s. Слова...

Реализовать функцию Revert(s), возвращающую строку, полученную из символов, составляющих s
2. Реализовать функцию Revert(s), возвращающую строку, полученную из символов, составляющих s,...

Написать функцию принимающую массив и возвращающую указатель на динамический массив
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий...

Написать функцию, возвращающую строку в которой между словами ровно один пробел
помогите пожалуйста в составление программы на паскале задания: 1.Дано предложение.Слова в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru