реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
Jagupop
сообщение Jul 1 2007, 21:08
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Все учусь... Подскажите, пожалуйста, что обозначает сообщение при компиляции:

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

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

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

Спасибо.
Go to the top of the page
 
+Quote Post
konny
сообщение Jul 2 2007, 00:41
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 5-08-05
Пользователь №: 7 384



По поводу ошибки: если мне не изменяет память, компилятор требует чтобы в исходнике была пустая последняя строка. По ней определяется конец файла.
По поводу обобщённого описания всех сообщений не могу подсказать. Тут надо различать, кто выдаёт сообщение -- компилятор, линкер или ещё кто...
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jul 2 2007, 01:50
Сообщение #3


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

Если нет пустой строки в конце файла, то выдается предупреждение (warning), но не как не ошибка. Конец файла наверно все таки определяется символом EOF.
К сожалению, хоть и работаю с avr gcc, не знаю, что это за ошибка...(


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
forever failure
сообщение Jul 2 2007, 04:53
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Цитата
main.c:45: error: parse error at end of input

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

А лучше приведите весь проблемный исходник.
Go to the top of the page
 
+Quote Post
Jagupop
сообщение Jul 2 2007, 05:35
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Привожу. Только не швыряйте гнилыми помидорами - я еще только учусь. Кстати, там еще есть пару 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

Спасибо!
Go to the top of the page
 
+Quote Post
forever failure
сообщение Jul 2 2007, 06:00
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



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);
}
} /*<- вот здесь надо закрывающую скобочку добавить */

А так, для начала нормально.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jul 2 2007, 06:17
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(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);
  }
}


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Jagupop
сообщение Jul 2 2007, 09:05
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Эх, невнимательность... Спасибо!!!

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

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
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 2 2007, 09:34
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Jagupop @ Jul 2 2007, 13:05) *
А что означает:

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


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

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

Анатолий.
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Jul 2 2007, 10:37
Сообщение #10





Guests






Давай все разберем по порядку:
Код
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" линковщик не может потому, что она была объявленна как статическая. А как нам известно, статические функции видны только в пределах файла в котором они описанны, также как и статические переменные определенные вне каких либо функций.


Надеюсь, теперь у тебя никаких вопросов нет.
Go to the top of the page
 
+Quote Post
Jagupop
сообщение Jul 2 2007, 10:58
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Преогромнейшее спасибо!!!

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


Ну... проверяю появление лог. "0" на PD2. Может, неправильно? Ну я новичек - подскажите.
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Jul 2 2007, 12:00
Сообщение #12





Guests






Не хотел писать, ну да ладно, напишу. Может и вправду прегодиться.

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

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

только заметь, что второй пример читать намного легче и компилятор по этому коду сгенерирует более оптимальный объектный файл (хотя для GCC это не актуально).
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 2 2007, 12:35
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



По поводу скобок: если пишете программу в Programmers Notepad 2, который устанавливается вместе с WINAVR, то при наведении курсора на закрывающую скобку он выделяет открывающую, которая ей соответствует по его мнению( и по мнению компилятора в конечном итоге). И ещё, чтоб уменьшить вероятность потери скобок - ставьте скобки сразу, а потом вписывайте между ними ваш код.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Jagupop
сообщение Jul 2 2007, 14:13
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Все понятно. Спасибо за помощь.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jul 2 2007, 14:49
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата(Jagupop @ Jul 2 2007, 13:58) *
Преогромнейшее спасибо!!!
Ну... проверяю появление лог. "0" на PD2. Может, неправильно? Ну я новичек - подскажите.

if ((PIND&0x04) == 0);
Похоже, неправильно стоит ";" после круглой скобки. Очепятка?


--------------------
aka Vit
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 23:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01552 секунд с 7
ELECTRONIX ©2004-2016