Hi ich will von dieser Funktionen (s.unten) einen Prototypen anlegen.
So habe ich es versucht und es kommt ein Fehler:
In file included from relais.c:20:
relais.h:83: warning: 'struct Relais' declared inside parameter list
relais.h:83: warning: its scope is only this definition or declaration,
which is probably not what you want
relais.c:104: error: conflicting types for 'RelaisSchalten'
relais.h:83: error: previous declaration of 'RelaisSchalten' was here
In der h.
Hallo,
du musst die Struktur, die der Funktion übergeben wird, VORHER
deklarieren. Zum Zeitpunkt der Funktionsdeklaration ist die Struktur
noch unbekannt.
Gruß, Mario
Hi Mario,
das habe ich ja gemacht...Dann kommt dieser Fehler:
Linking: Hexfiles/MEGA1284_P.elf
avr-gcc -mmcu=atmega1284p -I. -Os -funsigned-char -funsigned-bitfields
-fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o
-fno-inline-small-functions -fno-split-wide-types
-fno-move-loop-invariants -mcall-prologues -ffunction-sections
-fdata-sections -Wl,--gc-sections -Wl,--relax -std=gnu99 main.o usart.o
stack.o timer.o cmd.o base64.o networkcard/enc28j60.o httpd.o telnetd.o
ntp.o wol.o http_get.o sendmail.o dnsc.o dhcpc.o infrared/rc5.o
1-wire/crc8.o 1-wire/ds18x20.o 1-wire/messung.o 1-wire/onewire.o
udp_send/udp_send.o com74hc595.o R_TRIG.o relais.o email.o jalousie.o
--output Hexfiles/MEGA1284_P.elf -Wl,-Map=Hexfiles/MEGA1284_P.map,--cref
-lm
httpd.o:(.data.K1_Ein+0x0): multiple definition of `K1_Ein'
main.o:(.data.K1_Ein+0x0): first defined here
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe:
Disabling relaxation: it will not work with multiple definitions
httpd.o:(.data.K1_Aus+0x0): multiple definition of `K1_Aus'
main.o:(.data.K1_Aus+0x0): first defined here
httpd.o:(.data.K2_Ein+0x0): multiple definition of `K2_Ein'
main.o:(.data.K2_Ein+0x0): first defined here
httpd.o:(.data.K2_Aus+0x0): multiple definition of `K2_Aus'
main.o:(.data.K2_Aus+0x0): first defined here
httpd.o:(.data.K3_Ein+0x0): multiple definition of `K3_Ein'
main.o:(.data.K3_Ein+0x0): first defined here
httpd.o:(.data.K3_Aus+0x0): multiple definition of `K3_Aus'
main.o:(.data.K3_Aus+0x0): first defined here
httpd.o:(.data.K4_Ein+0x0): multiple definition of `K4_Ein'
main.o:(.data.K4_Ein+0x0): first defined here
httpd.o:(.data.K4_Aus+0x0): multiple definition of `K4_Aus'
main.o:(.data.K4_Aus+0x0): first defined here
httpd.o:(.data.K5_Ein+0x0): multiple definition of `K5_Ein'
main.o:(.data.K5_Ein+0x0): first defined here
usw...................
So sieht das dann aus in der .h
1
structRelais{
2
uint16_tbitToSet;
3
uint16_tbitToClear;
4
uint16_tsetCycles;// Zaehlt die 0-Durchgänge bis zum Abschalten
Man macht in einer H-Datei keine Variablendeklarationen.
Oder allenfalls (da gibt es aber Meinungsverschiedenheiten) mittels
einem Conditional define für "extern".
Da Du die H-Datei in main.c und httpd.c einfügst werden die Variablen
natürlich doppelt deklariert.
Ändere das und alles wird gut.
Hmm schrieb:> Man macht in einer H-Datei keine Variablendeklarationen.> Oder allenfalls (da gibt es aber Meinungsverschiedenheiten) mittels> einem Conditional define für "extern".
Also Variablendeklarationen nur im c.File sozusagen?!
Stefan Ernst schrieb:> Hmm schrieb:>> Man macht in einer H-Datei keine Variablendeklarationen.>> Doch, genau da gehören sie hin. Aber eben keine Definitionen, wie die> oben.
Definition heisst:
Dem Compiler sagen, dass er dieses etwas anlegen soll. So stehts im
Buch. Das dient dann doch als "Prototyp". Ich bin zu blöd dafür, btte
klär mich noch nen bischen mehr auf...
>Definition heisst:>Dem Compiler sagen, dass er dieses etwas anlegen soll. So stehts im
Buch.
Ja. Richtig. In Bezug auf Variablen und Funktionen.
>Das dient dann doch als "Prototyp".
Definitionen "können" Deklarationen sozusagen "ersetzen", wenn sie vor
der ersten Verwendung stehen.
Aber unter einem "Prototyp" versteht man eine Deklaration. Insofern ist
ein Prototyp, also eine Deklaration nicht identisch mit einer
Definition.
In der .h
[c
uint16_t MinMax (uint16_t Input, uint16_t Min , uint16_t Max);
[/c]
und alles läuft. Warum nicht das mit der Struktur als Übergabewert?
Wie muss ich's denn machen?
Das was ich oben schon geschrieben habe unter:
Beitrag "Re: Prototypen anlegen mit struct"
Nur habe ich anstelle von Deklaration, das Wort Definition geschrieben.
D.h. Du hast mehrfache Definitionen von Variablen. Das ist das Problem.
Nicht das struct.
Das ist doch genau das, was die Fehlermeldungen sagen:
httpd.o:(.data.K1_Aus+0x0): multiple definition of `K1_Aus'
main.o:(.data.K1_Aus+0x0): first defined here
"multiple definition" heisst: "mehrfache Definition".
<8 schrieb:> Definition heisst:> Dem Compiler sagen, dass er dieses etwas anlegen soll. So stehts im> Buch. Das dient dann doch als "Prototyp". Ich bin zu blöd dafür, btte> klär mich noch nen bischen mehr auf...
Deklaration bedeutet:
Es gibt da irgendwo etwas, was nach außen so aussieht.
Definition bedeutet:
Lege etwas an.
Deklaration (Variable und Funktion):
Hmm schrieb:> Das ist doch genau das, was die Fehlermeldungen sagen:>> httpd.o:(.data.K1_Aus+0x0): multiple definition of `K1_Aus'> main.o:(.data.K1_Aus+0x0): first defined here>>> "multiple definition" heisst: "mehrfache Definition".
Wo soll ich dann das hin packen?
1
structRelais{
2
uint16_tbitToSet;
3
uint16_tbitToClear;
4
uint16_tsetCycles;// Zaehlt die 0-Durchgänge bis zum Abschalten
>> "multiple definition" heisst: "mehrfache Definition".>> Wo soll ich dann das hin packen?>
Das musst doch in die H-Datei. Ok, dadurch dsas die H datei woanders
auch noch eingebunden war gab es multiple definitions. Aber wie muss ich
es denn machen?
Die einfachste Anfängermöglichkeit ist folgende:
1. Du kopierst die Variablendefinitionen aus der H-Datei in main.c Damit
werden eben dort die Definitionen gemacht.
2. Du setzt das Wort "extern" vor die Variablendefinitionen in der
h-Datei. Damit werden das Deklarationen. Sie werden also beim include in
main.c und httpd.c nicht mehr doppelt definiert.
Georg G. schrieb:> Das folgende Beispiel compiliert ohne Fehler. Du darfst selbst suchen,> was du falsch gemacht hast (einfach nur jeden Leerraum, jedes Zeichen> ansehen)>> #include <avr/io.h>> #include <avr/interrupt.h>
Danke ich begehe mich auf die Suche!
Ja. Schön. Aber was soll das bringen, das Du das erstmal in einer
anderen Variante falsch machst? :-)
Warum nicht einfach so wie hier
Beitrag "Re: Prototypen anlegen mit struct" beschrieben?
>>Hmm schrieb:>> Man macht in einer H-Datei keine Variablendeklarationen.>Dafür sind Header doch da?>Du meinst Variablendefinitonen?
@ Johann L.
Ich würde sogar sagen es handelt sich um Variablendefinitionen. Dieser
Hmm ist ein absoluter Idiot.
Hmm schrieb:> Der macht hier nur den Troll. Einfach ignorieren.> Da fehlen keine Leerzeichen.
Du weißt schon, wie Pointer definiert werden?
uint16_t RelaisSchalten( struct Relais* theRelais);
-> der Name der Struktur ist Relais*, definiert wurde aber eine Struktur
namens Relais.
uint16_t RelaisSchalten( struct Relais * theRelais);
Die Funktion hat als Argument einen Pointer auf die Struktur.
Lies mal wieder etwas, Grundlagen in C sind hilfreich.
Georg G. schrieb:> Du weißt schon, wie Pointer definiert werden?>> uint16_t RelaisSchalten( struct Relais* theRelais);> -> der Name der Struktur ist Relais*, definiert wurde aber eine Struktur> namens Relais.
Sorry, aber das ist kompletter Unsinn.
Alle folgenden Varianten sind in ihrer Bedeutung absolut identisch:
Stefan Ernst schrieb:> Alle folgenden Varianten sind in ihrer Bedeutung absolut identisch:
nicht ganz - nur die erste geht durch den Compiler, der Rest nicht, weil
mehrfach definiert :-)
Klaus Wachtler schrieb:> Stefan Ernst schrieb:>> Alle folgenden Varianten sind in ihrer Bedeutung absolut identisch:>> nicht ganz - nur die erste geht durch den Compiler, der Rest nicht, weil> mehrfach definiert :-)
Auch falsch.
Klaus Wachtler schrieb:
>nicht ganz - nur die erste geht durch den Compiler, der Rest nicht, weil>mehrfach definiert
Ach Mensch! Das sagst Du jetzt? Was mache ich jetzt mit der Tüte
Leerzeichen?
Au fein, ich weiss. Zusammen mit Zucker und Himbeeren in den Quark
rühren.
<8 ??? Wie stehts denn bei Dir. Schon was geändert? Oder beim
Abendessen?
Bei diesem unglaublichen Geblödel, was in diesem Thread abläuft, kann
ich das nicht behaupten.
Zwar hast Du schon mal was richtiges hier beigetragen, aber danach so
viel ... unsubstantiiertes, daß das richtige im Rauschen untergeht.
Johann L. schrieb:> Auch falsch.
Mist, du hast recht - globale Variablen kann man mehrfach definieren.
Nur als lokale geht es schief.
Wieder was gelernt.