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

 
 
 
Reply to this topicStart new topic
> Подскажите, в чем может быть ошибка?
Sirko
сообщение Dec 16 2010, 19:23
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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]'
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Dec 17 2010, 01:50
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Откуда компилятор знает размер вашего типа?
В определении типа необходимо указать максимальный размер строки +1!!
Например, так:
Код
typedef struct PROGMEM{
    const int    X;    
    const char  Text[6];
}Q;


или вообще использовать УКАЗАТЕЛЬ на char с соответствующей обработкой!
Go to the top of the page
 
+Quote Post
Sirko
сообщение Dec 17 2010, 14:01
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Цитата
Откуда компилятор знает...


Логично.
Буду использовать указатель.
Тем не менее вопрос, как правильно инициализировать последовательностью байт?

Q q2 = {0, {0x00, 0x01, 0x02}};


Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 17 2010, 17:42
Сообщение #4


I WANT TO BELIEVE
******

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



может так?
Код
typedef struct PROGMEM{
    const int    X;    
    const char  *Text;
}Q;

Q q2 = {0, "VASYA))"};

компилятор положит строку VASYA себе в константы, а указателю присвоит адрес на первый символ.



--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 17 2010, 17:43
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Я конечно, в сях не специалист. Но вот как это в атмеге будет выглядеть инициализация переменной которая является константой. Т.е. объектом, который лежит в памяти программ.... Да и вроде как Си позволяет менять константы токо на этапе объявления.

Имхо, бессмысленный код.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Sirko
сообщение Dec 17 2010, 17:59
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Дело все в том, что мне необходимо текст отображать через HD44780, а посему, я не могу инициализировать непосредственно русскоязычной строкой.
Для трансляции я использую макрос, который подменяет нужные символы, но для макроса строку приходится инициализировать побайтно.

т. е.
то, что обычно делается вот так
text = "ВАСЯ";
приходится делать вот так
text = {RUS('В', 'А', 'С', 'Я', 0)};
что в итоге даст
text = {0x42, 0x41, 0x43, 0xB1, 0x00};

Поэтому и есть желание инициализировать побайтно и по возможности в структуре.

Сообщение отредактировал Sirko - Dec 18 2010, 05:53
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 17 2010, 20:07
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Правильно. Зачем искать простой путь и инициализировать простыми и понятными числами.
Вам еще повезло, что вы не китаец.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 19 2010, 11:11
Сообщение #8


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...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 19 2010, 16:17
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 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 действия).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 19 2010, 17:46
Сообщение #10


I WANT TO BELIEVE
******

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



аххх во флеше... вот блин. мой косяк.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Sirko
сообщение Dec 19 2010, 17:47
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Доброго времени суток. Спасибо за дискуссию.
Хоть на данном этапе я проблему обошел, тем не менее вопрос остался открытым.

Цитата
я что-то Вас не понимаю наверно.

Вероятнее всего.

А тродность моя в том, что
Цитата
ложит байтики "VASYA))" подряд же. И инизиализирует *Text адресом буквы V. Пройдитесь далее своим транслятором по этим буковкам, пока...

транслятором по строке я могу пройтись только на этапе выполнения программы, (что в настоящее время я и реализовал). А зеленое чудовище меня давит за расточительность ресурсов. Q q2 = {0, "VASYA))\x01\x02\x03"} тоже вариант, но наглядность инициализации пропадает. Возможно есть способ строку передать в макрос и там ее обработать, но как это сделать, ума не приложу.

Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 19 2010, 18:27
Сообщение #12


I WANT TO BELIEVE
******

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



а давай-те ка сюда кусок кода побольше... чтоб можно было чё-ниить прикинуть, так сказать, в контексте задачи...


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 19 2010, 19:36
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Sirko @ Dec 19 2010, 23:47) *
Возможно есть способ строку передать в макрос и там ее обработать, но как это сделать, ума не приложу.

Может таки свой алфавит не смертельно?
Кодовая таблица исходника не меняется?

Я с немецким вот так борюсь:

#define auml "д"
"n"auml"chster Serv."

В моем дисплее русская д кодовой таблицы Windows отображается как а с умляутом.

С русским хуже - больше новых букв sm.gif

_V_a_s_j_a,
где
#define _U "В"
#define _a "a"

Естественно, в кавычках должны быть символы кодовой таблицы, которые отображаются нужным образом в дисплее - как В а ...
Мне кажется подчеркивания не так сильно гробят понимание.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Dec 21 2010, 07:12
Сообщение #14


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Dog Pawlowa @ Dec 20 2010, 01:36) *
Мне кажется подчеркивания не так сильно гробят понимание.

Это не очень хороший стиль именования, так как компилятор обычно имеет служебные идентификаторы начинающиеся именно с одного или двух подчеркиваний.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
ARV
сообщение Dec 21 2010, 07:19
Сообщение #15


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



блин, сколько шуму из-за обычной перекодировки русского текста в кодировку ЖКИ!!! даже я сделал свой вариант утилиты перекодировки - если makefile сделан вручную, можно вообще сделать так, что перекодировка будет происходить абсолютно незаметно...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 23:50
Рейтинг@Mail.ru


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