Übergabe von Strukturen an Funktionen

Hallo zusammen!




Ich bin dabei ein Programm zu schreiben, dass zuerst zwei Dati einliest, diese dann an eine Funktion übergibt, die die Differenz der beiden Dati in Tagen berechnet und diesen Wert dann zurück an die main-Funktion liefert.




Die Aufgabe dabei lautet, die beiden Dati in zwei Strukturen desselben Typs zu speichern und sie als Strukturen an die Funktion zu übergeben.




Mir ist bewusst, dass das auch über Zeiger möglich ist, jedoch besteht die Aufgabe darin, die Strukturen als ganzes zu übergeben.




Zur Orientierung hier die relevanten Programmausschnitte:




**Funktion main(void) in der Datei main.c:**




struct dati {




    int tag;




    int monat;




    int jahr;




};




struct dati datum1;




struct dati datum2;




int tage;




tage = tage\_diff(datum1, datum2);




**Deklaration der Funktion tage\_diff in der Datei berech.c:**




int tage\_diff(struct dati datum1, struct dati datum2) {




    ...




    return tage;




}




**Headerdatei berech.h:**




...




int tage\_diff(struct dati datum1, struct dati datum2);




...




**Mein Problem dabei ist, dass der Compiler Fehler meldet:**  




**In Funktion main(void):**




error: incompatible type for argument 1 of 'tage\_diff'




error: incompatible type for argument 2 of 'tage\_diff'

**In Header berech.h:**




note: expected 'struct dati' but argument is of type 'struct dati'
note: expected 'struct dati' but argument is of type 'struct dati'

Natürlich habe ich die Headerdatei in der main-Funktion inkludiert, aber der Compiler will einfach nicht. Bitte sagt mir, was da falsch ist. Ich hoffe, die angegebenen Ausschnitte reichen als Problembeschreibung aus.

Viele Grüße
Rayney93

Hi,

die Strukturvereinbarung für dati gehört in eine Headerdatei dati.h, nicht in main.c, wobei es ohnehin main.cpp heissen sollte, sonst besteht die Gefahr, dass hier ausversehen mit einem C anstatt einem C++ Compiler übersetzt wird.

Deklaration der Funktion tage_diff in der Datei
berech.c:

ja, aber hier muss auch das dati.h inkludiert werden und .cpp anstatt .c.

Im richtigen Leben würde die Signatur von tage_diff wohl eher:

int tage_diff(const dati& datum1,const dati& datum2)

lauten …

Gruss
E.

dati.h

#ifndef \_\_INCL\_DATI\_H\_\_
#define \_\_INCL\_DATI\_H\_\_

struct dati 
{ 
 int tag;
 int monat;
 int jahr;
};

#endif

berech.h

#ifndef \_\_INCL\_BERECH\_H\_\_
#define \_\_INCL\_BERECH\_H\_\_

extern int tage\_diff( dati datum1, dati datum2);

#endif

berech.cpp

#include "dati.h"
#include "berech.h"

int tage\_diff(dati datum1,dati datum2) 
{
 int tage = 0;
 // ...
 return tage;
}

main.cpp

#include "dati.h"
#include "berech.h"

int main()
{
 dati datum1;
 dati datum2;
 int tage;

 tage = tage\_diff(datum1, datum2);

 return 0;

}

Hi Eirikr,

die Strukturvereinbarung für dati gehört in eine Headerdatei
dati.h, nicht in main.c, wobei es ohnehin main.cpp heissen
sollte, sonst besteht die Gefahr, dass hier ausversehen mit
einem C anstatt einem C++ Compiler übersetzt wird.

Wie kommst du bei dem Stichwort „C-Programmierung“ und dem Quellcode, darauf dass der Poster C++ lernt?

Also C ist bei mir schon etwas länger her, aber wenn man…

dati.h

#ifndef __INCL_DATI_H__
#define __INCL_DATI_H__

struct dati
{
int tag;
int monat;
int jahr;
};

#endif


…das so verwendet, dann funktioniert das …

berech.h

#ifndef __INCL_BERECH_H__
#define __INCL_BERECH_H__

extern int tage_diff( dati datum1, dati datum2);

#endif


… auf keinen Fall, sondern in dem Fall müsste dati.h so aussehen:

typedef struct \_dati 
{ 
 int tag;
 int monat;
 int jahr;
} dati;

oder man lässt die dati.h so muss aber dann in berech.h

extern int tage\_diff( struct dati datum1, struct dati datum2);
  • den gleichen Funktionsaufruf in berech.c tätigen + gleicher Variablendeklaration.

berech.cpp

main.c

#include "dati.h"
#include "berech.h"
int main()
{
struct dati datum1;
struct dati datum2;
int tage;

tage = tage\_diff(datum1, datum2);

return 0;

}

Vielleicht geht ja sowas in c++ (kann kein c++), aber in C geht sowas, mit meiner minderwertigen Kenntniss in C, nicht.

Gruß XXD

Howdy,

die Strukturvereinbarung für dati gehört in eine Headerdatei
dati.h, nicht in main.c, wobei es ohnehin main.cpp heissen
sollte, sonst besteht die Gefahr, dass hier ausversehen mit
einem C anstatt einem C++ Compiler übersetzt wird.

Wie kommst du bei dem Stichwort „C-Programmierung“ und dem
Quellcode, darauf dass der Poster C++ lernt?

du ehrlich gesagt, die Stichworte liest hier nahezu niemand, auch wenn sie jetzt zur Pflicht geworden sind. Aber eine Diskussion dazu wäre hier OT.

Meine Antwort ist in der Tat C++ und da funktioniert das genauso, wie ich es beschrieben habe (einer der Unterschiede ist in der Tat, dass man kein zusaetzliches typedef mehr für structs benoetigt).

Es gibt auch nahezu keinen Grund, selbst im Embedded-Bereich, nicht C++ zu benutzen.

Unabhaengig davon war das eigentliche Problem wohl die Nichtsichtbarkeit der Strukturvereinbarung (declaration) in main. Das nehme ich solange an, bis der UP sich hier wieder meldet.

Gruss
E.

Guten Tag,

nochmal deutlicher zur Herkunft der Fehlermeldung:

Du definierst die Datenstruktur in main.c

Du verwendest, ohne sie zu definieren, eine gleichnamige Datenstruktur in berech.c

Der Compiler weigert sich, korrekterweise, die abstrakte, nur implizit deklarierte Datenstruktur aus berech.c mit der konkret definierten Datenstruktur in main.c zu identifizieren. Schließlich ist da keine Glaskugel eingebaut, die dem Compiler sagt, was Du wirklich gemeint hast. Könnte ja auch ein Tippfehler sein.

Also folge dem Hinweis der anderen Beiträge und lagere die Deklaration der Datenstruktur in eine eigene Header-Datei aus. Oder füge alles in die main.c ein, aber von da kommst Du wahrscheinlich gerade.

Gruß, Lutz

Ich sehe gerade, dass die anderen haben diese Frage bereits beantwortet. Die Anfrage an mich hat sich damit wohl erledigt.