Sirko 0 25 декабря, 2010 Опубликовано 25 декабря, 2010 · Жалоба Захотел позаимствовать идею с 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба Вам же четко написано в логе cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++ Обмозговывайте и исправляйте... Как впрочем и другие ошибки четко прописаны, что не понятно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sirko 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба Неужели Вы думаете, что сообщения об этих ошибках очевидны для всех, так же как и для Вас. Мне абсолютно неясно, почему 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 из примера операционки, как поправить его? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба Неужели Вы думаете, что сообщения об этих ошибках очевидны для всех, так же как и для Вас. Пока для Вас они не очевидны, пишите, пожалуйста в раздел программирование для начинающих. Там более-менее нормальное место для тех, кто по какой-то неведомой причине не знает, например, о том, что нового появилось в стандарте языка "C" в 99 году, о диалекте "GNU С" и что "C" и "C++" таки разные языки со своими стандартами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба Неужели Вы думаете, что сообщения об этих ошибках очевидны для всех, так же как и для Вас. Мне абсолютно неясно, почему 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 это место подправить, сделать две переменные ключей) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sirko 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба пишите, пожалуйста в раздел программирование для начинающих Если в этом действительно есть необходимость, то просьба к модераторам - перебросить. о том, что нового появилось в стандарте языка "C" в 99 году, о диалекте "GNU С" и что "C" и "C++"... Пожалуйста, ткните носом по существу в русскоязычный источник. Из makefile # compiler flags #CSTD = # -std=c++98 --pedantic CSTD = -std=gnu99 # --pedantic порт для GCC надо будет к следующему релизу scmRTOS это место подправить Я думаю, что не стоит. Если в проекте используется С++, то зачем себе в чем-то отказывать. строку не удастся так просто задавать прямо в инициализаторе Жаль, а хотелось бы так же красиво, придется, наверное, городить огород. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба Из 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 и подставлять имя этого массива в инициализатор указателя. Кроме макроса - никаких изменений в текстах, только во флеше немного больше места займёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sirko 0 27 декабря, 2010 Опубликовано 27 декабря, 2010 · Жалоба «а Вы откуда порт брали?» Затрудняюсь ответить. :laughing: Взял когда-то и где-то, уже и не помню, а использовать назрела нужда относительно недавно. Осторожненько так - «А где нужно?» , только во флеше немного больше места займёт Переживем, не велика беда. Большое Вам спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться