C++ Getter Funktion aus Class funktioniert nicht trotz korrekter Formel :(

Shypo

Lieutenant
Registriert
Nov. 2006
Beiträge
772
Hallo,

Einige werden jetzt wahrscheinlich lachen und diesen Simplen Fehler direkt finden, ich komm aber überhaupt nicht dahinter.

Wir sollen für das Studium (ET) einen Konverter Schreiben Binär auf Dezimal und die andere Richtung.
Klappt auch alles soweit, jedoch soll das Ergebnis mit einer Getter Funktion wieder gegeben werden. Und das Ergebnis ist immer 0, bei mir.
Wenn ich das ergebnis im Converter mit "ergebnis = 10;" unter/hinter der for Schleife setze, kommt auch wieder 10 raus.
Sobald ich das aber alles über die Formeln (Horner Schema bei bin2dec) laufen lassen, kommt wieder ergebnis 0.

Das geht weder bei Binär auf Dezimal noch in die Andere Richtung. Obwohl die Formeln alle korrekt sind.

Ich hab keine Ahnung warum, das bei mir nicht läuft. Ich habe Zugriff auf eine Funktionierendes Programm, was von den Formeln genau so geschrieben ist, ich bin aber kein Freund des kopierens. Und ich würde liebend gerne wissen wo mein Fehler sitzt.

Daher wäre ich für Anregungen/Tipps dankbar.

P.S ich nutze Ubuntu in einer VM.

Vielen Dank
Gruß
Shypo


bin2dec.cpp
Code:
#include"bin2dec.h"

bin2dec::bin2dec(string binary)
{
  x = binary;
  ergebnis = 0;
}
int bin2dec::getdecimal()
{
  return ergebnis;
}




void bin2dec::convert()
{
  ergebnis = 0;
  for(int i=2; i<x.length(); i++)
  ergebnis = ergebnis * 2 + (x.at(i) - '0');
  //ergebnis = 10; funktioniert hier
}

bin2dec.h
Code:
#include<string>

using namespace std;


class bin2dec
{
    private:
    string x;
    int ergebnis;


    public:
      bin2dec(string binary);
      int getdecimal();
      void convert();
};

​dec2bin.cpp
Code:
#include<string>#include<sstream>
#include "dec2bin.h"




using namespace std;


dec2bin::dec2bin(string decimal)
{
  x = decimal;
  ergebnis = "";
}


string dec2bin::getbinary()
{
  return ergebnis;
}


void dec2bin::convert()
    {
    int c = 0;
    for(int i=2;i<x.length();i++)
      c = c*10 + (x[i] - '0');
    
    do
      {
    int i = c%2;
    stringstream ss;
    ss<<i;
    string s = ss.str();
        ergebnis = s + ergebnis;
        c/=2;
      }
    while (c>0);


    while(ergebnis.length()<8)
      {
        ergebnis = '0' + ergebnis;
      }
  }

dec2bin.h
Code:
#include<string>

using namespace std;


class dec2bin
{
    private:
    string x;
    string ergebnis;


    public:
      dec2bin(string decimal);
      string getbinary();
      void convert();
};

main.cpp
Code:
#include<iostream>#include<string>
#include"dec2bin.h"
#include"bin2dec.h"


using namespace std;


int main()
{
  string Eingabe;
  cout << "Konverter für Binary -> Decimal oder Decimal -> Binary" << endl;
  cout << "Tragen Sie die zu Konvertierende Zahl mit\n b "Zahlen" für Binary auf Decimal, oder\n d "Zahlen" für Decimal auf Binary ein" << endl;
  cin >> Eingabe;
  if (Eingabe[0] == 'b') //ASCI 98 = b
    {
      bin2dec bd(Eingabe);
      cout << "Konvertiere von Binary -> Decimal" << endl;
      bd.convert();
      cout << "Decimal = " << bd.getdecimal() << endl;
    }
  if (Eingabe[0] == 'd') //ASCI 100 = d
    {
      dec2bin db(Eingabe);
      cout << "Konvertiere von Decimal -> Binary" << endl;
      db.convert();
      cout << "Binary = " << db.getbinary() << endl;
    }
  return 0;
}

makefile
Code:
CC := g++
CPPFLAGS :=
LDFLAGS :=
LDLIBS := -lstdc++
SILENT := @
ECHO := echo


MODULES := dec2bin bin2dec main
SRC = $(MODULES:%=%.cpp)
OBJ = $(SRC:%.cpp=%.o)


all: main


main: $(OBJ)
    $(SILENT) $(ECHO) "--- Creating $@ ---"
    $(SILENT) $(CC) $^ -o $@ $(LDFLAGS)


%.o: %.cpp
    $(SILENT) $(ECHO) "--- Compiling $@ ---"
    $(SILENT) $(CC) $^ -c $(CFLAGS) $<


.PHONY: clean
clean:
    $(SILENT) $(ECHO) "--- Removing object files $@ ---"
    $(SILENT) rm -f *.o
 
Zuletzt bearbeitet:
Nimm mal die <code>-Tags, anstatt quotes. Das kann man so kaum lesen und dann füge auch nur die betroffenen Stellen des Codes ein (das makefile interessiert z.B. wohl eher nicht)

Wie lang ist deine Eingabe, die du bei bin2dec übergibst? Ist die nämlich kürzer als 3, läuft die Schleife nicht.
Teste mal wie oft die Schleife überhaupt läuft und was für Werte darin angenommen werden (Debugger oder einfach cout)
 
Zuletzt bearbeitet:
Hallo

Die Eingabe ist immer "b 00100010" oder "d 45"
Der 1 wert im String ist b oder d, je nach dem wie zu convertieren ist. Gefolgt von einer Leertaste, der 2 Wert.

Danke
Gruß
 
Hast du dir den eingelesenen String mal ausgeben lassen?
der operator >> ließt nur bis zum ersten whitespace (leerzeichen, Zeilenumbruch etc.), also in deinem Fall nur das Zahlenformat der String hat daher immer die Länge 1 und die Schleife wird nicht durchlaufen.
Du kannst stattdessen entweder getline nutzen oder zweimal >> und das Format und die Zahl in separate Variablen speichern:
Code:
cin >> format >> number
 
Zuletzt bearbeitet:
Miuwa schrieb:
Hast du dir den eingelesenen String mal ausgeben lassen?
der operator >> ließt nur bis zum ersten whitespace (leerzeichen, Zeilenumbruch etc.), also in deinem Fall nur das Zahlenformat der String hat daher immer die Länge 1 und die Schleife wird nicht durchlaufen.
Du kannst stattdessen entweder getline nutzen oder zweimal >> und das Format und die Zahl in separate Variablen speichern:
Code:
cin >> format >> number

Vielen Dank, das wars...
So war es auch in der Main des Lauffähigen Programmes.

Habe Getline für das Gegenstück von printf gehalten. In den Vorlesungen hatten wir nur cout/cin, daher hab ich mich nie mit printf oder Getline vertraut gemacht, bisher musste ich das ja auch noch nicht :)

Danke euch

Gruß
​Shypo
 
getline gehört zu C++ und kannst bei Bedarf verwenden.
printf gehört zu C und du solltest gar nicht erst angewöhnen es zu nutzen.
 
Mit getline würds in so aussehen:
Code:
getline(cin, Eingabe);

Aber da du die Eingabe ja ohnehin zerlegst (typ und ziffern) ist der >> operator mit zwei separaten Variablen wohl die bessere Wahl.
 
Zurück
Oben