konstanten Zeiger auf konstanten String an eine Funktion übergeben?



  • Guten Tag,

    ich möchte einen Konstanten Zeiger auf einen Konstanten String an eine Funktion übergeben. Wie man konstante Zeiger auf Konstante Objekte deklariert weis ich:

    const int *const KonstZeigerAufKonstInt;
    

    So steht es zumindest in meinem C++ Buch. Wenn ich das jetzt aber benutze um einer Funktion einen konstanten Zeiger auf einen Konstanten String als Parameter zu geben, dann bekomme ich einen Fehler:

    #include <cmath>
    #include <string>
    
    unsigned long int StrintToULInt(const string *const PotenzielleGanzzahl)
    {
    //Hier sind dann Anweisungen, was sonst...
    

    Jetzt sagt mir mein Borland C++BuilderX aber zu der Zeile:
    E2293 ) erwartet in Zeile 4

    Und noch was, wenn ich der Funktion nur einen String übergeben will:

    unsigned long int StrintToULInt(string PotenzielleGanzzahl)
    

    sagt er mir:
    E2147 Parameterdeklaration darf nicht mit 'string' beginnen in Zeile 4

    Könnt ihr mir da helfen? 😞



  • sehe da keinen Fehler. Hast vielleicht irgendwo ein Semikolen oder eine Klammer oder so vergessen.



  • **std::**string?



  • Es war tatsächlich das Fehlende "std::".
    Peinlich...

    Dafür hab ich 9 neue Fehler die ich Analysieren darf. Fang ich mal an...

    Danke übrigens. 👍



  • Vielleicht solltest du am Anfang deines Programms einfach den Namensbereich "std"
    bekannt machen:

    using namespace std;
    

    Dann kannst du dir auch das std::string sparen. Müsste sonst auch weitere Fehler mit der
    cmath geben.

    Grüße

    Nike



  • Ich hab gleich noch eine Frage(die C++ Strings machen mich noch wahnsinnig!):

    unsigned long int StrintToULInt(const std::string *const PotenzielleGanzzahl)
    {
      unsigned short int Laenge=PotenzielleGanzzahl.length(); //Fehler für diese Zeile!
    

    In der Zeile gibt er mir folgenden Fehler:
    E2294 Auf linker Seite der Struktur ist . oder .* erforderlich in Funktion StrintToULInt(const _STL::string * const) in Zeile 8

    Was will er mir damit sagen? Vor allem, da er mir den selben Fehler auch bringt, wenn ich folgendes schreibe:

    unsigned long int StrintToULInt(const std::string *const PotenzielleGanzzahl)
    {
      unsigned short int Laenge=*PotenzielleGanzzahl.length(); //Man beachte den zusätzlichen *
    

    Weiter unten sagt er mir, dass folgendes nicht geht:

    (PotenzielleGanzzahl[Position])=='+'
    

    E2094 'operator==' ist im Typ '_STL::string' für Argumente des Typs 'char' nicht implementiert in Funktion StrintToULInt(const _STL::string * const) in Zeile 12
    Wenn ich aber statt den ' " benutze geht's plötzlich zu kompilieren. Aber leider weis ich nicht, ob dass dann auch so klappt.

    Noch weiter: 😞

    static_cast<unsigned long long int>(PotenzielleGanzzahl[Position])
    

    E2031 Typumwandlung von 'const _STL::string' nach 'unsigned __int64' nicht zulässig in Funktion StrintToULInt(const _STL::string * const) in Zeile 19

    Aber ich will den Ascii Wert!
    Wer war eigentlich mit den C-Strings nicht zufrieden? Warum musste man Strings mit OOP umsetzten? Wer auch immer die Idee hatte, ich hoffe ich begegne ihm nie mit einer Waffe in meiner Hand! 😡

    edit.:
    Zu dem namespace std: Ist schon klar, aber ich will das extra vermeiden. Weil mir irgendwer mal irgendwann gesagt hat, dass das sonst ärger gibt, wenn ich das auslagere. Und solange dem niemand widerspricht, glaube ich das.

    edit2.: Wegen del Deutsches Sprach. 🤡



  • Du musst deine Zeiger dereferenzieren mit "->length" anstatt mit ".length"



  • Danke. Hat geklappt.
    Warum hab ich nur noch nie von -> gehört, obwohl ich ein ganzes Buch zur C++ Programmierung gelesen hab? Das war wirklich ein Fehlgriff! 😡
    Dort steht kaum was drinn! 😡
    Und was ist mit den restlichen Fehlern? 😕



  • Ich kann dir das "C/C++ Kompendium" von Dirk Louis im Markt und Technik Verlag
    empfehlen. Da steht so gut wie Alles über C/C++ drin (ist z.Zt. auch nicht sehr teuer)



  • Nimda schrieb:

    Aber ich will den Ascii Wert!
    Wer war eigentlich mit den C-Strings nicht zufrieden? Warum musste man Strings mit OOP umsetzten? Wer auch immer die Idee hatte, ich hoffe ich begegne ihm nie mit einer Waffe in meiner Hand! 😡

    Du brauchst sie ja nicht zu benutzen. Aber ist schon praktischer.

    Zu dem namespace std: Ist schon klar, aber ich will das extra vermeiden. Weil mir irgendwer mal irgendwann gesagt hat, dass das sonst ärger gibt, wenn ich das auslagere. Und solange dem niemand widerspricht, glaube ich das.

    In deinen .cpp-Dateien kannst (sollst) du es ruhig immer drüberschreiben wenn es gebraucht wird. Dafür ist es ja gemacht, damit man eben nicht immer diesen std::-Blödsinn davor schreiben muss.

    Nur nicht innerhalb von Headern. Wäre zwar bei dem Umfang solcher Anfänger-Projekte auch kein Problem, aber allgemein ist das nicht gut.



  • Danke, werd ich gleich mal bei meiner Bücherei anrufen. 👍



  • Nimda schrieb:

    Danke. Hat geklappt.
    Warum hab ich nur noch nie von -> gehört, obwohl ich ein ganzes Buch zur C++ Programmierung gelesen hab? Das war wirklich ein Fehlgriff! 😡
    Dort steht kaum was drinn! 😡
    Und was ist mit den restlichen Fehlern? 😕

    du musst den std::string ja auch nicht unbeding als zeiger übergeben.
    referenzen reichen:

    void foo (const std::string &x) {
      cout << "foo says \"" << x << "\"\n";
    }
    
    //...
    foo ("bar");
    


  • Danke. SO klappt alles! 🙂 👍


Anmelden zum Antworten