Jagupop 0 1 июля, 2007 Опубликовано 1 июля, 2007 · Жалоба Все учусь... Подскажите, пожалуйста, что обозначает сообщение при компиляции: main.c:45: error: parse error at end of input при этом показывает на самую последнюю строку (на закрытую скобочку). Попутный вопрос - а есть вообще где-то какое-то обобщенное описание всех сообщений WinAVR? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
konny 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба По поводу ошибки: если мне не изменяет память, компилятор требует чтобы в исходнике была пустая последняя строка. По ней определяется конец файла. По поводу обобщённого описания всех сообщений не могу подсказать. Тут надо различать, кто выдаёт сообщение -- компилятор, линкер или ещё кто... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба По поводу ошибки: если мне не изменяет память, компилятор требует чтобы в исходнике была пустая последняя строка. По ней определяется конец файла. По поводу обобщённого описания всех сообщений не могу подсказать. Тут надо различать, кто выдаёт сообщение -- компилятор, линкер или ещё кто... Если нет пустой строки в конце файла, то выдается предупреждение (warning), но не как не ошибка. Конец файла наверно все таки определяется символом EOF. К сожалению, хоть и работаю с avr gcc, не знаю, что это за ошибка...( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
forever failure 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба main.c:45: error: parse error at end of input Скорее всего, там какой-то непечатный символ закрался. А лучше приведите весь проблемный исходник. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jagupop 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Привожу. Только не швыряйте гнилыми помидорами - я еще только учусь. Кстати, там еще есть пару warning'ов. Тоже непонятных. #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/sleep.h> #include <avr/delay.h> #define Freq 4000000 char i; void zaziganie (unsigned char z) { z = 0; for (i=0; i<60; i+=1) { if ((PIND&0x04) == 0); else z += 1; _delay_loop_2 (100); } //void presskey (void) int main (void) { DDRD = 0x00; PORTD = 0xFF; DDRB = 0b11111100; PORTB = 0b00000000; ACSR = 0b00000000; GIMSK = 0b01000000; label1: sei(); set_sleep_mode (SLEEP_MODE_IDLE); cli (); zaziganie (z); if (z < 30) goto label1; PORTB = (PINB^0x08); _delay_loop_2 (1000); PORTB = (PINB^0b10010000); //presskey (); label2: zaziganie (z); if (z > 30) goto label2; else goto label1; } -------- begin -------- avr-gcc (GCC) 3.4.3 Copyright © 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiling C: main.c avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.lst -std=gnu99 -MD -MP -MF .dep/main.o.d main.c -o obj/main.o main.c: In function `zaziganie': main.c:24: warning: 'main' is normally a non-static function main.c:45:2: warning: no newline at end of file main.c:45: error: parse error at end of input make.exe: *** [obj/main.o] Error 1 > Process Exit Code: 2 Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
forever failure 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба void zaziganie (unsigned char z) { z = 0; for (i=0; i<60; i+=1) { if ((PIND&0x04) == 0); else z += 1; _delay_loop_2 (100); } } /*<- вот здесь надо закрывающую скобочку добавить */ А так, для начала нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhevak 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба void zaziganie (unsigned char z) { ... for (i=0; i<60; i+=1) { ... } int main (void) { ... } Скобочку забыл. Увидел где? Быват! Когдя я начинал, я не мог правильно написать switch Я тут немного поправил твой код. Посмотри, может чего умное узришь. Но если честно, то я особо в код не вникал -- не очень располагаю временем. Удачи! #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/sleep.h> #include <avr/delay.h> #define Freq 4000000 unsigned char zaziganie (void) { char i; // i используется только в этой функции, поэтому определять ее лучще здесь, // а не делать глобальной. Глобальные переменные позволяют сэкономить на, // оперативной памяти, но глобальность -- это не есть хорошо. unsigned char z; // Резервируем место для переменной в стеке z = 0; // инициализируем ее нулем for (i = 0; i < 60; i++) // { if ((PIND & 0x04) != 0) z++; _delay_loop_2 (100); } return z; } //void presskey (void) void main (void) // Zhevak: так лучше, т.к. мэйн не возвращает управление. { DDRD = 0x00; PORTD = 0xFF; DDRB = 0b11111100; // Zhevak: очень не рекомендую использовать в одном проекте одновременно PORTB = 0b00000000; // и двоичный, и 16-ричный формат представления чисел. Будучи "прожженым" ACSR = 0b00000000; // ембеддером я неоднократно наступал на эти грабли. Свои ошибки я, конечно же, GIMSK = 0b01000000; // нашел, но сколько я потерял времени на то, что бы "увидеть", что формат // другой. while(1) { unsigned char zzz; // Вставляй пустые строки, т.е. выделяй логические блоки программы. Потом самому будет // легче разбираться в свем коде. sei(); set_sleep_mode (SLEEP_MODE_IDLE); cli(); zzz = zaziganie(); // Получим значение для переменной zzz if (zzz < 30) continue; PORTB = (PINB ^ 0x08); // Zhevak: опять смешивание форматов _delay_loop_2(1000); PORTB = (PINB ^ 0b10010000); // Zhevak: опять смешивание форматов //presskey (); do { zzz = zaziganie(); } while (zzz > 30); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jagupop 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Эх, невнимательность... Спасибо!!! А что означает: main.c:24: warning: 'main' is normally a non-static function теперь это сообщение только осталось. Спасибо. В общем, сейчас вот так: -------- begin -------- avr-gcc (GCC) 3.4.6 Copyright © 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiling C: main.c avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.lst -std=gnu99 -MD -MP -MF .dep/main.o.d main.c -o obj/main.o In file included from main.c:4: C:/WinAVR/avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>." main.c: In function `zaziganie': main.c:23: warning: 'main' is normally a non-static function Linking: main.elf avr-gcc -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.o -std=gnu99 -MD -MP -MF .dep/main.elf.d obj/main.o --output main.elf -Wl,-Map=main.map,--cref --section-start=.text=0x0000, C:/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/crttn2313.o: In function `__vectors': ../../../../../avr-libc-1.4.4/crt1/gcrt1.S:51: undefined reference to `main' make.exe: *** [main.elf] Error 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба А что означает: main.c:24: warning: 'main' is normally a non-static function Это означает что все еще неправильно раставленны скобки. И вот этим вы что хотите сказать: if ((PIND&0x04) == 0); else z += 1; Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Serg79 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Давай все разберем по порядку: In file included from main.c:4: C:/WinAVR/avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>." Означает: в файле "main.c" в строке 4 идет включение заголовочного файла "#include <avr/delay.h>". Далее идет вывод warning из файла avr/delay.h, что означает: "этот файл перенесен в <util/delay.h>". Вот само содержание файла "avr/delay.h": #ifndef _AVR_DELAY_H_ #define _AVR_DELAY_H_ #warning "This file has been moved to <util/delay.h>." #include <util/delay.h> #endif /* _AVR_DELAY_H_ */ Теперь думаю вопросов не должно возникать по этому поводу. Замени строчку "#include <avr/delay.h>" на "#include <util/delay.h>". Далее: main.c:23: warning: 'main' is normally a non-static function Говорит о том, что функция "main" является обычной функцией а не статической. Это значит, что ты написал вот так: static int main(void) { ... } Это были предупреждения компилятора. Теперь ошибки линковщика: Linking: main.elf avr-gcc -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.o -std=gnu99 -MD -MP -MF .dep/main.elf.d obj/main.o --output main.elf -Wl,-Map=main.map,--cref --section-start=.text=0x0000, C:/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/crttn2313.o: In function `__vectors': ../../../../../avr-libc-1.4.4/crt1/gcrt1.S:51: undefined reference to `main' make.exe: *** [main.elf] Error 1 Это означает, что линковщик не пожет найти функцию "main" которая вызывается из функции "__vectors" которая находиться в объектной библиотеке "crttn2313.o". А найти функцию "main" линковщик не может потому, что она была объявленна как статическая. А как нам известно, статические функции видны только в пределах файла в котором они описанны, также как и статические переменные определенные вне каких либо функций. Надеюсь, теперь у тебя никаких вопросов нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jagupop 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Преогромнейшее спасибо!!! И вот этим вы что хотите сказать: if ((PIND&0x04) == 0); else z += 1; Ну... проверяю появление лог. "0" на PD2. Может, неправильно? Ну я новичек - подскажите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Serg79 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Не хотел писать, ну да ладно, напишу. Может и вправду прегодиться. Твоя конструкция: if ((PIND&0x04) == 0); else z += 1; равносильна этой: if( PIND & (1<<PORT2) ) z++; только заметь, что второй пример читать намного легче и компилятор по этому коду сгенерирует более оптимальный объектный файл (хотя для GCC это не актуально). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба По поводу скобок: если пишете программу в Programmers Notepad 2, который устанавливается вместе с WINAVR, то при наведении курсора на закрывающую скобку он выделяет открывающую, которая ей соответствует по его мнению( и по мнению компилятора в конечном итоге). И ещё, чтоб уменьшить вероятность потери скобок - ставьте скобки сразу, а потом вписывайте между ними ваш код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jagupop 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Все понятно. Спасибо за помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sensor_ua 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Преогромнейшее спасибо!!! Ну... проверяю появление лог. "0" на PD2. Может, неправильно? Ну я новичек - подскажите. if ((PIND&0x04) == 0); Похоже, неправильно стоит ";" после круглой скобки. Очепятка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться