Probleme mit Zeigern



  • hi

    ich bräuchte mal etwas Hilfe bei der programmierung einer Funktion. Ich hba dort so meine Probleme mit Zeigern. An sich weiß ich die elementaren Dinge was Zeiger angeht, aber mit der anwendung klappts nicht immer. Hier erstmal der Code von mir:

    void funktion_operandenstellen(wxString eingabefeld, wxString operand, wxString perste_operand);
    ...
    perste_plus=&wxString_plus_stellen[0];
    perste_minus=&wxString_minus_stellen[0];
    perste_mal=&wxString_mal_stellen[0];
    perste_geteilt=&wxString_geteilt_stellen[0];
    funktion_operandenstellen(eingabefeld, "+", *perste_plus);
    funktion_operandenstellen(eingabefeld, "-", *perste_minus);
    funktion_operandenstellen(eingabefeld, "*", *perste_mal);
    funktion_operandenstellen(eingabefeld, "/", *perste_geteilt);
    ...
    void funktion_operandenstellen(wxString eingabefeld, wxString operand,wxString perste_operand)
    {
        wxString char_aktuell, stellen_string;
        for (unsigned int stelle=0; stelle<=eingabefeld.Len()+1; stelle++)
        {
            char_aktuell=eingabefeld[stelle];
            if (char_aktuell.Contains(operand))
                {
                    stellen_string.Empty();
                    stellen_string<<stelle;
                    perste_operand=stellen_string;
                    *perste_operand++;
                }
        }
    }
    

    ich hatte eig vor die Stellen in einem wxString festzustellenan denene ein bestimmter operand ist. Diese wollte ich dann in einem Array speichern. Ich hatte auch versucht den ganzen Spaß auf dem Heap zu machen, hat aber auch nciht funktioniert.

    ich hab das ganzen jetzt nicht bei wxWidgets reingestellt, weil es ja im wesentlichen um Zeiger geht.

    ich danke schon einmal im Voraus



  • Wo genau ist denn das Problem?

    Ich würde mal sagen, dass du irgendetwas mit Zeigern basteln willst, ohne, dass du überhaupt Zeiger brauchst:

    perste_plus=&wxString_plus_stellen[0];
    perste_minus=&wxString_minus_stellen[0];
    perste_mal=&wxString_mal_stellen[0];
    perste_geteilt=&wxString_geteilt_stellen[0];
    

    Das scheint so, als ob du probierst einen string zu "kopieren", indem du die Addresse des ersten Elementes des stringes umhängen möchtest.. Ich kenne wxString jetzt nicht, aber ich denke mal, dass da ein operator = überladen ist und man das ganz normal zuweisen können sollte. Da etwas mit Low Level zu mischen wäre einfach nur unsauber.



  • naja der punkt ist ich wollte wissen wie ich das am besten schriebe, dass ich die wxStrings in dem Array direkt verändern möchte. Ich bekomm das aber mit dem übergeben von Zeigern etc. einfach nciht anständgig auf die Reihe



  • 😕
    Ich verstehe immernoch nicht, was du meinst..

    Sag konkret im Code, was dir Mühe bereitet und wo das Problem liegt.



  • void funktion_operandenstellen(wxString eingabefeld, wxString operand, wxString perste_operand);
    

    Was in aller Welt ist ein perste? Nundenn, du verwendest perste_operand als Zeiger innerhalb der Funktion. Du deklarierst es jedoch als reguläres Objekt (call by value). Hier wird eine Kopie des Objektes angelegt.

    Wenn du perste_operand wirklich als veränderliches Objekt übergeben willst, dann musst du dies per call by reference/pointer tun. Wobei hier die Referenz (sofern möglich - hier ist es der Fall) vorziehen solltest:

    void funktion_operandenstellen(wxString const& eingabefeld, wxString const& operand, wxString& perste_operand);
    

    BWBG schrieb:

    Wobei hier eingabefeld und operand konstante Referenzen sind (d.h. nicht verändert werden können).

    Edit: Hier habe ich sprachlich schwer daneben gehauen - siehe Anmerkung von Nexus weiter unten.

    wxString bietet sicherlich (wie std::string::at(size_t) oder std::string::operator[](size_t)) eine Methode für den Zugriff auf ein einzelnes Zeichen an.

    Grüße... Heiko



  • perste_operand bzw. perste_plus.... ist ein zeiger auf das erste Objekt eines wxString Arrays.

    das nächste Problem hab ich dann noch mit der Zeigerarithmetik

    ich dächte eigentlich, dass man Zeiger inkrementieren kann, aber ich bekomme einen Compilerfehler ausgegeben in folgender Zeile:

    perste_operand++;
    

    der Fehler lautet:
    no `operator++(int)' declared for postfix `++', trying prefix operator instead
    no match for 'operator++' in '++perste_operand'



  • am besten gebe ich gleich mal den wichtigen Teil vom Code komplett

    int funktion_operandenstellen_anzahl(wxString eingabefeld, wxString operand);
    void funktion_operandenstellen(wxString eingabefeld, wxString operand, wxString& perste_operand);
    
    void TaschenrechnerDlg::Event_Taste_istgleich(wxCommandEvent& event)
    {
        int anzahl_plus, anzahl_minus, anzahl_mal, anzahl_geteilt;
        wxString eingabefeld, stellen_plus, stellen_minus, stellen_mal, stellen_geteilt;
        wxString *perste_plus, *perste_minus, *perste_mal, *perste_geteilt;
        eingabefeld=WxEdit1->GetValue();
        anzahl_plus=funktion_operandenstellen_anzahl(eingabefeld, "+");
        anzahl_minus=funktion_operandenstellen_anzahl(eingabefeld, "-");
        anzahl_mal=funktion_operandenstellen_anzahl(eingabefeld, "*");
        anzahl_geteilt=funktion_operandenstellen_anzahl(eingabefeld, "/");
        wxString wxString_plus_stellen[anzahl_plus];
        wxString wxString_minus_stellen[anzahl_minus];
        wxString wxString_mal_stellen[anzahl_mal];
        wxString wxString_geteilt_stellen[anzahl_geteilt];
        perste_plus=&wxString_plus_stellen[0];
        perste_minus=&wxString_minus_stellen[0];
        perste_mal=&wxString_mal_stellen[0];
        perste_geteilt=&wxString_geteilt_stellen[0];
        funktion_operandenstellen(eingabefeld, "+", *perste_plus);
        funktion_operandenstellen(eingabefeld, "-", *perste_minus);
        funktion_operandenstellen(eingabefeld, "*", *perste_mal);
        funktion_operandenstellen(eingabefeld, "/", *perste_geteilt);
    }
    
    int funktion_operandenstellen_anzahl(wxString eingabefeld, wxString operand)
    {
        wxString char_aktuell, stellen_string;
        for (unsigned int stelle=0; stelle<=eingabefeld.Len()+1; stelle++)
        {
            char_aktuell=eingabefeld[stelle];
            if (char_aktuell.Contains(operand))
                {
                    if (stelle<10)
                    {
                        stellen_string<<0;
                    }
                    stellen_string<<stelle;
                }
        }
        return stellen_string.Len()/2;
    }
    
    void funktion_operandenstellen(wxString eingabefeld, wxString operand,wxString& perste_operand)
    {
        wxString char_aktuell, stellen_string;
        for (unsigned int stelle=0; stelle<=eingabefeld.Len()+1; stelle++)
        {
            char_aktuell=eingabefeld[stelle];
            if (char_aktuell.Contains(operand))
                {
                    stellen_string.Empty();
                    stellen_string<<stelle;
                    perste_operand=stellen_string;
                    perste_operand++;
                }
        }
    }
    

    wenns an dem ganzen Code noch was zu beanstanden ist...
    jede konstruktive Kritik hilft mir besser zu werde, also immer her damit
    auch wenns um programmierstil etc. geht



  • Wie gesagt. Ich sehe hier auch nirgends eine Benutzung von Zeigern. Du übergibst alles per Copy.

    Das hier sollte wahrscheinlich eher so aussehen:

    int funktion_operandenstellen_anzahl(wxString* eingabefeld, wxString* operand)
    

    Das kannst du jetzt nicht einfach so übernehemen, sondern musst auch verstehen, was das Problem ist und den Rest des Codes anpassen.



  • martin.bens schrieb:

    jede konstruktive Kritik hilft mir besser zu werde, also immer her damit
    auch wenns um programmierstil etc. geht

    Nur was zur Funktion Event_Taste_istgleich() : Ich finde die sehr unübersichtlich. Vielleicht lohnt es sich, sie in mehrere Funktionen aufzuteilen, oder mindestens die Variablen gleich bei der Deklaration zu initialisieren. Ausserdem scheint es mir, dass du die 4 Operatoren generischer verwalten könntest, sodass du von der jeweils 4-fachen Codeduplizierung wegkommst. Eine Möglichkeit wäre eventuell std::map .

    bwbg schrieb:

    Wobei hier eingabefeld und operand konstante Referenzen sind (d.h. nicht verändert werden können).

    Referenzen sind immer konstant und können nie verändert werden. Das const bezieht sich nicht auf die Referenz, sondern das referenzierte Objekt. Das bedeutet, über die Const-Referenz darfst du das Objekt nicht manipulieren.


Anmelden zum Antworten