expected primary-expression before "int" ??



  • Hallo!
    Jetzt hab ich über eine Stunde versucht, den Fehler raus zu kriegen.
    Problem: Im main()-Part stimmt auf Zeile 18 was nicht (siehe Bemerkung).

    Ich verstehe nicht, warum. Ich habe die Funktion ordentlich deklariert, aufgerufen und definiert.

    Warum erscheint immer die Meldung "18 \main.cpp expected primary-expression before "int" "?

    #include <cstdlib>
    #include <iostream>
    #include "function.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
    int jahr[12] = {31,28,31,30,31,30,31,31,30,31,30,31} ;
    int monat, tag;
    
        cin >> tag  ; 
        cin >> monat ;
    
            int function1(int tag, int monat, int jahr[]);
            int result1 = function1(int tag, int monat, int jahr[]); //Was meckert er hier rum?????????
    
                cout << "Dieser Tag ist der " << function1 << " im Jahr. ";
                cout << "\n \n";
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    //function.h

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
             int i,j=0;
             int function1(int tag, int monat, int jahr[])
                {
                    for (i=0;i<monat;i++)
                        {j += jahr[monat]; cout << j;};
    
                    return j+tag ;
                    }
    

    Das kann doch nicht so schwer sein...!
    Wer kann mir hier weiterhelfen?



  • int result1 = function1(int tag, int monat, int jahr[]); //Was meckert er hier rum?????????
    

    Du hast zuviel copy & past angewendet. Der Aufruf erfolgt ohne die Typangaben.

    int result1 = function1(tag, monat, jahr);
    

    Wenn du die Definition der Funktion mit einer Headerdatei einbindest (wie es bei dir geschieht) dann steht die vollständige Definition der Funktion bereits im Quelltext und du brauchst sie nicht nochmal du deklarieren.



  • Onkel-Philipp schrieb:

    Ich verstehe nicht, warum. Ich habe die Funktion ordentlich deklariert, aufgerufen und definiert.

    Wenn dem so wäre, würde es ja funktionieren.

    Onkel-Philipp schrieb:

    #include <cstdlib>
    #include <iostream>
    #include "function.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        …
        int function1(int tag, int monat, int jahr[]);
        int result1 = function1(int tag, int monat, int jahr[]);
        …
    }
    

    Du hast hier nochmal eine Deklaration von function1 stehen. Wozu? Gerade innerhalb eines Blocks ({..}) ist das sehr unüblich. Du brauchst sie hier auch nicht, da schon eine Deklaration in der Headerdatei steht, die Du per #include einfügst.

    So ruft man keine Funktionen auf. Du sagst ja auch nicht sin(double 3.14) oder sqrt(double 4.0), sondern sin(3.14) und sqrt(4.0). Der Typ hat da nichts zu suchen. Die Typen der Variablen tag, monat und jahr hast Du ja schon weiter oben festgelegt. Die Namen Deiner Variablen müssen übrigens nicht mit denen der Funktionsparameter übereinstimmen.

    Onkel-Philipp schrieb:

    //function.h

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    

    Mit einer using-Direktive in einer Header-Datei verschmutzt Du überall dort den globalen Namensraum, wo diese Header-Datei eingebunden wird. Das macht man nicht.

    Onkel-Philipp schrieb:

    int i,j=0;
    

    Globale Variablen sind zu vermeiden. Diese Variablen gehören in die Funktion.

    int function1(int tag, int monat, int jahr[])
                {
                    for (i=0;i<monat;i++)
                        {j += jahr[monat]; cout << j;};
                    
                    return j+tag ;
                    }
    

    Die Verwendung von monat als Index bei jahr[monat] ist bestimmt falsch. Und j wird nirgendswo wieder auf 0 gesetzt. Da Du j global definiert hast, lebt die Variable es bis zum Programmende und der Zustand bleibt zwischen den Funktionsaufrufen erhalten. Wenn Du die Funktion ein zweites Mal aufrufst, wird j wahrscheinlich nicht mehr anfangs 0 sein.

    Ich möchte mal mit positivem Beispiel voran gehen:

    // datum.hpp
    #ifndef DATUM_HPP_INCLUDED
    #define DATUM_HPP_INCLUDED
    
    /// @param jahr - vierstellige Jahreszahl
    /// @param monat - 1 bis 12
    /// @return gibt an, wieviele Tage der gegebene Monat hat
    int tagepromonat(int jahr, int monat);
    
    /// @param jahr - vierstellige Jahreszahl
    /// @param monat - 1 bis 12
    /// @param tag - 1 bis 31
    /// @return gibt an, der wievielte Tag im Jahr das entsprechende Datum darstellt
    int tagdesjahres(int jahr, int monat, int tag);
    
    #endif
    
    // datum.cpp
    #include <cassert>
    #include "datum.hpp"
    
    namespace { // anonymer Namensraum fuer Modul-interne Dinge
    
      bool schaltjahr(int jahr)
      {
        …
      }
    
      // Tabelle für die Summe der Tage der vergangenen Monate
      const int mtage_kumulativ[] = {
        0,        // nix
        31,       // Januar
        31+28,    // Januar und Februar
        31+28+31, // ...
        31+28+31+30,
        31+28+31+30+31,
        31+28+31+30+31+30,
        31+28+31+30+31+30+31,
        31+28+31+30+31+30+31+31,
        31+28+31+30+31+30+31+31+30,
        31+28+31+30+31+30+31+31+30+31,
        31+28+31+30+31+30+31+31+30+31+30,
        365 // Januar+...+Dezember
      };
    
    } // Ende anonymer Namensraum
    
    int tagdesjahres(int jahr, int monat, int tag)
    {
      assert(1<=monat && monat<=12);
      return tag + mtage_kumulativ[monat-1] + (monat>2 && schaltjahr(jahr));
    }
    
    int tagepromonat(int jahr, int monat)
    {
      assert(1<=monat && monat<=12);
      const int ohne_schaltjahr = mtage_kumulativ[monat]-mtage_kumulativ[monat-1];
      return ohne_schaltjahr + (monat==2 && schaltjahr(jahr));
    }
    

    Was daran besser ist:
    - Funktion verwendet keine global veränderlichen Variablen
    - Funktion hat einen gescheiten Namen
    - Funktion bekommt kein Array mehr übergeben, sondern nur noch ein Datum
    - Funktion kann mit Schaltjahren umgehen
    - Code ist dokumentiert (Kommentare + assert)

    Darüber hinaus sieht man:
    - Include-Guard im Header (wichtig!)
    - Verwendung eines anonymen Namensraum für die "Modul-private" Funktion schaltjahr


Anmelden zum Antworten