C++ - [Error] invalid conversion from 'const char*' to 'char*' [-fpermissive] - was tun



  • Guten Morgen,
    in einem kleinem Programm was ich programmiert habe, taucht dieser Fehler auf wenn ich es ausführe.

    Soweit ich es bisher mitbekommen habe, taucht dieser Fehler in z.b. solchem Code auf:

    // Falsch
    char x = "x";
    // Richtig
    char y = 'y';
    

    Aber, bei meinem Code ist das komplizierter.
    Seht selbst:

    bool testWord(string word)
    {
            string result = exec(("7za.exe e Brut.zip -p" + word + " -y").c_str());
    
            if(result[137] == 'D')
            {
                    cout << "TRY FOR '" << word << "' - FALSE" << endl;
                    return false;
            } else {
                    cout << "TRY FOR '" << word << "' - TRUE" << endl;
                    return true;
            }
    }
    
    string exec(char* cmd) {
        FILE* pipe = popen(cmd, "r");
        if (!pipe) return "ERROR";
        char buffer[128];
        string result = "";
        while(!feof(pipe)) {
            if(fgets(buffer, 128, pipe) != NULL)
                    result += buffer;
        }
        pclose(pipe);
        return result;
    }
    

    Der Fehler taucht in Zeile 3 auf.
    Mir ist klar warum er auftaucht, ich kann schließlich englisch.
    Ich gebe ihm einen char-array und er erwartet (soweit ich es in erinnerung habe)
    eine Referenz auf ein char-array. (das war doch der Stern oder?)

    Ich habe schon ein wenig rum experimentiert. Das .c_str() hatte ich vorher nicht drinnen. Jedoch hebt es den Fehler nicht auf

    Wie kann ich den Fehler fixen?
    Danke für eure Zeit & Hilfe.

    Liebe Grüße Transformator

    PS: ich habe die Main Funktion hier jetzt nicht drinnen, weil das den Rammen des Möglichen sprengen würde. Der gesamte Code ist in etwa 200 Zeilen lang.



  • Ändere Zeile 15 zu const char*.



  • TheTransformator schrieb:

    PS: ich habe die Main Funktion hier jetzt nicht drinnen, weil das den Rammen des Möglichen sprengen würde. Der gesamte Code ist in etwa 200 Zeilen lang.

    Ich habe auch ständig Probleme mit den Rammen meiner Programme. Ständig werden die gesprengt und rammen dann das Nervenkonstüm meiner Anwender ...

    *SCNR* 🙂

    // Falsch
    char x = "x";
    // Richtig
    char y = 'y';
    

    Und das ist auch in Ordnung so.
    "x" ist ein String aus zwei Zeichen: 'x' und dem 0-Byte. Das kannst du nicht einfach so einem char zuweisen.
    'y' hingegen ist ein Zeichen, das kannst du auch einem char zuweisen.

    Und anscheinend kannst du auch nicht so gut englisch, denn schließlich sagt dir der Compiler:

    invalid conversion from 'const char*' to 'char*'
    

    Du übergibst exec einen Zeiger auf const char , aber du versprichst deinem Compiler nicht, dass du den Parameter auch nicht änderst. Mit

    string exec(const char* cmd)
    

    Sollte das Problem eigentlich gegessen sein.



  • TheTransformator schrieb:

    Soweit ich es bisher mitbekommen habe, taucht dieser Fehler in z.b. solchem Code auf:

    // Falsch
    char x = "x";
    // Richtig
    char y = 'y';
    

    Etwas in Anführungszeichen hat den Typ const char[] . Etwas in Hochkomma hat den Typ char .

    TheTransformator schrieb:

    Aber, bei meinem Code ist das komplizierter.
    Seht selbst:

    bool testWord(string word)
    {
            string result = exec(("7za.exe e Brut.zip -p" + word + " -y").c_str());
           
            if(result[137] == 'D')
            {
                    cout << "TRY FOR '" << word << "' - FALSE" << endl;
                    return false;
            } else {
                    cout << "TRY FOR '" << word << "' - TRUE" << endl;
                    return true;
            }
    }
     
    string exec(char* cmd) {
        FILE* pipe = popen(cmd, "r");
        if (!pipe) return "ERROR";
        char buffer[128];
        string result = "";
        while(!feof(pipe)) {
            if(fgets(buffer, 128, pipe) != NULL)
                    result += buffer;
        }
        pclose(pipe);
        return result;
    }
    

    Der Fehler taucht in Zeile 3 auf.
    Mir ist klar warum er auftaucht, ich kann schließlich englisch.
    Ich gebe ihm einen char-array und er erwartet (soweit ich es in erinnerung habe)
    eine Referenz auf ein char-array. (das war doch der Stern oder?)

    Ich habe schon ein wenig rum experimentiert. Das .c_str() hatte ich vorher nicht drinnen. Jedoch hebt es den Fehler nicht auf

    Ich kenne exec nicht.

    ("7za.exe e Brut.zip -p" + word + " -y").c_str()
    

    Und was soll das hier sein? Das sollte ja schon net gehen. Ein Array ist keine Klasse.



  • Danke, das funktioniert wirklich.
    Aber wie man das so kennt kommt gleich der nächste Fehler.
    Das Programm kommt irgendwie in eine unendliche Loop.

    der Fehlercode ist: 3221225477
    Wenn ich das was ich jetzt darüber gelesen habe richtig analysiere,
    dann ist das ein "ArrayOutOfBounds" Fehler das heißt das ich auf ein nicht existentes Segment eines Arrays zugreife.
    Allerdings habe ich im wahren sinne des Wortes keine Ahnung wo das sein könnte.

    hier mein gesamter code. (das 200 wahr ein wenig übertrieben, es sind nur 93 Zeilen)

    http://pastebin.com/R86u5Y6z

    Danke für die Antwort



  • ziffern[sizeof(ziffern)-1]++;
    
    for(int i=sizeof(ziffern); i>0; i--)
                                    {
                                            if(ziffern[i] == sizeof(letters))
    

    Wenn char nicht grade als 1 byte implementiert ist, kommst du dort out of bounds.

    Möglicherweise aber auch hier:

    if(result[137] == 'D')
    

    Du prüfst nirgends, ob der String auch lang genug ist.



  • Hmm, ich dachte sizeof() gibt mir die anzahl von array-segmenten.

    besser so? :

    ziffern[sizeof(ziffern) / sizeof(ziffern[0])]++
    

    [code="cpp"]
    for(int i=(sizeof(ziffern) / sizeof(ziffern[0])); i>0; i--)
    {
    if(ziffern[i] == (sizeof(letters) / sizeof(ziffern[0])))

    Danke für die Hilfe



  • Ich habs ausprobiert.
    Mittlerweile zeigt er 3 Versuche an, dann tut er nichts mehr, auch keine Fehlermeldung erscheint.



  • tkausl schrieb:

    Wenn char nicht grade als 1 byte implementiert ist, kommst du dort out of bounds.

    sizeof(char) ist immer 1.



  • TheTransformator schrieb:

    Hmm, ich dachte sizeof() gibt mir die anzahl von array-segmenten.

    Nein, sizeof gibt dir die Größe eines Datentyps in Bytes. Bei einem Array also das Produkt aus der Anzahl der Elemente mit der Größe der einzelnen Elemente. Bei dir kommt noch hinzu, dass du sizeof auf einen Pointer anwendest und die Größe des dahinterliegenden Arrays erwartest:

    string createWord(char letters[], int ziffern[])
    {
            string word = "";
    
            for(int i=0; i<sizeof(ziffern); i++) { word += letters[ziffern[i]]; }
    
            return word;
    }
    

    Dafür kannst du vielleicht nichts, in Funktionsparametern ist ein Array gleichbedeutend mit einem Pointer, was eine hässliche und vollkommen überflüssige Regel ist, aber so ist es nunmal, und das bedeutet, dass du mit sizeof(ziffern) immer sizeof(int*) bekommst, also wahrscheinlich 4, und nicht die Größe des Arrays.

    edit: Wenn du schon überall mit string arbeitest, warum nicht auch hier? Das würde dir diesen Stress ersparen.



  • 😃 das schon aber lieber die Nummer sicher.

    Ich habe den Code jetzt angepasst & außerdem das ganze auf stringstream umgebaut, weil das angeblich schneller ist.

    Code: http://pastebin.com/d4ND44CF


Anmelden zum Antworten