Ergebnis 1 bis 11 von 11

Thema: Hilfe für C++

  1. #1

    Hilfe für C++

    Ich versuche seit kurzer Zeit C++ zu erlernen.
    Allerdings habe ich jetzt ein Problem das ich nicht ganz verstehe. Das Ziel des Codes ist es das man irgendeine Zahl eingibt bei der dann überprüft wird ob sie durch 4, 100 und/oder 400 teilbar ist. (Soll überprüfen ob es ein Schaltjahr ist)

    Mein Problem ist: Ich benutze für die Überprüfung eine bool-Variable, wenn ich aber in einem if überprüfen will ob es true ist bekomme ich die Fehlermeldung
    "'==': unsichere Kombination von Typ 'bool (__cdecl *)(int)' mit Typ 'bool' in einer Operation"
    "'==': Keine Konvertierung von 'int' in 'bool (__cdecl *)(int)"
    "Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat"


    Daraus schließe ich das ich die die boolsche Variable falsch verwende aber ich sehe nicht wo.
    Könnte mir jemand vielleicht sagen WAS ich falsch mache?

    Der Code
    Code:
    #include <iostream> // Input/Output-Stream
    
    
    using namespace std;
    
    bool schaltjahr(int jahr);
    
    
    
    int main()
    {
        int eingabe;
        cout << "Gib Jahreszahl ein\n" ;
        cin >> eingabe;
        schaltjahr (eingabe);
        if (schaltjahr == true)
            cout << eingabe << " ist ein Schaltjahr\n";
        else
            cout << eingabe << " ist kein Schaltjahr\n";
        system ("pause");
        return 0;
    }
    
    bool schaltjahr(int jahr)
    {
       int ist = bool;
       if (jahr%4 == 0)
          ist = true;
       if (jahr%100 == 0)
          ist = false;
       if (jahr%400 == 0)
          ist = true;
       return ist;
    };

  2. #2
    Fehler ist die Zeile if (schaltjahr == true). Wenn du schaltjahr so verwendest, kriegst du die Stelle im Speicher, wo der Code der Funktion anfängt. Du willst die Funktion aber ja eigentlich aufrufen und das Ergebnis verwenden. Richtig wäre daher if (schaltjahr(eingabe) == true) oder kürzer if(schaltjahr(eingabe)). Die Zeile schaltjahr(eingabe); fällt dementsprechend weg. Die hieße, dass du berechnest, ob die Eingabe ein Schaltjahr ist und das Ergebnis dann wegwirfst.

  3. #3
    Ich weiterer Fehler ist in der Zeile "int ist = bool;"
    bool ist ein Typ und hat keinen Wert, du versuchst also einer Variable vom Typ int mit dem Typ bool zu initialisieren. Richtig wäre "bool ist;"

  4. #4
    Kann es sein, dass du entweder von Basic oder von Pascal auf C++ umsteigst, Mivey?

  5. #5
    Zitat Zitat von DFYX Beitrag anzeigen
    Kann es sein, dass du entweder von Basic oder von Pascal auf C++ umsteigst, Mivey?
    Das mit int ist = bool war einfach ein Aufmerksamkeitsfehler xD.
    Ging mir nur um das mit dem if. Muss mal probieren ob das so klappt.

    Und nein ich steige von gar nichts um, das sind meine ersten Erfahrungem mit Programmiersprachen xD Wie kommst du darauf?^^

    EDIT:
    Danke, das klappt.^^

  6. #6
    Weil das Weglassen der Klammern bei Funktionen ohne Parameter und die Reihenfolge erst Variablenname, dann Typ bei beiden Sprachfamilien nicht ganz unüblich ist.

  7. #7
    Das mit ist = bool war ja unabsichtlich und das ich die Parameter in der Abfrage miteinbeziehen muss wusste ich nicht^^

  8. #8
    Ich kenn mich zwar mit C/C++ nicht besonders aus aber ist da nicht ein algorithmischer Fehler drinnen?

    Wie ich das sehe, wird doch bei der Schaltjahrabfrage immer der vorherige Wert überschrieben. Also müssten, laut diesem Algorithmus, alle Jahre, die durch 400, mit Rest 0 teilbar, sind ein Schaltjahr sein, was aber nicht stimmt.

    Richtig müsste es
    Code (C++):
     
    if ((jahr % 4 == 0) && ((jahr % 100 == 0) || (jahr % 400 = 0))) then 
      ist = true;
    else 
      ist = false;

    heissen. Oder sehe ich das falsch?

  9. #9
    Öhm doch, das passt so. Schaltjahre sind Jahre, die durch 4, aber nicht durch 100 teilbar sind. Außer sie sind auch durch 400 teilbar.

    Das wäre:
    Code (C++):
    if (((jahr % 4 == 0) && (jahr % 100 != 0)) || (jahr % 400 == 0))
      ist = true;
    else 
      ist = false;


    Was exakt Miveys Code entspricht.

    Edit: dein Code ist schon deshalb unlogisch, weil alles, was durch 400 teilbar ist, auch garantiert durch 100 und 4 teilbar ist. Demnach würde sich deine erste Zeile (durch das && und das ||) auf if(jahr % 100 == 0) verkürzen. Nicht so ganz korrekt. Von den Syntaxfehlern mal abgesehen. Ist ja nur Pseudocode.

    Geändert von DFYX (17.10.2009 um 14:45 Uhr)

  10. #10
    Zitat Zitat von DFYX Beitrag anzeigen
    Edit: dein Code ist schon deshalb unlogisch, weil alles, was durch 400 teilbar ist, auch garantiert durch 100 und 4 teilbar ist. Demnach würde sich deine erste Zeile (durch das && und das ||) auf if(jahr % 100 == 0) verkürzen. Nicht so ganz korrekt. Von den Syntaxfehlern mal abgesehen. Ist ja nur Pseudocode.
    ah, sorry. So meinte ich es auch, hab aber die Negation vergessen ^^"

    edit: Bei Miveys Algorithmus würde ich ist noch vorher einen Wert zuweisen, da es hier zu Problemen würden kann. Bsp:
    Jahr = 7
    Jahr % 4 = 3 -> ist bleibt unverändert
    Jahr % 100 = 7 -> ist bleibt unverändert
    Jahr % 400 = 7 -> ist bleibt unverändert

    ist wird also nie gesetzt und im Speicher steht dann irgendwas.

    Oder setzt C/C++ automatisch den Wert, für eine Variabel, auf 0?

    Geändert von Whiz-zarD (17.10.2009 um 14:59 Uhr)

  11. #11
    Das tu ich auch, Whizzard xD
    Statt dem unsinnigen int ist = bool soll da bool ist = false stehen.^^

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •