Hallo,
ich bekomme immer beim ersten Build eine Warning Meldung:
Severity Code Description Project File Line
Warning control reaches end of non-void function [-Wreturn-type]
TWI_I2C_MASTER G:\AtmelStudio\TWI_I2C_MASTER\TWI_I2C_MASTER\main.c
führe ich ein 2. Build durch ist es weg.
Das hier ist der Code, nur ich versteh nicht warum er meckert:
1
#define F_CPU 16000000UL
2
3
#include<avr/io.h>
4
#include<util/twi.h>
5
#include<util/delay.h>
6
#include<stdlib.h>
7
8
#define F_SCL 400000L
9
10
#define TWCR_START 0xA4 //send start condition
11
#define TWCR_STOP 0x94 //send stop condition
12
#define TWCR_RACK 0xC4 //receive byte and return ack to slave
13
#define TWCR_RNACK 0x84 //receive byte and return nack to slave
14
#define TWCR_SEND 0x84 //pokes the TWINT flag in TWCR and TWEN
Mach aus dem "int main(" ein "void main(",
oder füge ein "return 0" hinter der (Endlos) Schleife ein.
Beim 2. Build wird main.c offenbar nicht mehr kompiliert. Ist also nur
"make" und kein komplettes re-build.
Deine Funktion main ist als Funktion mit einem Rückgabewert definiert
- es fehlt aber genau das, die Rückgabe eines Wertes.
Zwar wird die Funktion wegen der enthaltenen Endlosschleife nie einen
Wert zurückgeben (da sie sich nie beendet), wenn Du aber vor die letzte
schließende geschweifte Klammer ein
return 0;
setzt, verschwindet die Warnung und ihr Beide, Du und Dein Compiler,
seid zufrieden.
mal so ne kleine frage zu dem Code, will jetzt nicht extra ein neuen
Beitrag öffnen:
und zwar müsste er doch nach den 2. Durchlauf nur noch 7 lesen und
schreiben (also DATA=DATA1=DATA2=7)
warum schreibt er ab den 2. Durchlauf DATA = DATA1=3 und DATA2 =7?
1
#define F_CPU 16000000UL
2
3
#include<avr/io.h>
4
#include<util/twi.h>
5
#include<util/delay.h>
6
#include<stdlib.h>
7
8
#define F_SCL 400000L
9
10
#define TWCR_START 0xA4 //send start condition
11
#define TWCR_STOP 0x94 //send stop condition
12
#define TWCR_RACK 0xC4 //receive byte and return ack to slave
13
#define TWCR_RNACK 0x84 //receive byte and return nack to slave
14
#define TWCR_SEND 0x84 //pokes the TWINT flag in TWCR and TWEN
DATA ist hier nur eine Kopie des Aufrufparameters.
Wenn Du diesen Wert innerhalb der Prozedur änderst, wird der Aufrufer
davon nichts mitbekommen.
Entweder, baust Du eine Funktion, also mit Rückgabe.
Oder Du verwendest Zeiger.
also hab jetzt die Variablen aus MR_SLAVE global deklaiert um mit ihnen
weiter zu arbeiten, geht da noch anders? würd gerne die Variablen Lokal
lieber nutzen und von MR_SLAVE im Main damit weiter arbeiten.
Rufus Τ. F. schrieb:> Deine Funktion main ist als Funktion mit einem Rückgabewert definiert> - es fehlt aber genau das, die Rückgabe eines Wertes.
Wobei ab C99 von der main() Funktion in ihrer speziellen Rolle überhaupt
nicht verlangt wird, explizit einen Wert zurück zu geben. Auch nicht,
wenn man sie mit Returnwert definiert. In dem Fall wird 0 zurückgegeben.
Frag mich nicht was das soll, aber so steht es im Standard. Übersetze
mit -std=c99, dann ist die Warnung ebenfalls weg. Ab c99 steht brav ein
implizites return(0) drin, bei c89/c90 hingegen nicht.
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.