anonymes char array?



  • Dravere schrieb:

    ...Was soll daran "tricky" sein?...

    Dein Beispiel ist deswegen nicht "tricky", weil Du die entscheidende Anforderung weggelassen hast: Es ging gerade um ein "anonymes Array" (will sagen ein "Stringliteral").
    Außerdem ging ich von einer "beliebigen" Länge aus (was da aber auch zugegebenermaßen nicht steht).

    Gruß,

    Simon2.



  • Seikilos schrieb:

    _matze schrieb:

    memcpy(c,"test",4);
    

    😃

    Wenn ich das int 1 in ein char * typ packen will, krieg ich das mit memcpy auch hin?

    Du meinst das Zeichen mit dem ASCII-Code 1? memcpy kopiert alles, aber das kriegst du wohl schlecht in ein Stringliteral 'rein... 😉


  • Administrator

    Simon2 schrieb:

    Dravere schrieb:

    ...Was soll daran "tricky" sein?...

    Dein Beispiel ist deswegen nicht "tricky", weil Du die entscheidende Anforderung weggelassen hast: Es ging gerade um ein "anonymes Array" (will sagen ein "Stringliteral").

    Ich übergebe ja ein "anonymes Array", bzw. ein "Stringliteral". Ich baue dazu einfach einen Zwischenschritt ein, den man sogar durch eine Funktion auslagern könnte, wodurch man grundsätzlich eine memset ähnliche Funktion bekommen würde.

    void copy_array(char* dest, char const* src, unsigned int size)
    {
      std::copy(src, src + size, dest);
    }
    
    // Oder sogar als template:
    template<typename T>
    void copy_array(T* dest, T const* src, unsigned int size)
    {
      std::copy(src, src + size, dest);
    }
    

    Ich sehe also nicht, dass ich hier eine Anforderung weggelassen habe. Es steht ja auch nirgends, dass man eine direkt Zuweisung ausführen müsste.

    Simon2 schrieb:

    Außerdem ging ich von einer "beliebigen" Länge aus (was da aber auch zugegebenermaßen nicht steht).

    Nicht nur nicht steht, es steht sogar explizit, dass data ein char[4] ist und man ein Stringliteral übergeben möchte, was auch eine fixe Grösse hat 😉

    Grüssli



  • Aber wenn ich es richtig verstanden hätte, dann wäre es doch schon "tricky" gewesen, oder ?
    (also so ein copy("test", ??? )

    😉 😉 😃

    Gruß,

    Simon2.

    P.S.: Ich weiß: "Unbelehrbare haben keine Freunde!" ... und ich habe welche (und seien sie auch noch so wenige und seltsam).


  • Mod

    template<typename T, std::size_t N, typename U, std::size_t M>
    void init(T (&dest)[N], const U (&src)[M])
    {
        copy( src, src + min( N, M ), dest );
        fill( dest + min( N, M ), dest + N, T() );
    }
    
    T var;
    init(var.data,"test");
    

  • Administrator

    Klar, camper übertrumpft es natürlich noch einmal 🙂
    Aber Fragen dazu habe ich noch camper. Was ist das denn nun genau für eine Übergabe? Eine Referenz zu Arrays? Wieso sind die Klammern nötig? Und fehlt da nicht ein void vor init(... ? 🙂

    @Simon2,
    Informatiker haben doch immer wenig Freunde und alle sind irgendwie seltsam 😃

    Grüssli


  • Mod

    void - korrigiert
    Klammern, weil es sonst ein Array aus Referenzen deklarieren würde, was wir nicht wollen und auch unzulässig wäre. Deklaratoren folgen den gleichen Vorrangregeln wie die entsprechenden Operatoren und Postfixoperatoren haben nunmal Vorrang vor unären (betrachte die Ausdrücke &p[0] und (&p)[0]).


  • Administrator

    Ah, danke für die Erklärung.
    Wusste ehrlich gesagt nicht einmal, dass man Referenzen auf Arrays haben kann. Aber ich benutze ja eigentlich auch nie Arrays und man lernt schliesslich auch nie aus 🙂

    Grüssli



  • camper schrieb:

    template<typename T, std::size_t N, typename U, std::size_t M>
    void init(T (&dest)[N], const U (&src)[M])
    {
        copy( src, src + min( N, M ), dest );
        fill( dest + min( N, M ), dest + N, T() );
    }
    
    T var;
    init(var.data,"test");
    

    Ja - ich hoffe, das darf nun (für jemanden, der "ein wenig mehr als memcpy()" sucht) als "tricky" gelten.

    Gruß,

    Simon2.


  • Mod

    Simon2 schrieb:

    Ja - und das soll nun (für jemanden, der "ein wenig mehr als memcpy()" sucht) nicht "tricky" sein ? :p 😉

    Was ist an

    init(var.data,"test");
    

    "tricky"? Wenn du die Funktion memcpy selbst schreiben müsstest, könntest du die Frage ebenso stellen.

    Dravere schrieb:

    Wusste ehrlich gesagt nicht einmal, dass man Referenzen auf Arrays haben kann. Aber ich benutze ja eigentlich auch nie Arrays und man lernt schliesslich auch nie aus

    Arrays sind Objekte wie jedes andere. Nur bzgl. Kopierbarkeit und implizit möglicher Konvertierungen gibt es Besonderheiten.



  • camper schrieb:

    ...Was ist an

    init(var.data,"test");
    

    "tricky"? ...

    Daran ist tricky, dass es nicht reicht.
    Man muss sich schon die init-Funktion schreiben, wie Du es getan hast.

    Andernfalls gibt es in C++ überhaupt nichts, was "tricky" ist, weil sich alles reduzieren lässt auf:

    int main() {
       doit();
    }
    

    Ich sprach davon, dass die Verwendung von "std::copy()" mit reinen Stringliteralen tricky sei ... und nicht, dass die Verwendung von "camper::init()" tricky sei.

    Gruß,

    Simon2.



  • camper schrieb:

    template<typename T, std::size_t N, typename U, std::size_t M>
    void init(T (&dest)[N], const U (&src)[M])
    

    Das ist mein Idiom :p :p
    http://c-plusplus.net/forum/viewtopic-var-p-is-1588515.html#1588515


Anmelden zum Antworten