при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!

В первую очередь рекоммендую явно задать размер массива yf - пять символов, ибо sprintf ввыводит в память строку с завершающим символом '\0'.krolaka писал(а):обясните почему себя так ведет sprintf вот привожу пример програмы
Код: Выделить всё
char yf[5]
uint16 year;
year=2010;
sprintf(yf, "%.4i", year)Код: Выделить всё
#include <avr>
#include <avr>
#include <avr>
class Test
{
public:Test();
};
Test::Test(){}
int main()
{char *a=new char [2];}Код: Выделить всё
avr-gcc -mmcu=atmega2560 -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.c
../main.c:5: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
../main.c:9: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
../main.c: In function 'main':
../main.c:12: error: 'new' undeclared (first use in this function)
../main.c:12: error: (Each undeclared identifier is reported only once
../main.c:12: error: for each function it appears in.)
../main.c:12: error: expected ',' or ';' before 'char'
../main.c:12: warning: unused variable 'a'
make: *** [main.o] Error 1
Build failed with 6 errors and 1 warnings...
Код: Выделить всё
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:9: warning: unused variable 'a'
avr-g++ -mmcu=atmega2560 -Wl,-Map=AVRWIN001.map main.o -o AVRWIN001.elf
main.o: In function `main':
S:\AVRWIN001\default/../main.cpp:9: undefined reference to `operator new[](unsigned int)'
make: *** [AVRWIN001.elf] Error 1
Build failed with 1 errors and 2 warnings...
Код: Выделить всё
avr-gcc -x c++ -c main.cКод: Выделить всё
-x c++Код: Выделить всё
S:\AVRWIN001\default/../main.c:18: undefined reference to `operator new[](unsigned int)'
Я всё же рекомендую использовать не этот флаг, а правльное расширение - если файл будет main.cpp, то єтот флаг не нужен. В проекте по разным соображениям может возникнуть желане применить и С-шные файлы (свои или чужие) и по расширению "драйвер" avr-gcc разберётся и применит нужный компилятор, а ключ смешивает всё в одну кучу.xVekx писал(а):хех флагнадо было добавить =))Код: Выделить всё
-x c++
операторов new и delete нет в библиотеке, их проблематично сделать полностью соответствующими стандарту (кто и куда будет выбрасывать исключение по нехватке памяти std::bad_alloc ? исключения для AVR пока вообще не предусмотрены и я себе плохо представляю их необходимоть) и они отданы на откуп пользователю.xVekx писал(а):но ошибка все равно естьКод: Выделить всё
S:\AVRWIN001\default/../main.c:18: undefined reference to `operator new[](unsigned int)'
Извиняюсь. Конечно же static. ОписАлся.ARV писал(а):рекомендаций много
extern далеко не всегда помогает уменьшить объем кода, скорее наоборот, а вот static может сильно помочь (если вы, конечно, понимаете, что это и как оно работает).
Да просто код короче в этом случае получился.ARV писал(а):вы запрещаете инлайнить функции - но зачем? поверьте, компилятор лучше вас разберется, когда это выгодно делать, а когда нет: запрещая инлайнить небольшую функцию вы заставляете компилятор каждый раз при ее вызове спасать в стеке несколько регистров, инициализировать ее локальные переменные и т.д. - а если она проинлайнится, то все это скорее всего будет лишним, и еще вопрос, станет ли код больше...
Оптимизация скорее всего. Нужно код смотреть. Сравни ассемблерный код по результату компиляции.Alex_Jet писал(а): Что же такое может быть в новых версиях? 2 часика порылся в инете - ничего не нашел
Большего или не большего, но из старых (gcc 3.x.x) всё же 20060424 поприличнее.Alex_Jet писал(а):Возникла небольшая проблемка с новыми версиями WinAVR.
Сидел на старой WinAVR-20060125, поскольку не требовалось пока ничего большего.
А вот эти (gcc 4.x.x) несколько "агрессивнее" (но, тем не менее, в полном соответствии со стандартом С) оптимизируют код в том, что управляется ключевым словом volatile. В смысле чаще находят что выбросить, так как без volatile оно выглядит ненужным или переставить местами код.Alex_Jet писал(а):Поэтому поставил свежий WinAVR-20100110...... без проблем откомпилировал, зашил программу и...ничего не работает...
Перепробовал разные версии WinAVR, перебрав с 20100110 по 20071221 - все то же!
Код: Выделить всё
uint16_t vvar; /* надо бы volatile, но старые версии это прощали */
uint16_t foo()
{
uint16_t temp;
uint8_t sreg_copy = SREG;
cli();
temp = vvar;
SREG = sreg_copy;
}Код: Выделить всё
in r24, SREG
cli
out SREG, r24
lds r24, vvar
lds r25, vvar+1
retКод: Выделить всё
volatile unsigned char vol_tda[] = {0x1C,0x1E,0x20,0x22,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F };