|
Помогите новичку с указателями |
|
|
|
Mar 25 2008, 07:32
|

Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788

|
Добрый день! Хочу сделать меню для ЖКИ 8*2 с использованием указателей. Раньше плевался на них и не хотел использовать, но вот вижу, что очень удобно их использовать если знать как. Ниже предстален кусок кода - в структурах хранятся адреса строк, которые нужно вывести, компилятор (ИАР) выдает ошибку: Error[Pe028]: expression must have a constant value напротив всех элементов структуры. Мне бы хотелось в структкрах писать и указатели на адреса строк, которые во флеше, и указатели на функции, чтобы можно было вывести целые числа, возможно указатели на строки хранящиеся в ОЗУ. Все эти структуры я запихиваю в массив и потом по обращению к элементам массива могу вывожить данные на ЖКИ. Может быть где-то некорректно выразился - простите, я пока в этих делах не очень
__flash byte *const s0=" MASTER "; __flash byte *const s1=" v-0.1a "; __flash byte *const s2=" Журнал "; __flash byte *const s3=" работы "; __flash byte *const s4="Конфиг. "; __flash byte *const s5="системы "; __flash byte *const s6=" Ручной "; __flash byte *const s7=" режим "; __flash byte *const s8="Текущие "; __flash byte *const s9="настр-ки";
int *pperem;
/*Структуры всех пунктов меню*/ struct MENU{ byte *st1; byte *st2; //__flash byte *next; }mas[]={ s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, pperem, pperem, };
void Hardwareinit (void) {
struct MENU ku; ku=mas[1]; //элемент массива - адрес структуры Out_LCD(1,1, (ku.st1)); Out_LCD(2,1, (ku.st2)); }
|
|
|
|
|
 |
Ответов
|
Mar 25 2008, 07:48
|

Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788

|
Цитата(KRS @ Mar 25 2008, 09:40)  А вы определите так Код __flash const byte s0[]=" MASTER "; ... Определил вот так: Код __flash byte s0[]=" MASTER "; ... но пришлось также изменить обьявленя структуры, теперь указатели также флеш-типа Код struct MENU{ __flash byte *st1; __flash byte *st2; //__flash byte *next; }mas[]={ s0, s1, ... Теперь ругается только на указатель pperemНеужели никак нельзя использовать одновременно указатели на флеш-массивы, указатели на функции, и указатели на переменные?
|
|
|
|
|
Mar 25 2008, 08:16
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(masterpc @ Mar 25 2008, 09:48)  Определил вот так: Код __flash byte s0[]=" MASTER "; ... Шаманство. От непонимания, что означает то, что вы написали, пытаетесь написать то же самое другими словами и при этом случайно(!) пишите не совсем то, что было сначала. На что ругался компилятор - не разобрались, значит в дальнейшем в аналогичных ситуациях будете получать аналогичные ошибки. Достаточно было написать __flash byte const * const т.е. константный указатель на константный byte. Кстати, здесь то самое место, где char имеет "первозданный" смысл, т.е. он обозначает именно символ. Поэтому здесь для читабельности исходников лучше было оставить char вместо byte. Цитата(masterpc @ Mar 25 2008, 09:48)  но пришлось также изменить обьявленя структуры, теперь указатели также флеш-типа [code] struct MENU{ __flash byte *st1; Естественно. Поскольку для доступа к флеш и к ОЗУ в АВРах используются разные команды, то надо явно сообщать компилятору, что указатель будет указывать на флеш. И не забывать использовать const. Цитата(masterpc @ Mar 25 2008, 09:48)  Теперь ругается только на указатель pperem Неужели никак нельзя использовать одновременно указатели на флеш-массивы, указатели на функции, и указатели на переменные? Использовать можно. Объясните словами, что вы хотели сделать. Я, например, не понял - как компилятор должен был на этапе компиляции в начальное значение элемента структуры типа __flash const char * положить значение(!) указвтеля типа int *. Неудивительно, что компилятор этого тоже не понял.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 25 2008, 08:36
|

Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788

|
Цитата(Сергей Борщ @ Mar 25 2008, 10:16)  Объясните словами, что вы хотели сделать. Я, например, не понял - как компилятор должен был на этапе компиляции в начальное значение элемента структуры типа __flash const char * положить значение(!) указвтеля типа int *. Неудивительно, что компилятор этого тоже не понял. Сильно не ругайте :-) Я тут пока своему коллеге обьяснил, что хочу делать, то час прошел. Значит так: Хочу сделать массив указателей на структуры, в каждой из которых три элемента. Первые два указывают на строки, выводимые на индикатор (могут лежать в флеше или в ОЗУ) или адрес функции, где берется какое нибудь число и преобразуется в строку для дальнейшего вывода. Третий элемент структуры - целое число (или в ОЗУ или в флеше, еще не определился). Вроде старался как можно понятнее выразится
|
|
|
|
|
Mar 25 2008, 09:06
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(masterpc @ Mar 25 2008, 10:36)  Первые два указывают на строки, выводимые на индикатор (могут лежать в флеше или в ОЗУ) Тогда смотрете в сторону generic pointers. Цитата(masterpc @ Mar 25 2008, 10:36)  или адрес функции, где берется какое нибудь число и преобразуется в строку для дальнейшего вывода. Использовать union. А как вы будете в программе отличать, как обрабатывать такой указатель - как указатель на строку или указатель на функцию? Цитата(masterpc @ Mar 25 2008, 10:36)  Третий элемент структуры - целое число (или в ОЗУ или в флеше, еще не определился). Это число может меняться в процессе выполнения программы?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
masterpc Помогите новичку с указателями Mar 25 2008, 07:32     masterpc Цитата(Сергей Борщ @ Mar 25 2008, 11:06) ... Mar 25 2008, 09:35      Сергей Борщ Цитата(masterpc @ Mar 25 2008, 11:35) Не ... Mar 25 2008, 11:12       masterpc Цитата(Сергей Борщ @ Mar 25 2008, 13:12) ... Mar 25 2008, 11:28        sKWO Цитата(masterpc @ Mar 25 2008, 15:28) Нуж... Mar 25 2008, 13:15 defunct Небольшой примерчик.
CODE
typedef char const __fl... Mar 25 2008, 16:22
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|