reinterpret_cast: konvertierung von int zu int!?



  • huhu 🙂

    zuallererst, ich bin anfänger in c++. das programm welches mir probleme bereitet, ist ein zahlenratespiel welches ich, anhand der idee von heiko kalista in seinem buch, versucht habe, als übung, selbst zu programmieren.
    der komplette code enthält etwa 200 zeilen, weshalb ich hier nur die abschnitte poste, von denen ich vermute, dass sie das problem hervorrufen. ich wäre sehr erfreut, wenn mir jemand einen anhaltspunkt oder die direkte lösung geben könnte. danke schonmal! hier erstmal die fehlermeldung:

    main.cpp(57) : error C2664: 'spielen' : Konvertierung des Parameters 2 von 'int (__cdecl *)(int)' in 'int' nicht moeglich
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    Fehler beim Ausführen von cl.exe.
    

    was mich daran verwirrt ist, dass ich im ganzen programm nur integer verwende (bis auf eine ausnahme, die mit dem hier aber sicherlich nichts zu tun hat), weswegen doch eigentlich überhaupt kein casting nötig sein müsste, oder!?

    erstmal die funktion 'spielen':

    //SPIELEN
    int spielen(int levelbereich, int level, int pc_highscore)
    {
    	int zahl_erraten = levelbereich;
    	int zahl_eingegeben = 1;
    	int versuche = 0;
    	int bereich_zahl = level * 10;
    	int punkte = 0;
    
    	while (zahl_eingegeben != zahl_erraten)
    	{
    		versuche += 1;
    		cout << "Das ist der " << versuche << " Versuch..\n";
    		cout << "Waehle eine Zahl: ";
    		cin >> zahl_eingegeben;
    
    		if (zahl_eingegeben != zahl_erraten)
    			cout << "Falsch!\n";
    			if (zahl_eingegeben > zahl_erraten)
    				cout << "Tipp: Die eingegebene Zahl ist groesser als die Gesuchte!\n";
    			else if (zahl_eingegeben < zahl_erraten)
    				cout << "Tipp: Die eingegebene Zahl ist kleiner als die Gesuchte!\n";
    		else if (zahl_eingegeben == zahl_erraten)
    			cout << "Richtig!\n";
    		else
    			cout << "Falsche Eingabe! Bitte erneut eingeben!\n";
    
    		punkte = bereich_zahl - versuche + 1;
    		punkte *= level;
    	}
    
    	cout << "Du hast es geschafft! Die Zufallszahl war " << zahl_erraten << "!\n";
    	cout << "Du hast es beim " << versuche << ". Versuch geschafft und somit ";
    	cout << punkte << " Punkte erreicht!\n";
    	if (pc_highscore < punkte)
    		cout << "Highscore geknackt! Herzlichen Glueckwunsch!\n\n";
    	else if (pc_highscore == punkte)
    		cout << "Highscore Gleichstand, WOW! Herzlichen Glueckwunsch!\n\n";
    	else
    		cout << "Highscore leider nicht geknackt!\n\n";
    
    	return punkte;
    }
    

    hier der switch-case teil des menüs (die fehlermeldung bezieht sich auf zu definition des punkte integers durch den die funktion aufgerufen wird):

    switch (menue_auswahl)
    		{
    			case ('S'): 
    			case ('s'):
    			{
    				if (level_auswahl < 1)
    				{
    					cout << "\nSie muessen zuerst ein Schwierigkeitslevel auswaehlen!\n\n";
    					break;
    				}
    				else
    				{
    					cout << "\nSpiel wird gestartet!\n";
    					punkte = spielen(levelbereich, levelauswahl, pc_highscore);
    				}
    			} break;
    			case ('L'):
    			case ('l'):...... usw. usw.
    

    hier noch die deklaration und definiton der variablen in der main funktion:

    //LOKALE VARIABLEN DEKLARIEREN UND DEFINIEREN
    	char menue_auswahl;
    	int level_auswahl = 0; 
    	int levelbereich = (rand()%10)+1;
    	int punkte = 0;
    	int pc_highscore = 0;
    

    ich denke - korrigiert mich bitte wenn ich da falsch liege - das nicht mehr benötigt wird, oder?

    nun, er konnte zuerst nicht kompilieren, daraufhin habe ich das ganze mit reinterpret 'gecastet' (anmerkung: dieser art des castings wird in meinem buch keine zeile gewidmet, ich habe also keine ahnung, was sie wirklich bewirkt).
    das sah dann so aus:

    punkte = spielen(levelbereich, reinterpret_cast<int> (levelauswahl), pc_highscore);
    

    folge: kompiliervorgang erfolgreich, aber die punkte berechnung (die mit dem 2ten parameter der spielen-funktionen [levelauswahl] zusammenhaengt) funktioniert nicht mehr richtig.

    ich hoffe, ich habe weder zuviel noch zu wenig code gepostet und mir kann recht einfach geholfen werden. danke! 🙂

    actinium


  • Mod

    Klammern oder Unterstrich vergessen?

    punkte = spielen(levelbereich, levelauswahl(), pc_highscore);
    punkte = spielen(levelbereich, level_auswahl, pc_highscore);
    

    Dass dein Buch reinterpret_cast in dieser Form nicht behandelt, spricht für das Buch. Diese Castform (Zeiger in Integer und umgekehrt) wird nur extrem selten benötigt und hat in normalem Code nichts verloren.



  • wow! das ging fix, vielen dank, damit hat sich das bereits geklärt! 🙂

    edit: gut, dann werd ich mal weiterlesen. danke nochmals.


Anmelden zum Antworten