|
|
  |
Подскажите, в чем может быть ошибка? |
|
|
|
Dec 16 2010, 19:23
|
Местный
  
Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795

|
Не получается скомпилировать вот это. main.cpp Код #include <avr/pgmspace.h>
#ifdef __cplusplus #define extern "C" #endif
typedef struct PROGMEM{ const int X; const char Text[]; }Q;
int main(){ Q q1 = {0, "qqqq"}; // 13 Q q2 = {0, {0x00}}; // 14 return 0; } Компилятр AVR-GCC, makefile студийный. Ошибки ссылаются на строки объявления переменных q1 и q2: Build started 17.12.2010 at 00:17:42 avr-g++ -mmcu=atmega128 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d -c ../main.cpp cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++ ../main.cpp: In function 'int main()': ../main.cpp:13: error: initializer-string for array of chars is too long ../main.cpp:14: error: too many initializers for 'const char [0]'
|
|
|
|
|
Dec 17 2010, 01:50
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Откуда компилятор знает размер вашего типа? В определении типа необходимо указать максимальный размер строки +1!! Например, так: Код typedef struct PROGMEM{ const int X; const char Text[6]; }Q; или вообще использовать УКАЗАТЕЛЬ на char с соответствующей обработкой!
|
|
|
|
|
Dec 17 2010, 14:01
|
Местный
  
Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795

|
Цитата Откуда компилятор знает... Логично. Буду использовать указатель. Тем не менее вопрос, как правильно инициализировать последовательностью байт? Q q2 = {0, {0x00, 0x01, 0x02}};
|
|
|
|
|
Dec 17 2010, 17:59
|
Местный
  
Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795

|
Дело все в том, что мне необходимо текст отображать через HD44780, а посему, я не могу инициализировать непосредственно русскоязычной строкой. Для трансляции я использую макрос, который подменяет нужные символы, но для макроса строку приходится инициализировать побайтно.
т. е. то, что обычно делается вот так text = "ВАСЯ"; приходится делать вот так text = {RUS('В', 'А', 'С', 'Я', 0)}; что в итоге даст text = {0x42, 0x41, 0x43, 0xB1, 0x00};
Поэтому и есть желание инициализировать побайтно и по возможности в структуре.
Сообщение отредактировал Sirko - Dec 18 2010, 05:53
|
|
|
|
|
Dec 19 2010, 11:11
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата то, что обычно делается вот так text = "ВАСЯ"; приходится делать вот так text = {RUS('В', 'А', 'С', 'Я', 0)}; что в итоге даст text = {0x42, 0x41, 0x43, 0xB1, 0x00}; я что-то Вас не понимаю наверно. код Код typedef struct PROGMEM{ const int X; const char *Text; }Q;
Q q2 = {0, "VASYA))"}; ложит байтики "VASYA))" подряд же. И инизиализирует *Text адресом буквы V. Пройдитесь далее своим транслятором по этим буковкам, пока не встретите 0 и подмените что надо. А в исходнике будут обычные русские буквы, коды которых известны и прерятствий для "трансляции" нет вроде как )) Хотите туда пару байт добавить - пожалуйста Цитата Q q2 = {0, "VASYA))\x01\x02\x03"}; ноль в конце строки по прежнему будет присутствовать "сам по себе" ) Цитата Но вот как это в атмеге будет выглядеть инициализация переменной которая является константой. Простите, что именно Вам не понятно про инициализацию констант? И почему атмега тут занимает какое-то особое место? Цитата Имхо, бессмысленный код. отличный код, делающий как раз то, что просит автор )
Эскизы прикрепленных изображений
--------------------
The truth is out there...
|
|
|
|
|
Dec 19 2010, 16:17
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(sigmaN @ Dec 19 2010, 17:11)  Код typedef struct PROGMEM{ const int X; const char *Text; }Q; Q q2 = {0, "VASYA))"}; ложит байтики "VASYA))" подряд же. И инизиализирует *Text адресом буквы V. Почитайте внимательно это: http://www.nongnu.org/avr-libc/user-manual...l#faq_rom_arrayВ Вашем случае похожая ситуация, только не массив строк, а структурка из инта и указателя на строку. Но суть та же (строка и указатель на неё - две сущности, для помещения которых во флешь при помощи avr-gcc нужно 2 действия).
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 19 2010, 17:47
|
Местный
  
Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795

|
Доброго времени суток. Спасибо за дискуссию. Хоть на данном этапе я проблему обошел, тем не менее вопрос остался открытым. Цитата я что-то Вас не понимаю наверно. Вероятнее всего. А тродность моя в том, что Цитата ложит байтики "VASYA))" подряд же. И инизиализирует *Text адресом буквы V. Пройдитесь далее своим транслятором по этим буковкам, пока... транслятором по строке я могу пройтись только на этапе выполнения программы, (что в настоящее время я и реализовал). А зеленое чудовище меня давит за расточительность ресурсов. Q q2 = {0, "VASYA))\x01\x02\x03"} тоже вариант, но наглядность инициализации пропадает. Возможно есть способ строку передать в макрос и там ее обработать, но как это сделать, ума не приложу.
|
|
|
|
|
Dec 19 2010, 19:36
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Sirko @ Dec 19 2010, 23:47)  Возможно есть способ строку передать в макрос и там ее обработать, но как это сделать, ума не приложу. Может таки свой алфавит не смертельно? Кодовая таблица исходника не меняется? Я с немецким вот так борюсь: #define auml "д" "n"auml"chster Serv." В моем дисплее русская д кодовой таблицы Windows отображается как а с умляутом. С русским хуже - больше новых букв  _V_a_s_j_a, где #define _U "В" #define _a "a" Естественно, в кавычках должны быть символы кодовой таблицы, которые отображаются нужным образом в дисплее - как В а ... Мне кажется подчеркивания не так сильно гробят понимание.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|