Forum: Compiler & IDEs Probleme mit struct im Header


von Matthias (Gast)


Lesenswert?

Hi,

ich habe ein problem, ich möchte eine struct auf Gleichheit überprüfen.
Dazu habe ich folgende Struct definiert:
1
typedef struct konfiguration{
2
    char stationNummer[15];
3
    unsigned char updateIntervall;
4
    unsigned char autoUpdate:1;
5
    unsigned char wetterAbruf:1;
6
    unsigned char anzTempSens;
7
    unsigned char anzASens;
8
    long long konfASens[10];
9
}konf;

diese liegt in der Header Datei, in der meine ganzen Konfigurationen 
gesetzt werden.

in einer anderen C Datei habe ich die Methode welche die Gleichheit 
feststellenm soll. die sieht ungefähr so aus:
1
 
2
3
unsigned char konfigCheck(struct konfiguration  *konfigA, struct konfiguration *konfigB){
4
...
5
}

Jetzt möchte ich aus anderen C - Files auf die Check Methode zugreifen 
und habe daher einen Prototypen im Header erstellt. Dieser sieht so aus:
1
unsigned char konfigCheck(struct konfiguration  *konfigA, struct konf *konfigB);

leider bekomme ich immer folgende Fehlermeldung:
1
error: conflicting types for 'konfigCheck'
2
error: previous declaration of 'konfigCheck' was here

Ich weiß nicht mehr weiter, alle anderen Prototypen habe ich genauso und 
es funktioniert. Bitte helft mir.

Danke und viele Grüße

Matthias

von troll (Gast)


Lesenswert?

>struct konf *konfigB);
Entweder konf oder struct konfiguration.

von Matthias (Gast)


Lesenswert?

Komisch, es hieß eigentlich struct konfiguration, damit hat es nicht 
funktioniert.
Mit konf *konfigB geht es aber. Super, Danke

von DirkB (Gast)


Lesenswert?

Warum definierst du einen neuen Typ 'konf', wenn du immer die lange 
Schreibweise 'struct konfiguration' hin schreibst?

Das es nicht geklappt hat, kann an einem einfachen Schreibfehler gelegen 
haben.

von Matthias (Gast)


Lesenswert?

gute Frage, habe einiges probiert da es nicht funktioniert hat. Da sind 
dann auch einige Sachen durcheinander gerutscht.

Ich habe noch ein Problem, die Methode konfigCkeck soll überprüfen ob 
die beiden übergebenen Structs gleich sind, 0 zurückgeben wenn ungleich 
und 1 wenn gleich.

Die Überprüfung auf Gleichheit funktioniert, allerdings dir Rückgabe 
nicht.
Die Methode gibt mir statt 0 2560 zurück. Wie kann das sein??
Der Aufruf sieht so aus:
1
konfigCheck(&konfig,&tempKonfig)


Wenn ich die Methode so Aufrufe:
1
konfigCheck(0,0)

passt es.

In beiden Fällen steht in konfigCheck die Rückgabe, alles andere ist 
auskommentiert.

welchen Einfluss können die Übergabeparameter dann noch auf die Rückgabe 
haben?

von Karl H. (kbuchegg)


Lesenswert?

Matthias schrieb:

> Die Methode gibt mir statt 0 2560 zurück. Wie kann das sein??
> Der Aufruf sieht so aus:
>
1
konfigCheck(&konfig,&tempKonfig)


Zeig nicht einfach nur die eine Zeile.
Zeig zumindest die ganze Funktion, aus der der Aufruf heraus erfolgt. Im 
Idealfall: zeig das ganze File. Wenn es zu lang ist, dann bau ein 
abgespecktes Beispiel, welches den Fehler immer noch zeigt.

Aber mit ein paar Fragementen kann man keine vernünftige Fehleranalyse 
machen.

zb erhebt sich die Frage: Hast du das Header File überhaupt inkludiert? 
Was machst du an der Aufrufstelle mit dem Returnwert? Hast du vielleicht 
in der Auswertung des Returncodes einen Fehler?


Im Idealfall versetzt du uns in die Lage, deine Files zu nehmen, ein 
Projekt drum herum zu stülpen und das hier, auf unseren Maschinen zu 
kompilieren und laufen zu lassen.

von Matthias (Gast)


Lesenswert?

Interessant, wenn ich statt einem unsigned char einen unsigned int 
zurückgebe funktioniert es...

Wenn mir jemand erklären kann warum 8 bit nicht für eine 0 oder 1 
reichen, dann würde ich mich freuen ;)

von Karl H. (kbuchegg)


Lesenswert?

Matthias schrieb:
> Interessant, wenn ich statt einem unsigned char einen unsigned int
> zurückgebe funktioniert es...

Dann wage ich die Prognose, dass du im C-File in dem der Aufruf erfolgt, 
das Header File mit dem Prototypen nicht inkludiert hast.

von Matthias (Gast)


Lesenswert?

neeeeeeeein... Du hast recht, ich hatte den Header nicht eingebunden... 
verdammt und daran mache ich seit Tagen rum...

Allerdings schon seltsam dass es teilweise funktioniert, ich hätte dann 
eigentlich auf eine 'undefined reference' gehofft / gewartet.

Danke für den Tipp

von Karl H. (kbuchegg)


Lesenswert?

Matthias schrieb:
> neeeeeeeein... Du hast recht, ich hatte den Header nicht eingebunden...
> verdammt und daran mache ich seit Tagen rum...
>
> Allerdings schon seltsam dass es teilweise funktioniert, ich hätte dann
> eigentlich auf eine 'undefined reference' gehofft / gewartet.

undefined reference kriegst du da keine. Denn die reference ist ja nicht 
undfined. Die Funktion gibt es ja wirklich. (undefined reference ist 
eine Fehlermeldung vom Linker wenn die Einzelteile zusammen gebaut 
werden und ein Teil nicht gefunden werden kann)

Wenn du allerdings den Warning Level vom Compiler hochdrehst, hättest du 
eventuell ein "Function called without protoyp" gesehen (oder eine 
gleichwertige Warnung).

Und seltsam ist das auch nicht.
Wenn der COmpiler einen Funktionsaufruf machen soll, für den er keinen 
Prototyp präsentiert bekommen hat, dann trifft er Standard-Annahmen. Und 
eine davon lautet: die Funktion retourniert einen int.

(d.h. in deinem Fall der Aufrufer erwartet von der Funktion 16-Bit, die 
Funktion liefert aber nur 8 Bit. Die fehlenden 8 Bit werden dann eben 
vom Return-Mechanismus, der konkret hier über Register funktioniert, mit 
dem ergänzt, was halt zufällig gerade in dem Register steht)


-> Warnings hochdrehen. Warnings ernst nehmen!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.