Probleme mit struct im Header

Gast #2942587
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
Gast #2943480
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.
Gast #2945300
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?
#2945311
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.
Gast #2945312
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 ;)
Gast #2945320
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
#2945327
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!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.