Frage zu memcpy()



  • memcpy() erwartet ja als zweiten paramter den Buffer...

    ich hab:

    struct foo
    {
     int a;
    };
    
    foo* bar;
    bar = new foo[10];
    

    Jetzt möchte ich gerne den Inhalt von bar als Source angeben. Wie übergebe ich memcpy - bar -, dass es nicht den Pointer selbst als Source ansieht, sondern dass wodrauf der Pointer zeigt



  • memcpy erwartet eh einen Pointer auf die Quelle..

    einfach memcpy(bar...



  • ? der erste parmater von memcpy ist die destination

    struct foo
    {
    int a;
    };

    //So funktionierts:

    VOID* pData;
    foo bar1[] = { 1,2,3 }
    memcpy( pData, bar1, sizeof( bar1 ) );
    //so nicht:
    VOID* pData;
    foo* bar2;
    bar2 = new foo[3];
    // [..] werte setzen
    memcpy( pData, bar2, sizeof( foo ) * 3 );
    

    und ich muß bar2 nutzen.

    Oder hab ich dich jetzt falsch verstanden?



  • Cray schrieb:

    ? der erste parmater von memcpy ist die destination

    kann sein, wusste ich nicht mehr auswendig.

    //So funktionierts:

    VOID* pData;
    foo bar1[] = { 1,2,3 }
    memcpy( pData, bar1, sizeof( bar1 ) );
    

    da ist kein Speicher für pData reserviert, sprich du schreibst in Speicher der dir nicht gehört. Das es hier "funktioniert" und beim zweiten nicht mehr, ist nur Zufall.



  • Das kann ich mir jetzt eigentlich nicht vorstellen aus der DX Doku ->

    VOID* pVertices;
        if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
            return E_FAIL;
        memcpy( pVertices, vertices, sizeof(vertices) );
        g_pVB->Unlock();
    

    Das ist das gleich in grün und die machen das da genauso.

    Ah ich sehe was du meinst:) den Kram habe ich nur nicht mit gepostet 🙂



  • Cray schrieb:

    Das ist das gleich in grün und die machen das da genauso.

    Hmm?

    if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
    

    Das sieht aber ganz nach einer Zuweisung an pVertices aus, sonst müsstest du wohl kaum einen Zeiger auf pVertices übergeben. BTW der Cast scheint unnötig zu sein (ist er falls VOID == void)



  • hat sich erledigt, der Fehler war doch woanders, sorry.


Anmelden zum Antworten