Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Problem mit Rückgabe bei Funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
01.03.2008, 12:24 Uhr
studistudi



Halllo, habe wieder mal ein kleines Problem..

Ich schreibe gerade ein Programm, dass eine eingegebene Zahl vom Binärsystem ins Zehnersystem umwandelt und umgekehrt. Ich habe dort eine Funktion eingebaut.

Die Funktion sollte die Variable "stellenzaehler" zurückgeben. Aber wenn ich nun unten in der Main-Funktion diese Variable ausgeben möchte, erscheint sie mit dem alten Wert, und nicht mit dem, der die Funktion ausgerechnet hat..


C++:
#include <iostream>
using namespace std;

int funktionstellenzaehler(double eingabe, double eingabeverarbeitungswert, double stellenzaehler)
{
    while(eingabeverarbeitungswert >= 10)
            {
             eingabeverarbeitungswert = eingabeverarbeitungswert/10;
             stellenzaehler++;                                                              
             if (eingabeverarbeitungswert<10)
                {
                cout << "Stellen: " << stellenzaehler;  
                return stellenzaehler;
                }                                                                
             }
    
};


int main()
{
short CHOOSE;  
double eingabe;
double eingabeverarbeitungswert;
double stellenzaehler=1;


cout << "Welcome to the Binary-Calculator!\n\nChoose and push enter:\n1 - Binary number to a decimal\n2 - Decimal to binary\n3 - About\n";
cin >> CHOOSE;
cin.sync();

if (CHOOSE == 1)
{
            cout << "Binary >> Decimal\nplease give in the Binary!:";
            cin >> eingabe;
            cin.sync();
            cout << "\n";
            eingabeverarbeitungswert=eingabe;
        
            funktionstellenzaehler(eingabe, eingabeverarbeitungswert, stellenzaehler);
            cout << "Stellen: " << stellenzaehler;
}

else if (CHOOSE == 2)
{
            cout << "FEATURE IN WORK, COMING SOON";
            cin >> eingabe;
            cin.sync();
}
else if (CHOOSE == 3)
{
      cout << "coded on Dev-C++ 4.9.9.2 with C++, Windows Vista\nFound Bugs? Write me at pascal.studer1618@gmail.com";
      
  }
else
{
      cout << "you can't choose "
           << CHOOSE;
  }

  
    
cin.get();
return 0;  
}


--
Dev-C++
Windows Vista x86

Dieser Post wurde am 01.03.2008 um 13:08 Uhr von studistudi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.03.2008, 13:14 Uhr
Oliver
S2-Pixelgeneral


stellenzaehler wird an die Funktion per value übergeben und ist nur eine KOPIE der ursprünglichen Variable, d.h. wenn du "stellenzaehler" in der funktionstellenzaehler-Funktion veränderst, hat das keinen Einfluss auf die funktionstellenzaehler-Variable in der main-Funktion.

Den Rückgabewert einer Funktion bekommst du nur so!


C++:
rueckgabe = funktion(a,b,c);



Den Rückgabewert von funktionstellenzaehler speicherst du aber nirgendswo, es müsste also wenn dann heißen:


C++:
stellenzaehler = funktionstellenzaehler(eingabe, eingabeverarbeitungswert, stellenzaehler);



Den stellenzaehler-Parameter kannst du so auch weglassen.


Außerdem macht es hier überhaupt keinen Sinn Gleitkommazahlen (doubles) zu verwenden. Du brauchst doch keine gebrochenen Zahlen?
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.03.2008, 13:40 Uhr
studistudi



Für die Eingabe macht es einen Sinn, denn es können grössere Werte eingegeben werden. Die Variable Stellenzähler kann reicht auch als Integer, hab ich schon erledigt.
--
Dev-C++
Windows Vista x86

Dieser Post wurde am 01.03.2008 um 13:49 Uhr von studistudi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.03.2008, 14:46 Uhr
Oliver
S2-Pixelgeneral


Dann nimm lieber "unsigned long long", dann hast du auch 64bit und kannst sogar noch größere Zahlen darstellen. Gleitkommazahlen sind hier einfach gefährlich, da kann es ganz schnell gehen, dass aus 2 mal 1,9999999 wird wegen irgendwelchen Ungenauigkeiten.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.03.2008, 16:57 Uhr
studistudi



Ok danke!

wusse gar nicht das es "long long" gibt..
--
Dev-C++
Windows Vista x86
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.03.2008, 17:12 Uhr
studistudi



Es gibt da trotzdem ein Problem, die höchste Zahl, die ich hier eingeben kann hat nur etwa 20 Stellen.

C++:
short CHOOSE;  
unsigned long long eingabe;
unsigned long long eingabeverarbeitungswert;
short stellenzaehler=1;



Wenn ich "eingabe" und "eingabeverarbeitungswert" double zuweise kann ich auch Zahlen mit 100 Stellen eingeben. Warum?
--
Dev-C++
Windows Vista x86
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.03.2008, 17:51 Uhr
xXx
Devil


Eine Frage ... wofür ist eingabe überhaupt?
Deine Funktion hat so einen Fehler! Guck dir z.B. mal an, was passiert, wenn du an funktionstellenzaehler eine 0...9 übergibst?


C++:
const unsigned int count_diggits(unsigned long long value)
{
    if (value < 10UL) return 1;
    if (value < 100UL) return 2;

    unsigned int diggits(0U);
    while ((value /= 10UL) > 0) ++digits;

    return digits;
}
so sollte es am einfachsten gehen ... (kann sein das ich was vergessen hab )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.03.2008, 18:13 Uhr
studistudi




Zitat von xXx:
Eine Frage ... wofür ist eingabe überhaupt?
Deine Funktion hat so einen Fehler! Guck dir z.B. mal an, was passiert, wenn du an funktionstellenzaehler eine 0...9 übergibst?


C++:
const unsigned int count_diggits(unsigned long long value)
{
    if (value < 10UL) return 1;
    if (value < 100UL) return 2;

    unsigned int diggits(0U);
    while ((value /= 10UL) > 0) ++digits;

    return digits;
}
so sollte es am einfachsten gehen ... (kann sein das ich was vergessen hab )


Eingabe brauche ich später dann noch, deshalb habe ich eingabeverarbeitungswert
--
Dev-C++
Windows Vista x86
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.03.2008, 19:19 Uhr
Oliver
S2-Pixelgeneral



Zitat von studistudi:
Es gibt da trotzdem ein Problem, die höchste Zahl, die ich hier eingeben kann hat nur etwa 20 Stellen.

Wenn ich "eingabe" und "eingabeverarbeitungswert" double zuweise kann ich auch Zahlen mit 100 Stellen eingeben. Warum?



Ähh, wofür brauchst du Zahlen mit mehr als 20 Stellen?

Ansonsten guck dir mal an, wie Gleitkommazahlen gespeichert werden:
http://de.wikipedia.org/wiki/Gleitkommazahl#Gleitkommazahlen_in_der_Digitaltechnik

Kurz gesagt kannst du irgendwelche Zahlen mit 100 Stellen vielleicht speichern, aber könntest genauso schon bei 10 Stellen Probleme bekommen.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.03.2008, 15:25 Uhr
xXx
Devil



Zitat:
Eingabe brauche ich später dann noch, deshalb habe ich eingabeverarbeitungswert
Das erkläre mir mal bitte
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: