memcpy mit float



  • Hallo,

    wie muss das aussehen damit ich mit memcpy ein float feld kopieren kann?

    float test1[10]={1.,2.,3.,4.,5.,6.,7.,8.,9.,10.};
    float test2[10];

    memcpy(test2,test1,????);

    Danke schonmal



  • memcpy(test2, test1, sizeof(test1));
    


  • http://www.cppreference.com/stdstring/memcpy.html

    std::memcpy(test1, test2, sizeof(test1));
    

    Aber wieso benutzt Du nicht lieber das typensichere, moderne 'std::copy' aus <algorithm>?



  • Konrad Rudolph schrieb:

    http://www.cppreference.com/stdstring/memcpy.html

    std::memcpy(test1, test2, sizeof(test1));
    

    Aber wieso benutzt Du nicht lieber das typensichere, moderne 'std::copy' aus <algorithm>?

    Anders herum. Das Ziel erst, dann die Quelle.



  • also das copy funzt bei mir irgendwie nicht. hab die algorithm included aber bei verwendung von copy sagt der mir schon kein parameter erwartet. also der kennt copy nicht!? 😞

    das mit memcopy funzt auch nicht so wie ich mir das vorgestellt habe.
    Ich muss dazu sagen das ich kein einfaches feld sondern eine matrix habe und das meine Quelle ein zeiger auf ein feld ist. aber das müsste doch genau so funktionieren.

    float test1[10][10];
    float test[10];
    float *wert;
    wert=test;
    
    memcpy(test1[5],wert,sizeof(wert));  <-- kann ja so nicht sein
    

    so oder so ähnlich müsste es bei mir aufgebaut sein.



  • Wenn du 10 Elemente kopieren willst, nimm doch einfach 10 * sizeof(float)



  • marlene schrieb:

    also das copy funzt bei mir irgendwie nicht. hab die algorithm included aber bei verwendung von copy sagt der mir schon kein parameter erwartet. also der kennt copy nicht!? 😞

    Tja, was soll ich sagen? Zeig mal den genauen Code und die genaue Fehlermeldung.

    das mit memcopy funzt auch nicht so wie ich mir das vorgestellt habe.

    Ja, weil Du mit dynamischem Speicher arbeitest, 'sizeof' aber zur Compilezeit ausgewertet wird. Wenn Du dynamische Feldgrößen verwendest, musst Du die zu kopierende Länge in einer Extra-Variablen vorhalten (oder in Deinem speziellfen Fall statt 'wert' eben einfach 'test').



  • memcopy funzt jetzt. hab jetzt 10*sizeof(float) benuzt.

    mit dem copy kann ich dir keine genuen fehlermeldung sagen, weils keine gibt. ich weiß nur wenn ich von einer funktion eine klammer auf mache, dann zeigt mir meine entwicklungsumgebung den passenden prototyp. aber das macht der bei copy nicht.

    hab also folgendes geschrieben:

    #include <algorithm> //<-- nach oben
    
    copy(   // <-- und nu zeigt er normerweise den prototyp. kann er aber nicht finden
    std:copy(  // funzt auch nicht.
    


  • marlene schrieb:

    ich weiß nur wenn ich von einer funktion eine klammer auf mache, dann zeigt mir meine entwicklungsumgebung den passenden prototyp. aber das macht der bei copy nicht.

    Das kannst Du sowieso vergessen, das macht er halt manchmal, und manchmal auch nicht. Mit 'copy' hat das nichts zu tun sondern damit, dass IntelliSense für C++ einfach nirgends richtig funktioniert.



  • kann ich eigenlich auch vectoren auf diese art kopieren?

    also wenn ich

    std::vector<float> test;
    float test2[30];
    
    memcpy(test2,???,30*sizeof(float));
    

    ist das möglich so?



  • marlene schrieb:

    kann ich eigenlich auch vectoren auf diese art kopieren?

    Nein, das geht nicht. Mit 'std::copy' ist es hingegen problemlos möglich, indem man Iteratoren benutzt:

    std::copy(vec.begin(), vec.end(), other_vec.begin());
    


  • marlene schrieb:

    kann ich eigenlich auch vectoren auf diese art kopieren?

    also wenn ich

    std::vector<float> test;
    float test2[30];
    
    memcpy(test2,???,30*sizeof(float));
    

    ist das möglich so?

    Wenn man weiss, dass im vector auch mindestens 30 elemente drin sind, dann geht das so:

    memcpy(test2, &test[0], 30*sizeof(float))
    


  • Man kann auch einfach den Zuweisungsoperator benutzen. (Also einfach '=').



  • drakon schrieb:

    Man kann auch einfach den Zuweisungsoperator benutzen. (Also einfach '=').

    Hehe. 😉

    @Ponto: Aber nur bei PODs. Generell: Pfoten weg.



  • Konrad Rudolph schrieb:

    @Ponto: Aber nur bei PODs. Generell: Pfoten weg.

    float ist POD. Und bei Interaktion mit C macht man sowas öfters.



  • Ponto schrieb:

    Konrad Rudolph schrieb:

    @Ponto: Aber nur bei PODs. Generell: Pfoten weg.

    float ist POD. Und bei Interaktion mit C macht man sowas öfters.

    Vielleicht macht „man“ das. Sollte man aber nicht, denn hier lässt sich doch wunderbar die wesentlich robustere 'copy'-Funktion einsetzen.


  • Mod

    Lasst bitte wenigstens das sizeof(float) weg - sizeof sollte, wo möglich, stets mit Ausdrücken und nicht Typen operieren. Typen und Größenangaben, die mehrfach auftauchen sind ein Wartungsalptraum und eine große Fehlerquelle.

    float test1[10][10];
    float test[10];
    float *wert=test;
    
    memcpy(test1[5],wert,sizeof test1[5]);
    

Anmelden zum Antworten