Funktionen und Variablen über Header Dateien



  • Hallo liebe Gemeinde.

    Die Frage hört sich jetzt vielleicht für die Profis unter euch blöd an, aber wie bezieht man in einen Programmcode selbstgeschriebene Headerdateien mit ein?

    Folgende Header Dateien habe ich aufgesetzt:

    Bsp.: Addition

    In Addition.h habe ich folgenden Code geschrieben:

    #include <iostream>
    using namespace std;
    
    float Addition (float x, float y)
    {
      cout << "Funktion Addition!" << endl;
      return(x+y);
    }
    

    Vom Prinzip her habe ich die Funktionen Subtraktion, Multiplikation und Division auch so jeweils in Header-Dateien aufgebaut.

    In der Quelldatei wollte ich dann folgenden Code schreiben:

    #include <iostream>
    #include <Addition.h>
    #include <Subtraktion.h>
    #include <Multiplikation.h>
    #include <Division.h>
    
    float Addition(float, float);
    float Subtraktion(float, float);
    float Multiplikation(float, float);
    float Division(float, float);
    
    int main()
    {
      float x,y;
    
      cout << "\tDie vier Grundrechenarten!" << endl;
      cout << "Geben Sie dazu bitte zwei Zahlen ein!" << endl;
      cout << "x: ";
      cin  >> x;
      cout << "y: ";
      cin  >> y;
    
      float a = Addition(x,y);
      float b = Subtraktion(x,y);
      float c = Multiplikation(x,y);
      float d = Division(x,y);
    
      return 0;
    }
    

    Das Programm funktioniert jedoch nicht.

    Folgende Fehlermeldung bekomme ich:

    fatal error C1083: Datei(Include) kann nicht geöffnet werden: "Addition.h": No such file or directory
    

    Wo liegt bitte der Fehler?

    Vielen Dank im Voraus für die Antworten.

    Gruß

    Max



  • #include "Addition.h"
    

    könnte gehen.
    Warum definierst du die Funktionen im Header?



  • Weil ich es einfach mal ausprobieren wollte, ob es funktioniert.



  • silent_max schrieb:

    Weil ich es einfach mal ausprobieren wollte, ob es funktioniert.

    Mit nur einer cpp wirst du die Probleme aber nicht entdecken.



  • Wie meinst Du das?



  • Bezueglich des eigentlichen Problems: probier mal das von manni66 aus, wenn es dann noch nicht geht guck nach ob Addition.h wirklich so geschrieben ist und auch im Include-Path liegt.

    Ansonsten: Im Header deklariert man Funktionen nur (Ausnahme: man verpasst ihnen ein inline ), die Implementierung gehoert in eine Cpp-Datei.
    Und man oeffnet NIEMALS Namespaces im Header. Es klingt zwar banal, kann aber bei groesseren Programmen zu seltsamen, schwer auffindbaren Fehlern fuehren. So merkst du z.B. nicht, dass du in deiner Haupt-Datei das using namespace std; vergessen hast - aber es koennte trotzdem Funktionieren, weil du es ja mit Inkludierst. Veraenderst du jetz aber die Header dahingehend, dass das nicht mehr drin steht schmeisst aufeinmal die Hauptdatei Fehler, obwohl du nur Header editiert hast - mag hier gehen, aber in groessren Projekten ist das einfach nur laesstig.
    Google ausserdem mal nach Include-Guards (in deinem Beispiel nicht wichtig, sollte man sich aber angewoehnen).

    Und was sollen die unsinnigen deklarationen der Funktionen in der Haupt-Datei, das machst du doch im Header schon implizit durch die Definition 😕



  • Du brauchst eine Headerdatei:

    //addition.h:
    
    #ifndef ADDITION_H
    #define ADDITION_H
    
    float Addition (float x, float y);
    
    #endif
    

    Dann eine Quellcodedatei:

    //addition.cpp:
    
    #include <iostream>
    #include "addition.h"
    
    using namespace std;
    
    float Addition (float x, float y)
    {
      cout << "Funktion Addition!" << endl;
      return(x+y);
    }
    

    Wenn Du das nun benutzen willst:

    //main.cpp
    
    #include "addition.h"
    
    int main()
    {
        Addition(3.4, 1.0);
    }
    


  • C99 N1124

    6.10.2 schrieb:

    A preprocessing directive of the form

    # include <h-char-sequence> new-line
    

    searches a sequence of implementation-defined places for a header
    [...]
    How the places are specified or the header
    identified is implementation-defined.

    6.10.3 schrieb:

    A preprocessing directive of the form

    # include "q-char-sequence" new-line
    

    [...]
    The named source file is searched
    for in an implementation-defined manner.



  • Sone schrieb:

    [...]

    Und? Da fehlt vor allem die (auch relevante) Hälfte.



  • Tachyon schrieb:

    Sone schrieb:

    [...]

    Und? Da fehlt vor allem die (auch relevante) Hälfte.

    Nein... die ist nicht relevant...



  • Ich habe gestern Abend noch bisschen rumprobiert, ob ich es hinbekomme, die Header-Dateien mit einbeziehen zu können, habe es aber nicht geschafft.

    Also hier einmal der gesamte Code.

    In Addition.h habe ich geschrieben:

    #include <iostream>
    using namespace std;
    
    float Addition(float x, float y)
    {
      cout << "Funktion Addition!" << endl;
      return (x+y)
    }
    

    In Subtraktion.h:

    #include <iostream>
    using namespace std;
    
    float Subtraktion (float x, float y)
    {
      cout << "Funktion Subtraktion!" << endl;
      return(x-y);
    }
    

    In Multiplikation.h:

    #include <iostream>
    using namespace std;
    
    float Multiplikation (float x, float y)
    {
      cout << "Funktion Multiplikation!" << endl;
      return(x*y)
    }
    

    In Division.h:

    #include <iostream>
    using namespace std;
    
    float Division (float x, float y)
    {
      cout << "Funktion Division!" << endl;
      return(x/y);
    }
    

    In der Quelldatei habe ich dann folgendes geschrieben:

    #include <iostream>
    #include <Addition.h>
    #include <Subtraktion.h>
    #include <Multiplikation.h>
    #include <Division.h>
    using namespace std;
    
    float Addition(float x, float y);
    float Subtraktion(float x, float y);
    float Multiplikation(float x, float y);
    float Divison(float x, float y);
    
    int main()
    {
      float x,y;
    
      cout << "\tDie vier Grundrechenarten!" << endl;
      cout << "Geben Sie dazu bitte zwei Zahlen ein!" << endl;
      cout << "x: ";
      cin  >> x;
      cout << "y: ";
      cin  >> y;
    
      float a = Addition(x,y);
      float b = Subtraktion(x,y);
      float c = Multiplikation(x,y);
      float d = Division(x,y);
    
      cout << endl;
      cout << "a nach Addition: " << a << endl;
      cout << "b nach Subtraktion: " << b << endl;
      cout << "c nach Multiplikation: " << c << endl;
      cout << "d nach Division: " << d << endl;
      cout << endl;
    
      return 0;
    }
    

    Es kommt immer noch die folgende Fehlermeldung:

    fatal error C1083: Datei (Include) kann nicht geöffnet werden: "Addition.h": No such file or directory
    

    Ich weiß einfach nicht, wo der Fehler sein kann bzw. wo der Fehler ist. Weil ich meines Erachtens doch die Header Dateien mit z. B.

    #include <Addition.h>
    

    richtig einbezogen habe??

    @Benni:

    Ich will ja, dass für x und für y Zahlen per Tastatur eingegeben werden. Muss ich in den Header Dateien den Funktionsprototypen schreiben und dann im Main die Funktionsdefinition machen oder kann ich wie im oberen Code es umgekehrt machen, dass ich in der Header Datei die Funktionsdefinition mache und im Main den Funktionsprototypen schreibe??

    Gruß

    Max



  • silent_max schrieb:

    Ich weiß einfach nicht, wo der Fehler sein kann bzw. wo der Fehler ist. Weil ich meines Erachtens doch die Header Dateien mit z. B.

    #include <Addition.h>
    

    richtig einbezogen habe??

    Hier wurde bereits gerade erklärt, dass du statt den spitzen Klammern die Anführungszeichen brauchst.



  • Und weil's so schön war nochmal ...

    Belli schrieb:

    Du brauchst eine Headerdatei:

    //addition.h:
    
    #ifndef ADDITION_H
    #define ADDITION_H
    
    float Addition (float x, float y);
    
    #endif
    

    Dann eine Quellcodedatei:

    //addition.cpp:
    
    #include <iostream>
    #include "addition.h"
    
    using namespace std;
    
    float Addition (float x, float y)
    {
      cout << "Funktion Addition!" << endl;
      return(x+y);
    }
    

    Wenn Du das nun benutzen willst:

    //main.cpp
    
    #include "addition.h"
    
    int main()
    {
        Addition(3.4, 1.0);
    }
    

    👍
    🙂

    Man achte auch darauf, was im Header steht und was nicht:
    - kein "using namespace"
    - keine Definitionen der Funktionen, sondern ihre Deklarationen

    @silent_max:
    Schnapp Dir dein C++ Lehrbuch und schlage nach, was genau mit "translation unit" (Übersetzungseinheit) gemeint ist, sowie die ODR (one definition rule). Das ist wichtig!



  • Entschuldigt, das mit den Gänsefüsschen habe ich total überlesen.

    Jetzt funktioniert es.

    Ich danke euch.

    Gruß

    Max


Log in to reply