Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сообщение ошибки WINAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Jagupop
Все учусь... Подскажите, пожалуйста, что обозначает сообщение при компиляции:

main.c:45: error: parse error at end of input

при этом показывает на самую последнюю строку (на закрытую скобочку).

Попутный вопрос - а есть вообще где-то какое-то обобщенное описание всех сообщений WinAVR?

Спасибо.
konny
По поводу ошибки: если мне не изменяет память, компилятор требует чтобы в исходнике была пустая последняя строка. По ней определяется конец файла.
По поводу обобщённого описания всех сообщений не могу подсказать. Тут надо различать, кто выдаёт сообщение -- компилятор, линкер или ещё кто...
haker_fox
Цитата(konny @ Jul 2 2007, 08:41) *
По поводу ошибки: если мне не изменяет память, компилятор требует чтобы в исходнике была пустая последняя строка. По ней определяется конец файла.
По поводу обобщённого описания всех сообщений не могу подсказать. Тут надо различать, кто выдаёт сообщение -- компилятор, линкер или ещё кто...

Если нет пустой строки в конце файла, то выдается предупреждение (warning), но не как не ошибка. Конец файла наверно все таки определяется символом EOF.
К сожалению, хоть и работаю с avr gcc, не знаю, что это за ошибка...(
forever failure
Цитата
main.c:45: error: parse error at end of input

Скорее всего, там какой-то непечатный символ закрался.

А лучше приведите весь проблемный исходник.
Jagupop
Привожу. Только не швыряйте гнилыми помидорами - я еще только учусь. Кстати, там еще есть пару 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
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
Цитата(Jagupop @ Jul 2 2007, 11:35) *
void zaziganie (unsigned char z)
{
...
for (i=0; i<60; i+=1)
{
...
}


int main (void)
{
...
}


Скобочку забыл. Увидел где?
Быват! Когдя я начинал, я не мог правильно написать switch lol.gif

Я тут немного поправил твой код. Посмотри, может чего умное узришь.
Но если честно, то я особо в код не вникал -- не очень располагаю
временем. Удачи!

Код
#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
Эх, невнимательность... Спасибо!!!

А что означает:

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
Цитата(Jagupop @ Jul 2 2007, 13:05) *
А что означает:

main.c:24: warning: 'main' is normally a non-static function


Это означает что все еще неправильно раставленны скобки.

И вот этим вы что хотите сказать:
if ((PIND&0x04) == 0);
else z += 1;

Анатолий.
Serg79
Давай все разберем по порядку:
Код
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
Преогромнейшее спасибо!!!

Цитата
И вот этим вы что хотите сказать:
if ((PIND&0x04) == 0);
else z += 1;


Ну... проверяю появление лог. "0" на PD2. Может, неправильно? Ну я новичек - подскажите.
Serg79
Не хотел писать, ну да ладно, напишу. Может и вправду прегодиться.

Твоя конструкция:
Код
if ((PIND&0x04) == 0);
else z += 1;

равносильна этой:
Код
if( PIND & (1<<PORT2) )  z++;

только заметь, что второй пример читать намного легче и компилятор по этому коду сгенерирует более оптимальный объектный файл (хотя для GCC это не актуально).
GDI
По поводу скобок: если пишете программу в Programmers Notepad 2, который устанавливается вместе с WINAVR, то при наведении курсора на закрывающую скобку он выделяет открывающую, которая ей соответствует по его мнению( и по мнению компилятора в конечном итоге). И ещё, чтоб уменьшить вероятность потери скобок - ставьте скобки сразу, а потом вписывайте между ними ваш код.
Jagupop
Все понятно. Спасибо за помощь.
sensor_ua
Цитата(Jagupop @ Jul 2 2007, 13:58) *
Преогромнейшее спасибо!!!
Ну... проверяю появление лог. "0" на PD2. Может, неправильно? Ну я новичек - подскажите.

if ((PIND&0x04) == 0);
Похоже, неправильно стоит ";" после круглой скобки. Очепятка?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.