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

 
 
> Как это подружить с плюсами?
Sirko
сообщение Dec 25 2010, 21:05
Сообщение #1


Местный
***

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



Захотел позаимствовать идею с http://easyelectronics.ru/organizaciya-dre...nogo-menyu.html, используя scmRTOS. Миссия оказалась невыполнимой, почему - непонимаю.
Скачал с сайта исходник, попробовал откомпилировать оригинал, все замечательно собирается. Оказывается, если переименовать С файлы в СРР, то появляется тот самый ступор, с которым я столкнулся и который для меня неподъемный. Пробовал обрамлять extern "C" {, не помогло.

Это компиляция оригинала:
Цитата
Build started 26.12.2010 at 01:37:46
avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT keyboard.o -MF dep/keyboard.o.d -c ../keyboard.c
avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT menu.o -MF dep/menu.o.d -c ../menu.c
avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT messages.o -MF dep/messages.o.d -c ../messages.c
avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT testMenu.o -MF dep/testMenu.o.d -c ../testMenu.c
avr-gcc -mmcu=atmega32 -Wl,-Map=TTemp.map keyboard.o menu.o messages.o testMenu.o -o TTemp.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature TTemp.elf TTemp.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex TTemp.elf TTemp.eep || exit 0
avr-objdump -h -S TTemp.elf > TTemp.lss

AVR Memory Usage
----------------
Device: atmega32

Program: 2806 bytes (8.6% Full)
(.text + .data + .bootloader)

Data: 834 bytes (40.7% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...

А это то, что получается после переименования в СРР:
Цитата
rm -rf keyboard.o menu.o messages.o testMenu.o TTemp.elf dep/* TTemp.hex TTemp.eep TTemp.lss TTemp.map
Build succeeded with 0 Warnings...
avr-g++ -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT testMenu.o -MF dep/testMenu.o.d -c ../testMenu.cpp
cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++
avr-g++ -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT keyboard.o -MF dep/keyboard.o.d -c ../keyboard.cpp
cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++
avr-g++ -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT menu.o -MF dep/menu.o.d -c ../menu.cpp
cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++
../menu.cpp:40: warning: only initialized variables can be placed into program memory area
../menu.cpp:43: error: too many initializers for 'const char [0]'
../menu.cpp:46: error: initializer-string for array of chars is too long
../menu.cpp:47: error: initializer-string for array of chars is too long
../menu.cpp:48: error: initializer-string for array of chars is too long
../menu.cpp:51: error: initializer-string for array of chars is too long
../menu.cpp:52: error: initializer-string for array of chars is too long
../menu.cpp:53: error: initializer-string for array of chars is too long
../menu.cpp:56: error: initializer-string for array of chars is too long
../menu.cpp:57: error: initializer-string for array of chars is too long
../menu.cpp:60: error: initializer-string for array of chars is too long
../menu.cpp:61: error: initializer-string for array of chars is too long
../menu.cpp:64: error: initializer-string for array of chars is too long
../menu.cpp:65: error: initializer-string for array of chars is too long
../menu.cpp: In function 'unsigned char dispMenu(msg_par)':
../menu.cpp:84: warning: only initialized variables can be placed into program memory area
make: *** [menu.o] Error 1
Build failed with 13 errors and 5 warnings...


Исходники прилагаю, если есть мысли, - поделитесь пожалуйста.



Прикрепленные файлы
Прикрепленный файл  TTemp.zip ( 46.51 килобайт ) Кол-во скачиваний: 11
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sirko
сообщение Dec 26 2010, 05:17
Сообщение #2


Местный
***

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



Неужели Вы думаете, что сообщения об этих ошибках очевидны для всех, так же как и для Вас.
Мне абсолютно неясно, почему gnu99 для си valid, я для с++ "инвалид". Или в 99-ом плюсы не придумали? Конечно же, придумали.
И уж совершенно не очевидно, почему обычная инициализация структуры
menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, {0x00}};
в одном случае компилится, а в другом - нет.

Кстати, по поводу:
cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++
При использовании makefile из примера операционки, как поправить его?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 26 2010, 13:05
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Sirko @ Dec 26 2010, 10:17) *
Неужели Вы думаете, что сообщения об этих ошибках очевидны для всех, так же как и для Вас.
Мне абсолютно неясно, почему gnu99 для си valid, я для с++ "инвалид". Или в 99-ом плюсы не придумали? Конечно же, придумали.
Как уже было сказано, С и С++ это разные языки.
С++ постарался поддержать как можно больше из С, но вот как раз плюсы придумали ДО 99 года и особенности С стандарта 99-го года в него не вошли.
В любом случае, указывать для С++ ключ совместимости со стандартом языка С — странно. То же самое (предупредение option ... is valid for ... but not for ...) будет при попытке указать ключ -std=c++98 -std=gnu++98 для файла .c
И если сообщение error: initializer-string for array of chars is too long непонятно, то таки надо что-то почитать по языкам. Можно, конечно, и в разделе дл начинающих поспрашивать, как уже советовали, но лучше почитать.

Цитата(Sirko @ Dec 26 2010, 10:17) *
cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++
При использовании makefile из примера операционки, как поправить его?
makfile из примера (если имеется ввиду порт AVR/GCC) вроде как не содержит -std=gnu99. Сам ключ -std там, кажется, не используется, идёт применение стандарта по умолчанию.

Глянул я по диагонали то меню, там используются так называемые incomplete типы, С++ этого не любит. К моменту определения объекта тип должен быть дополнен(доопределён), что просто невозможно для заданной структуры.

Так что переделывать menu item так, чтобы в хвосте был не неполный тип, а указатель на строку, но там кроме увеличения расхода памяти на два байта на каждый элемент меню вылезут свои проблемы уже с AVR/gcc-шным PROGMEM (строку не удастся так просто задавать прямо в инициализаторе, надо будет поменять макрос).

Или разносить C и C++ копиляцию с тем вот extern "C" {, причём в С++-части те фокусы вокруг неполных типов должны быть не видны, наружу должны торчать только С-функции. Насколько это возможно в данном случае — я не стал разбираться.
Примеры scmRTOS для AVR/GCC не рассчитывались на компиляцию смешанных проектов с разными ключами стандарта, там единая переменная для ключей CFLAGS,
Если без указания стандарта через -std пример не собирается, то нужны разные ключи компиляции для С и С++ файлов, надо разводить на CFLAGS и CPPFLAGS.
(надо будет к следующему релизу scmRTOS это место подправить, сделать две переменные ключей)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 02:49
Рейтинг@Mail.ru


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