реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Помогите новичку с указателями
masterpc
сообщение Mar 25 2008, 07:32
Сообщение #1


Частый гость
**

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



Добрый день!
Хочу сделать меню для ЖКИ 8*2 с использованием указателей. Раньше плевался на них и не хотел использовать, но вот вижу, что очень удобно их использовать если знать как.
Ниже предстален кусок кода - в структурах хранятся адреса строк, которые нужно вывести, компилятор (ИАР) выдает ошибку: Error[Pe028]: expression must have a constant value напротив всех элементов структуры. Мне бы хотелось в структкрах писать и указатели на адреса строк, которые во флеше, и указатели на функции, чтобы можно было вывести целые числа, возможно указатели на строки хранящиеся в ОЗУ. Все эти структуры я запихиваю в массив и потом по обращению к элементам массива могу вывожить данные на ЖКИ.
Может быть где-то некорректно выразился - простите, я пока в этих делах не очень 01.gif



__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));
}
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 25 2008, 07:40
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А вы определите так
Код
__flash const byte s0[]=" MASTER ";
...
Go to the top of the page
 
+Quote Post
masterpc
сообщение Mar 25 2008, 07:48
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 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

Неужели никак нельзя использовать одновременно указатели на флеш-массивы, указатели на функции, и указатели на переменные?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 25 2008, 08:16
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
masterpc
сообщение Mar 25 2008, 08:36
Сообщение #5


Частый гость
**

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



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


Сильно не ругайте :-) Я тут пока своему коллеге обьяснил, что хочу делать, то час прошел.
Значит так:
Хочу сделать массив указателей на структуры, в каждой из которых три элемента. Первые два указывают на строки, выводимые на индикатор (могут лежать в флеше или в ОЗУ) или адрес функции, где берется какое нибудь число и преобразуется в строку для дальнейшего вывода. Третий элемент структуры - целое число (или в ОЗУ или в флеше, еще не определился).
Вроде старался как можно понятнее выразится 05.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 25 2008, 09:06
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
masterpc
сообщение Mar 25 2008, 09:35
Сообщение #7


Частый гость
**

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



Цитата(Сергей Борщ @ Mar 25 2008, 11:06) *
А как вы будете в программе отличать, как обрабатывать такой указатель - как указатель на строку или указатель на функцию?

Не знаю... crying.gif

Третий элемент структуры менятся не будет, можно использовать флеш.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 25 2008, 11:12
Сообщение #8


Гуру
******

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



Цитата(masterpc @ Mar 25 2008, 11:35) *
Не знаю... crying.gif
Тогда давайте отодвинем пока вопрос "как сделать" и начнем с вопроса "что делать". Что должна делать эта хитрая конструкция?
Цитата(masterpc @ Mar 25 2008, 11:35) *
Третий элемент структуры менятся не будет, можно использовать флеш.
Если это число 16 бит, то лучше его хранить прямо в структуре - оно займет столько же места, сколько и указатель.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
masterpc
сообщение Mar 25 2008, 11:28
Сообщение #9


Частый гость
**

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



Цитата(Сергей Борщ @ Mar 25 2008, 13:12) *
Тогда давайте отодвинем пока вопрос "как сделать" и начнем с вопроса "что делать". Что должна делать эта хитрая конструкция?


Нужно сделать сложное меню для ЖКИ 2х8. Кроме символьных строк нужно выводить переменные различного типа преобразуя их в строки, выходит нужно выводить как строки из флеша так и из ОЗУ. Я хотел организовать двухмерное меню, каждая строка которого являет собой определенное подменю, где нулевая ячейка - количество пунктов текущего подменю, далее идут ячейки с адресом структуры указателей для вывода строк на ЖКИ, последняя ячейка - стек.
Go to the top of the page
 
+Quote Post
sKWO
сообщение Mar 25 2008, 13:15
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(masterpc @ Mar 25 2008, 15:28) *
Нужно сделать сложное меню для ЖКИ 2х8. Кроме символьных строк нужно выводить переменные различного типа преобразуя их в строки, выходит нужно выводить как строки из флеша так и из ОЗУ. Я хотел организовать двухмерное меню, каждая строка которого являет собой определенное подменю, где нулевая ячейка - количество пунктов текущего подменю, далее идут ячейки с адресом структуры указателей для вывода строк на ЖКИ, последняя ячейка - стек.

Для начала можно посмотреть меню организованное на основе "Машины состояний" отладочного модуля
"АВРБабочки" smile.gif . Для ИАР прикрепляю код

Цитата(masterpc @ Mar 25 2008, 15:28) *
Нужно сделать сложное меню для ЖКИ 2х8. Кроме символьных строк нужно выводить переменные различного типа преобразуя их в строки, выходит нужно выводить как строки из флеша так и из ОЗУ. Я хотел организовать двухмерное меню, каждая строка которого являет собой определенное подменю, где нулевая ячейка - количество пунктов текущего подменю, далее идут ячейки с адресом структуры указателей для вывода строк на ЖКИ, последняя ячейка - стек.

Сервер чёта глючит. Отправил сообщение и не вижу его, повторю...
За пример как организовать меню можно взять меню на основе "Машины состояний" . Насколько я понимаю то вы програмируете на ИАРе. Поэтому выложу код для "АВРбабочки" на иаре. В книге Joe Pardue. C Programming for Microcontrollers немножко больше информации по этому коду.
Прикрепленные файлы
Прикрепленный файл  AVRButterfly_application_rev07.zip ( 64.82 килобайт ) Кол-во скачиваний: 64
 


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 25 2008, 16:22
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Небольшой примерчик.

CODE

typedef char const __flash *PFLASH_STR;
typedef char *PRAM_STR;
typedef void (*PCALLBACK)(void);


typedef struct tagMENU_ITEM
{
PFLASH_STR pFlashStr;
PRAM_STR pRamStr;
PCALLBACK cb;
} TMENU_ITEM, *PMENU_ITEM;

const __flash char fl_str0[] = "hello fl0";
const __flash char fl_str1[] = "hello fl1";
const __flash char fl_str2[] = "hello fl2";

char ram_str0[] = "hello ram";

void my_func(void)
{
}

void my_func2(void)
{
}

void my_func3(void)
{
}


TMENU_ITEM menuitems[] =
{
{ NULL, NULL, my_func },
{ fl_str0, NULL, NULL },
{ fl_str1, NULL, NULL },
{ fl_str2, NULL, my_func2 },
{ NULL, ram_str0, my_func3 }
};

#define COUNT(some_array) ( sizeof(some_array)/sizeof(some_array[0]) )


void flash_print( PFLASH_STR str )
{
char buf[ 32 ];
char *dst = buf;
while(*str)
*dst++ = *str++;
*dst = 0;
printf("%s", buf);
}


void MenuTest(void)
{
int i;
PMENU_ITEM pItem;

for (i = 0; i < COUNT( menuitems ); i++)
{
pItem = &menuitems[ i ];

if (pItem->pFlashStr)
flash_print( pItem->pFlashStr );
if (pItem->pRamStr)
printf("%s", pItem->pRamStr);
if (pItem->cb != NULL)
pItem->cb(); // Запуск функции обработки
}
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 05:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01454 секунд с 7
ELECTRONIX ©2004-2016