Перейти к содержанию
    

Как это подружить с плюсами?

Захотел позаимствовать идею с 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам же четко написано в логе

 

cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++

Обмозговывайте и исправляйте...

 

Как впрочем и другие ошибки четко прописаны, что не понятно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неужели Вы думаете, что сообщения об этих ошибках очевидны для всех, так же как и для Вас.

Мне абсолютно неясно, почему 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 из примера операционки, как поправить его?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неужели Вы думаете, что сообщения об этих ошибках очевидны для всех, так же как и для Вас.

Пока для Вас они не очевидны, пишите, пожалуйста в раздел программирование для начинающих. Там более-менее нормальное место для тех, кто по какой-то неведомой причине не знает, например, о том, что нового появилось в стандарте языка "C" в 99 году, о диалекте "GNU С" и что "C" и "C++" таки разные языки со своими стандартами.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неужели Вы думаете, что сообщения об этих ошибках очевидны для всех, так же как и для Вас.

Мне абсолютно неясно, почему 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 непонятно, то таки надо что-то почитать по языкам. Можно, конечно, и в разделе дл начинающих поспрашивать, как уже советовали, но лучше почитать.

 

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 это место подправить, сделать две переменные ключей)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пишите, пожалуйста в раздел программирование для начинающих

Если в этом действительно есть необходимость, то просьба к модераторам - перебросить.

 

о том, что нового появилось в стандарте языка "C" в 99 году, о диалекте "GNU С" и что "C" и "C++"...

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

 

Из makefile

# compiler flags

#CSTD = # -std=c++98 --pedantic

CSTD = -std=gnu99 # --pedantic

порт для GCC

 

надо будет к следующему релизу scmRTOS это место подправить

Я думаю, что не стоит. Если в проекте используется С++, то зачем себе в чем-то отказывать.

 

строку не удастся так просто задавать прямо в инициализаторе

Жаль, а хотелось бы так же красиво, придется, наверное, городить огород.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из makefile

# compiler flags
#CSTD = # -std=c++98 --pedantic
CSTD = -std=gnu99 # --pedantic

Осторожненько так - «а Вы откуда порт брали?»

Смотрю нынешнее состояние trunk/Samples/AVR/GCC/1-EventFlag и остальных примеров.

#OPT = -Os  -mcall-prologues
OPT = -Os

# compiler flags
CSTD = # -std=c++98 --pedantic

CWARN = -Wextra -Wall #-Wstrict-prototypes -Wno-main

-std=gnu99 нигде нет.

Смотрю svn log makefile и вижу, что менялся он в версиях хранилища

r259 2010-01-25 (соответствует текущей версии, с тех пор не менялся)

r180 2008-05-24

r142 2008-04-07 (в этот момент были добавлены примеры 2 и 3)

r87 2007-12-22

r68 2007-11-09

r67 2007-11-07

Смотрю различия текущей версии и указанных. Они есть только в строках путей к компилятору и опциях avreal, в строках для CSTD изменений нет.

Чудесато... Откуда у Вас в порте/примере взялась опция С-компилятора для C++ — не понимаю.

 

Я думаю, что не стоит. Если в проекте используется С++, то зачем себе в чем-то отказывать.
Никто ни в чём не собирается себе отказывать. Просто пусть будут флаги для С отдельно, даст возможность задавать версии стандарта.

 

Жаль, а хотелось бы так же красиво, придется, наверное, городить огород.
Не удастся вписывать "строку" в инициализатор указател в структуре, как это вписывалось для неполного массива в С99.

Надо подрихтовать макрос, добавить в нём заведение массива char нужное_имя[] PROGMEM и подставлять имя этого массива в инициализатор указателя. Кроме макроса - никаких изменений в текстах, только во флеше немного больше места займёт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

«а Вы откуда порт брали?»

Затрудняюсь ответить. :laughing: Взял когда-то и где-то, уже и не помню, а использовать назрела нужда относительно недавно.

 

Осторожненько так - «А где нужно?»

 

, только во флеше немного больше места займёт

Переживем, не велика беда.

 

 

Большое Вам спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...