PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler warning: implicit declaration of function 'warten_5sec'



muetzeglatze
09.03.2014, 16:19
Wäre nett wenn mir jmd erklären könnte weshalb es "warten_5sec ()" nicht erkennt!






#include "asuro.h" // Compileranweisung (#)


int main(void) // Hauptfunktion
{

Init(); // ASURO in den Grundzustand setzen
unsigned int i; // Variable i Declaieren


warten_5sec()
{ for (i=0; i<5000; i++) // er wartet 5 sek
{Sleep(72);} // 1 ms
}



StatusLED (OFF); // alle LED's aus


StatusLED(GREEN); // Hier wird die Status LED auf grün eingeschaltet
BackLED(ON,OFF);
warten_5sec
StatusLED(OFF); // Status LED aus
BackLED(ON,ON); // BackLED's an
warten_5sec
while (1);
{
for (i=0; i<282; i++) // wartet 1 ms
{Sleep(255);} // wartet 1 sek
StatusLED (RED);
for (i=0; i<282; i++)
{Sleep(255);}
StatusLED (YELLOW);
for (i=0; i<282; i++)
{Sleep(255);}
StatusLED (OFF);
}

FrontLED(ON); // und hier die vordere LED einschalten


while(1); // Endlosschleife
return 0; // Rückgabewert der Hauptfunktion
}


Fehlermeldung:


> "C:\ASURO_src\FirstTry\Test-all.bat"

C:\ASURO_src\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 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.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function 'main':
test.c:24: warning: implicit declaration of function 'warten_5sec'
test.c:25: error: expected ';' before '{' token
test.c:37: warning: statement with no effect
test.c:37: error: expected ';' before 'StatusLED'
test.c:40: warning: statement with no effect
test.c:40: error: expected ';' before 'while'
make: *** [test.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:01


27744

shedepe
09.03.2014, 16:27
Weil du keinen validen C Code schreibst. Du solltest dir die Fehlermeldungen deines Compilers mal zu herzen nehmen. Dort steht so ziemlich genau drin was nicht valide Syntax ist. Zur Verwendung von Funktionen in C siehe hier:
https://de.wikibooks.org/wiki/C-Programmierung:_Funktionen

Dann wirst du 1. feststellen dass du keine Funktion in einer anderen Funktion deklarieren kannst. (Du deklarierst warte5sec in der Funktion main)
2. Dass wenn man eine Funktion aufruft diesen Aufruf mit einem Semikolon abschließen muss.

Noch was zum Stil. Wenn du eine for Schleife schreibst, deklariere die Zähl Variable direkt im Schleifenkopf sofern möglich.
Also

for(int i = 0; i < LENGTH; i++){}

sast
11.03.2014, 07:59
Ich wüßte nicht, dass der avr-gcc meckert, wenn man in der main() eine funktion definiert und deklariert. Allerdings hätte der Compiler gern einen Rückgabetyp der Funktion.

sast

Klebwax
11.03.2014, 09:02
Ich wüßte nicht, dass der avr-gcc meckert, wenn man in der main() eine funktion definiert und deklariert. Allerdings hätte der Compiler gern einen Rückgabetyp der Funktion.

Mit avr hat das nichts zu tun, der gcc oder noch algemeiner jeder C-Compiler meckert. Die Fehlermeldungen sind beispielhaft oben gezeigt

test.c:24: warning: implicit declaration of function 'warten_5sec'
test.c:25: error: expected ';' before '{' token
test.c:37: warning: statement with no effect
test.c:37: error: expected ';' before 'StatusLED'
test.c:40: warning: statement with no effect
test.c:40: error: expected ';' before 'while'

MfG Klebwax

shedepe
11.03.2014, 12:14
Um noch mal zu der Funktion in einer Funktion zu kommen (Nested Functions) . Der C Standard sieht so etwas nicht vor (Im Gegensatz zum neusten C++ Standard, nennt sich dort lambda Funktion und ermöglicht etwas ähnliches). Es kann jedoch sein dass einzelne Compiler Implementierung dass durchaus unterstützen. Notwendig ist es trotzdem nicht und in diesem Fall dürfte es wohl mehr an mangelnden C Kenntnissen liegen.

sast
11.03.2014, 13:54
Soo, ich habs jetzt mal direkt getestet.
Abgesehen davon, was der C Standard sagt, geht eine Funktion in der main() ohne Probleme beim Compiler durch. Nur das ich nicht function(){asm volatile("nop"::);} sondern void function(){asm volatile("nop"::);} verwendet habe.
Mein makefile ruft den Compiler mit CSTANDARD = -std=gnu99 auf.

sast

Klebwax
11.03.2014, 15:10
Soo, ich habs jetzt mal direkt getestet.
Abgesehen davon, was der C Standard sagt, geht eine Funktion in der main() ohne Probleme beim Compiler durch. Nur das ich nicht function(){asm volatile("nop"::);} sondern void function(){asm volatile("nop"::);} verwendet habe.
Mein makefile ruft den Compiler mit CSTANDARD = -std=gnu99 auf.

Du hast dem Compiler gesagt, das er den Standard nicht ernst nehmen soll.
You may also select an extended version of the C language explicitly with -std=gnu90 (for C90 with GNU extensions), -std=gnu99 (for C99 with GNU extensions)

Wenn es Standard C sein soll, gehört da -std=c99 hin, oder schreib ein -pedantic dazu.

MfG Klebwax