The Pointer is pointing on you...



  • [offtopic]Das kommt dann davon, wenn man dem Ratschlag folgt, gleich "richtiges" C++ zu lernen, bevor man sich mit den Grundlagen bzw. C auseinandersetzt. Gefährlich, gefährlich[/offtopic]



  • Alter Zeh schrieb:

    [offtopic]Das kommt dann davon, wenn man dem Ratschlag folgt, gleich "richtiges" C++ zu lernen, bevor man sich mit den Grundlagen bzw. C auseinandersetzt. Gefährlich, gefährlich[/offtopic]

    Learning by doing



  • Mentras schrieb:

    Nun weiß ich nicht wo ungefähr der Fehler ist. Beim Einlesen(70%) der Zeichenkette oder bei der Rückgabe(30%)?
    Lg Mentras

    Der Fehler liegt beim Einlesen(70%) und bei der Rückgabe(30%). Macht summa summarum 100%. 😃

    Zum Einlesen nimm einen sauber initialisiertes char Array:

    char buf[1024] = {0};
    

    Aus deiner Funktion mach:

    void rot3_func(char* p); // Prototyp.
    

    Denn du übergibst einen Zeiger auf das Array, dessen Inhalt in der Funktion geändert wird. Darum muss nix zurückgegeben werden.
    Gruß,
    e.



  • das war nicht gegen dich gerichtet, mehr gegen die leute, die propagieren man sollte lieber gar nicht erst den "alten, unnötigen c mist" lernen.



  • err0r schrieb:

    Mentras schrieb:

    Nun weiß ich nicht wo ungefähr der Fehler ist. Beim Einlesen(70%) der Zeichenkette oder bei der Rückgabe(30%)?
    Lg Mentras

    Der Fehler liegt beim Einlesen(70%) und bei der Rückgabe(30%). Macht summa summarum 100%. 😃

    Zum Einlesen nimm einen sauber initialisiertes char Array:

    char buf[1024] = {0};
    

    Aus deiner Funktion mach:

    void rot3_func(char* p); // Prototyp.
    

    Denn du übergibst einen Zeiger auf das Array, dessen Inhalt in der Funktion geändert wird. Darum muss nix zurückgegeben werden.
    Gruß,
    e.

    Ahh, das klingt logisch 😃
    Werde ich gleich mal testen.

    das war nicht gegen dich gerichtet, mehr gegen die leute, die propagieren man sollte lieber gar nicht erst den "alten, unnötigen c mist" lernen.

    Ah ^^, C lerne ich ja indirekt durch ein Openbook C von A bis Z. Und solche C-Strings haben was, was mich anzieht x)

    Lg Mentras



  • Mentras schrieb:

    Ich will die Verschiebechiffre programmieren.

    Code: (VORSICHT SPOILER!):

    void chiffre( char *buffer, const unsigned int bufferLength )
    {
    	for( unsigned int i = 0; i < bufferLength; ++i )
    		buffer[i] += 3;
    };
    

    Sorry, aber da hatte ich jetzt Bock zu...



  • Mentras schrieb:

    Jap, eine Möglichkeit wäre die Größe vorher zu bestimmen, aber jetzt kommen "was ist wenn"-Fragen, wenn der Benutzer 128 Zeichen eingibt...

    Du musst aber auch beachten, dass du auch mit deiner Methode eine feste Größe vergibts (nämlich bei "Hallo" 6 Zeichen inkl. abschließender Null). Nur, dass du dabei halt ein Literal (Konstante) erzeugst und dessen Adresse a zuweist!

    Mentras schrieb:

    😕 Bin irgendwie durcheinander, dabei erschien mir die Sache so easy 😞

    Ist sie eigentlich auch. Einfach am Ball bleiben. 🙂 Es gibt auch gute Artikel hier auf c++.de. Lies dir da einfach mal ein paar Sachen durch (Pointer, Speicherverwaltung...).



  • err0r schrieb:

    Denn du übergibst einen Zeiger auf das Array, dessen Inhalt in der Funktion geändert wird. Darum muss nix zurückgegeben werden.

    Es sei denn, er will die Rückgabe gleich in Ausdrücken verarbeiten können. Dann könnte er schon den übergebenen Pointer noch mal zurückgeben. Obwohl ich das eigentlich nie so mache...

    Alter Zeh schrieb:

    das war nicht gegen dich gerichtet, mehr gegen die leute, die propagieren man sollte lieber gar nicht erst den "alten, unnötigen c mist" lernen.

    👍



  • Huch, ich hatte schon die Schnur um meinen Hals gebunden und noch zum Schluss etwas geändert und es hat geklappt...
    Folgende Fragen: (Siehe Kommentare)

    void rot3_func(char* p)
    {
        for(int i=0;p[i]!='\0';i++)
             p[i]+=3;
    }
    
    int main()
    {
        char eingabe[1024] = {0};
        std::cout << "Geben Sie den Text ein:" << std::endl;
        std::cin >> eingabe;
        rot3_func(eingabe);          //Wieso darf ich nicht: rot3_func(&eingabe); schreiben? Oo
        for(int i=0; eingabe[i]!='\0';i++)        //Kann ich es auch ohne For-Schleife ausgeben lassen?
            std::cout << eingabe[i];
    }
    

    Danke nochmal für eure Hilfe! 🙂



  • 1. Weil der Name eines Arrays ohne Operator [] schon die Adresse (des ersten Elements) darstellt. Du würdest also die Adresse der Adresse übergeben (gibts auch, macht hier aber keinen Sinn).

    2. Probier mal

    std::cout << eingabe;
    


  • Ahhh, verstehe!

    2. Ohh sieht doch gleich besser aus 😃 Danke!

    Lg Mentras



  • Du kennst aber std::string ?

    Ich verstehe schon, dass es dir hier eher ums Verständnis von Zeigern geht. Wenn du aber etwas erreichen willst (z.B. Verschlüsselung), solltest du moderne C++-Mittel verwenden.



  • Nexus schrieb:

    Du kennst aber std::string ?

    Ich verstehe schon, dass es dir hier eher ums Verständnis von Zeigern geht. Wenn du aber etwas erreichen willst (z.B. Verschlüsselung), solltest du moderne C++-Mittel verwenden.

    Jap ich habe ja oben gesagt, dass ich es mal mit C-String versuchen will x)

    String wäre ja kein Problem für mich gewesen.

    Ich kann dir auch versichern, dass ich wenn ich mich in den Bereich der Kryptographie nisten will, meine Verschlüsselungen mit std::string verschlüssele x)

    Lg Mentras



  • Mentras schrieb:

    char eingabe[1024] = {0};
      //...
      rot3_func(eingabe);  //Wieso [...] nicht: rot3_func(&eingabe);
    

    eingabe ist ein array von char und die Funktion erwartet ein char*. C und C++ führen hier einen "Array-zu-Zeiger-Verfall" durch. Dabei wird ein Zeiger erzeugt, der auf das erste Element des Arrays zeigt. Von Hand durchgeführt müsste es dann so aussehen:

    rot3_func(&eingabe[0]);
    

    Man achte auch auf die Präzedenz der Operatoren. Zunächst werden die Operatoren auf der rechten Seite von innen nach außen verarbeitet und dann die Operatoren auf der linken Seite von innen nach außen ==> Zeiger auf das erste Element. Wenn Du den Addressoperator auf das Array loslässt, bekommst Du einen Zeiger auf ein Array und nicht einen Zeiger auf das erste Element:

    char (*parray)[1024] = &eingabe;
      // parray ist ein Zeiger auf ein Array von char
    

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    Mentras schrieb:

    char eingabe[1024] = {0};
      //...
      rot3_func(eingabe);  //Wieso [...] nicht: rot3_func(&eingabe);
    

    eingabe ist ein array von char und die Funktion erwartet ein char*. C und C++ führen hier einen "Array-zu-Zeiger-Verfall" durch. Dabei wird ein Zeiger erzeugt, der auf das erste Element des Arrays zeigt. Von Hand durchgeführt müsste es dann so aussehen:

    rot3_func(&eingabe[0]);
    

    Gruß,
    SP

    Oh, nagut ich versuch´s mal wiederzugeben was ich verstanden habe...

    Wenn ich den &-Operator verwenden wollte hätte ich´s so machen müssen:

    Beim Aufrufen:

    for(int i=0;eingabe[i]!='\0';i++)
    rot3_func(&eingabe[i]);
    

    Wäre natürlich jetzt etwas umständlicher, aber mir geht´s jetzt nur ums verstehen.

    Lg Mentras



  • Mentras schrieb:

    Wenn ich den &-Operator verwenden wollte hätte ich´s so machen müssen:

    for(int i=0;eingabe[i]!='\0';i++)
    rot3_func(&eingabe[i]);
    

    Nein. Einfach

    rot3_func(&eingabe[0]);
    

    Hier ist ein anderes Beispiel

    char array[999];
    char* p1 = array;     // "array-to-pointer decay" (automatisch)
    char* p2 = &array[0]; // manuell
    

    p1 und p2 zeigen jeweils auf das erste Element des Arrays.

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    Mentras schrieb:

    Wenn ich den &-Operator verwenden wollte hätte ich´s so machen müssen:

    for(int i=0;eingabe[i]!='\0';i++)
    rot3_func(&eingabe[i]);
    

    Nein. Einfach

    rot3_func(&eingabe[0]);
    

    Hier ist ein anderes Beispiel

    char array[999];
    char* p1 = array;     // "array-to-pointer decay" (automatisch)
    char* p2 = &array[0]; // manuell
    

    p1 und p2 zeigen jeweils auf das erste Element des Arrays.

    Gruß,
    SP

    Und der Zeiger ändert dann alle Elemente in der Funktion?


Anmelden zum Antworten