Problem mit einer char-Variable einer Klasse (cin?)



  • Hi,

    mein Programm besitzt folgende Klasse:

    class Daten
    {
    public:
    char *sw;
    double tausch;
    char *ew;
    };
    Daten t[14];

    Nun soll der Benutzer etwas in eingeben, bisher realisiert durch:

    cin >> t[1].sw;

    Allerdings scheint das nicht zu funktionieren... und wenn ich es wieder versuche auszugeben, mit

    cout << t[i].sw;

    stürzt das Programm ab.

    Was mache ich falsch?

    MfG
    HReaper



  • sw ist nicht intitialisiert, zeigt also zufällig irgendwohin, cin versucht dort Zeichen hinzuspeichern (obwohl es da schon knallen könnte klappt das zufällig noch), beim cout raucht die Kiste dann endgültig ab.

    BTW solltest du deine Klasse mit dem Schlüsselwort struct deklarieren, das bringt die Absicht einer "dummen" Datenhalterklasse ohne Verhalten besser zum Ausdruck (das public-Schlüsselwort kann dann auch entfallen).



  • Bashar schrieb:

    sw ist nicht intitialisiert, zeigt also zufällig irgendwohin, cin versucht dort Zeichen hinzuspeichern (obwohl es da schon knallen könnte klappt das zufällig noch), beim cout raucht die Kiste dann endgültig ab.

    dumme Frage, wie intitalisiere ich sw dann?

    Bashar schrieb:

    BTW solltest du deine Klasse mit dem Schlüsselwort struct deklarieren, das bringt die Absicht einer "dummen" Datenhalterklasse ohne Verhalten besser zum Ausdruck (das public-Schlüsselwort kann dann auch entfallen).

    ok, danke



  • HReaper schrieb:

    dumme Frage, wie intitalisiere ich sw dann?

    Entweder mit new, oder indem du sw statt eines Pointers ein Array sein läßt. Clevere Leute lassen von sowas gleich die Finger und benutzen die string-Klasse der Standardbibliothek.
    Wenn dir das alles nichts sagt hast du ein wenig Lesestoff vor dir.



  • Bashar schrieb:

    Entweder mit new, oder indem du sw statt eines Pointers ein Array sein läßt. Clevere Leute lassen von sowas gleich die Finger und benutzen die string-Klasse der Standardbibliothek.
    Wenn dir das alles nichts sagt hast du ein wenig Lesestoff vor dir.

    Mir sagt das ein wenig. Zugegeben hab ich noch nicht soviel Ahnung davon.

    Du würdest mir aber wahnsinnig helfen, wenn du meinen obigen Codeauszg so abänderst, dass es funktioniert. Um mich mit den Hintergründen auseinander zu setzen, fehlt mir gerade etwas die Zeit; auch wenns sich doof und faul anhört.



  • #include <string>
    #include <iostream>
    using namespace std;
    
    struct Daten {
      string ew, sw;
      double tausch;
    };
    
    int main() {
      Daten t[4]; 
      cin >> t[0].sw;
      cout << t[0].sw;
    }
    // etwas nachpolieren musst du noch ;)
    


  • Bashar schrieb:

    #include <string>
    #include <iostream>
    using namespace std;
    
    struct Daten {
      string ew, sw;
      double tausch;
    };
    
    int main() {
      Daten t[4]; 
      cin >> t[0].sw;
      cout << t[0].sw;
    }
    // etwas nachpolieren musst du noch ;)
    

    hey cool, es funktioniert, aber... es ist wesentlich langsamer. Der Hauptteil des Programms macht ein rekursiver Algo aus, und der braucht nun -aus irgendwelchen Gründen- viel länger um zum Ergebnis zu kommen. Gibts nicht ne Version, bei der ich die Pointer behalte? Der Performance-Verlust ist leider doch erheblich. Wie war das mit 'new'? Wärs nur ne weitere Zeile die ich tippen müsste?



  • Du kopierst wahrscheinlich die Struktur in der Gegend herum. Das führte bei deiner Version dazu, dass nur die Pointer kopiert wurden. Bei meiner werden die String-Objekte kopiert, und das ist um Dimensionen aufwändiger. Die Lösung besteht einfach darin, dass du die Struktor nicht herumkopierst, sondern nur Referenzen übergibst. Näheres kann ich dazu nicht sagen, weil ich dein Programm nicht kenne. Letztendlich bleibt aber wieder nur zu sagen, schnelle Programme kriegst du nicht hin, wenn du C++ nicht verstehst. Und das kann ich dir nicht abhnehmen.

    Mal als Versuch. Angenommen, deine rekursive Funktion sieht so aus:

    void funktion(Daten d)
    {
      if (blah) {
        /* da manipulieren */
        funktion(d);
      }
    }
    

    Dann wird die Struktur als Wert übergeben (by-value), das bedeutet, sie wird kopiert. Um eine Übergabe per Referenz zu erreichen (by-reference), musst du den Parameter als Referenz auf Daten deklarieren: Daten & d, oder, falls die Funktion die Daten nicht verändert besser: Daten const & d


Anmelden zum Antworten