anonymes char array?
-
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
dataeinchar[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 eincopy("test", ???)

Gruß,
Simon2.
P.S.: Ich weiß: "Unbelehrbare haben keine Freunde!" ... und ich habe welche (und seien sie auch noch so wenige und seltsam).
-
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");
-
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 einvoidvorinit(...?
@Simon2,
Informatiker haben doch immer wenig Freunde und alle sind irgendwie seltsam
Grüssli
-
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]).
-
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.
-
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