PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe für C++



Mivey
17.10.2009, 12:14
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

#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;
};

DFYX
17.10.2009, 12:37
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.

Kyuu
17.10.2009, 12:47
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;"

DFYX
17.10.2009, 12:50
Kann es sein, dass du entweder von Basic oder von Pascal auf C++ umsteigst, Mivey?

Mivey
17.10.2009, 12:52
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.^^

DFYX
17.10.2009, 12:57
Weil das Weglassen der Klammern bei Funktionen ohne Parameter und die Reihenfolge erst Variablenname, dann Typ bei beiden Sprachfamilien nicht ganz unüblich ist.

Mivey
17.10.2009, 13:10
Das mit ist = bool war ja unabsichtlich und das ich die Parameter in der Abfrage miteinbeziehen muss wusste ich nicht^^

Whiz-zarD
17.10.2009, 13:31
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


if ((jahr % 4 == 0) && ((jahr % 100 == 0) || (jahr % 400 = 0))) then
ist = true;
else
ist = false;
heissen. Oder sehe ich das falsch?

DFYX
17.10.2009, 13:36
Ö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:

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.

Whiz-zarD
17.10.2009, 13:45
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?

Mivey
17.10.2009, 14:27
Das tu ich auch, Whizzard xD
Statt dem unsinnigen int ist = bool soll da bool ist = false stehen.^^