Array Spiegeln



  • Hey, ich krieg noch die Krise,

    ich versuch hier nen array umzudrehen, an sich ne total banale Nummer.
    Ich bekomm es nur nicht zu laufen, hab schon gegoogled wie irre und finde auch was ich suche, hab auch in verschiedenen Ausführungen versucht, aber ich bekomm hinten nur Mist raus.

    Ich bitte euch mal drauf zu gucken wo ich den Fehler hab, da ich ihn momentan nicht mehr wirklich sehe ^^

    das array ist vorher mit (MAXBINARY+1) reserviert worden und enthält einen binärcode.

    #define MAXBINARY 32
    
    void BaseWindow::ReverseArray(char *array)
    {
        int i;
        char tmp[MAXBINARY+1];
    
        for(i = MAXBINARY;i >= 0;i--)
            {
            tmp[i] = array[MAXBINARY-i];
            }
    
        std::string outstr(tmp);
    
        QString qoutstr( outstr.c_str() );
    
        ui->debugline->setText(qoutstr);
    }
    

    Ist nur ne zwischenlösung, führt aber zu nichts.
    Mein Problem ist, dass an ende nicht bei raus kommt.



  • Es gibt so viele Möglichkeiten. 😉

    http://www.cplusplus.com/reference/algorithm/

    Setzt dich einmal mit diesen Algos auseinandern, dann findest du bestimmt eine Lösung.


  • Administrator

    char c[] = "Hello!";
    std::reverse(c, c + 6);
    std::cout << c << std::endl;
    

    http://www.cplusplus.com/reference/algorithm/reverse/

    Grüssli



  • Lösungen wurden zwar schon genannt, aber falls dich noch interessiert warum dein ursprünglicher Ansatz nicht funktioniert hat: Du hast vermutlich die Nullterminierung mit umgedreht, so dass sie an erster Stelle war und der resultierende std::string leer geblieben ist.



  • Dank euch erstmal,

    sowas hatte ich anfangs gesucht, wollte es dann aber mal ohne fertige algos machen, wie ich sehe, war das auch nicht ganz unbegründet, wenn ich daran denke, wie lange es jetzt gedauert hat. ***würg***

    hab eben grad den Knotenplatzer gehabt.

    int i;
        char tmp;
        char secarray[MAXBINARY+1];
        for(i = MAXBINARY;i >= 0;i--)
            {
            tmp = array[MAXBINARY-i];
            secarray[i] = tmp;
            }
    
        std::string outstr(secarray);
    

    ich kanns mir nur nicht erklären, warum das vorher nicht ging ???

    Ich mein was soll das, wo ist der unterschied zwischen:

    tmp[i] = array[MAXBINARY-i];

    tmp = array[MAXBINARY-i];
    secarray[i] = tmp;

    Bin ich deppert oder wie ?

    Ryuzaki :

    Der Ansatz ist garnicht falsch, ich hatte auch immer streng darauf geachtet immer vom vorletzten index aus anzufangen, deswegen sind die arrays immer +1 länger für das NullByte. Und da es jetz ja zu laufen scheint, hab ichs wohl auch richtig gemacht ^^



  • In deiner Version aus Posting 1 kopierst du zwar schön brav alle Zeichen von array in tmp, allerdings vergisst du völlig tmp mit einer terminierenden 0 am Ende zu versehen, bevor du den String zur Weiterverarbeitung benutzt.



  • Ja den Gedanken verfolge ich gerade, da mir der Punkt auch noch aufgefallen ist, aber ich habe das selbe Problem doch auch bei der zweiten Version...

    da array[33] felder hat, ich aber nur 0 - 32 kopiere, jetzt wollte ich nachträglich noch die [33] ans ende von secarray zuweisen, aber irgendwie ging das auch daneben.

    à00000000000000000000000000001011q

    das is das momentane ergebnis, am Anfang und am Ende sind zwei völlig unnütze zeichen, bei denen ich nicht weiß woher die kommen sollen. So ist der String 34 zeichen obwohl das array max. 33 zeichen hat.

    Ich wandle des array noch mit

    std::string outstr(secarray);

    in einen String um, kann dabei sowas auftreten ? Das ist alles noch ziemlich neue Materie für mich.

    Auf Kommandozeile wäre es vielleicht etwas einfacher, aber in QT wirds doch etwas umständlicher.



  • pack den char* doch zuerst in einen String und dreh es mit Hilfe der std::string-Funktionen um. Dann sparst du den Stress mit der Null-Terminierung



  • könnte ich sicher machen und den stress ersparen könnte ich mir sicher auf vielerlei arten, aber es gehts mir mehr ums prinzip, dass ich das jetz per hand gelöst bekomm. Dafür is das einfach zu simple, als dass ich da solange für brauche.


  • Administrator

    Im ursprünglichen Code machst du meiner Meinung nach einiges verkehrt. Du benutzt define für eine Konstante, du übergibst der Funktion nicht die Länge, du allokierst ein temporäres unnötiges Array, welches plötzlich eine andere Grösse haben soll, als die Konstante es vorgibt, du gehst über deinen std::string, statt direkt zum QString. Es ist irgendwie so viel falsch, dass es fast keinen Sinn hat, diese Funktion weiterzuverwenden.

    ZSchneidi schrieb:

    da array[33] felder hat, ich aber nur 0 - 32 kopiere, jetzt wollte ich nachträglich noch die [33] ans ende von secarray zuweisen, aber irgendwie ging das auch daneben.

    Und hier machst du wohl auch einen Denkfehler. Array hat 33 Felder, welche die Indices 0 bis einschliesslich 32 haben. Ein Index 33 existiert nicht.

    Also, wie man sowas ganz einfach macht:

    #include <cstddef> // für std::size_t
    #include <algorithm> // für std::swap, bzw. std::iter_swap
    
    void reverse(char* array, std::size_t length)
    {
      char* first = array;
      char* last = first + length;
    
      while( (first != last) && (first != --last) )
      {
        std::iter_swap(first++, last);
      }
    }
    

    Mehr braucht es nicht. Falls du lieber eine Kopie machen willst, dann musst du nur wenig erweitern, damit dies geht und das kannst du als Übung selber machen 😉

    Grüssli


Anmelden zum Antworten