Werte aus Datenblock im Speicher in ein Array einlesen



  • Hallo zusammen,

    ich bin relativ unerfahren im Umgang mit C++ und bräuchte dringend mal eure Hilfe bei folgendem Problem:

    Ich habe ein Objekt, das mir einen Zeiger auf einen Datenblock (data) zurückgibt:

    void *const data
    

    Der Datenblock umfasst insgesamt 16000 Bytes und ist so aufgebaut, dass immer zwei aufeinanderfolgende Bytes einem Datenwert entsprechen. Insgesamt sind in dem Datenblock also 8000 solcher Werte untergebracht, wobei jede Speicheradresse genau zwei Werte beinhaltet:

    Bit      : 0---15  16--31
    
    data     : Wert 0  Wert 1
    data + 1 : Wert 2  Wert 3
    
              ...
    

    Ich bräuchte jetzt ein Array vom Typ UInt16[], welches diese Werte enthält. Leider bin ich mit meinen memcpy-Versuchen und sonstigen Experimenten kläglich gescheitert. Wäre für einen Hinweis, der mich in die richtige Richtung führt, sehr dankbar.

    Hejira


  • Mod

    Das klingt nach einem Fall für reinterpret_cast. Für genauere Hilfe müsstest du sagen, ob du den Datenblock in das Array kopieren willst oder mit dem Array auf dem Datenblock arbeiten möchtest.

    edit: Ach, es liegt als void* vor. Dann geht auch ein static_cast.



  • So?

    const UInt16* foo = ( const UInt16* )data;
    

    Das klingt nach einem Fall für reinterpret_cast, für genauere Hilfe, müsstest du sagen, ob du den Datenblock in das Array kopieren willst oder mit dem Array auf dem Datenblock arbeiten möchtest.

    Ein static_cast reicht da schon.



  • SeppJ schrieb:

    Für genauere Hilfe müsstest du sagen, ob du den Datenblock in das Array kopieren willst oder mit dem Array auf dem Datenblock arbeiten möchtest.

    Also das ist eigentlich egal. Die Werte sind 16-Bit-Abtastwerte von der Soundkarte und ich will damit einen FFT-Algorithmus füttern, der halt ein UInt16[] nimmt.

    static_cast sagt mir leider nichts aber ich werd mich mal schlau machen...


  • Mod

    hejira schrieb:

    SeppJ schrieb:

    Für genauere Hilfe müsstest du sagen, ob du den Datenblock in das Array kopieren willst oder mit dem Array auf dem Datenblock arbeiten möchtest.

    Also das ist eigentlich egal. Die Werte sind 16-Bit-Abtastwerte von der Soundkarte und ich will damit einen FFT-Algorithmus füttern, der halt ein UInt16[] nimmt.

    static_cast sagt mir leider nichts aber ich werd mich mal schlau machen...

    static_cast ist im Prinzip nur eine andere Schreibweise für den klassischen C-Cast wie David_pb ihn vorgeschlagen hat. Der Vorteil der Schreibweise ist, dass sie einheitlich zu den anderen in C++ zusätzlich vorhandenen Casts ist.



  • David_pb schrieb:

    So?

    const UInt16* foo = ( const UInt16* )data;
    

    Danke erstmal für die schnellen Antworten. Ich hab das gerade mal ausprobiert, aber damit komme ich doch nur an die jeweils ersten zwei Bytes, oder?

    Ich kann mir irgendwie nicht vorstellen, wie man das mit einem einfachen Cast hinkriegen soll. Alle Beispiele, die ich gesehen habe, kopieren in einer Schleife jeweils eine Speicheradresse und verschieben dann die Bits um 16, um an den jeweils zweiten Wert ranzukommen.

    Denke ich da zu kompliziert?



  • hejira schrieb:

    Danke erstmal für die schnellen Antworten. Ich hab das gerade mal ausprobiert, aber damit komme ich doch nur an die jeweils ersten zwei Bytes, oder?

    Nein:

    UInt16 wert1 = foo[0];
    UInt16 wert2 = foo[1];
    UInt16 wert3 = foo[2];
    
    // ...
    

    Da du ja weißt das es genau 8000 Einträge sind:

    for ( int i = 0; i < 8000; ++i )
    {
       std::cout << "Wert #" << i << " " << foo[i] << "\n";
    }
    

  • Mod

    Dein Stichwort zum recherchieren: Zeigerarithmetik



  • David_pb schrieb:

    for ( int i = 0; i < 8000; ++i )
    {
       std::cout << "Wert #" << i << " " << foo[i] << "\n";
    }
    

    So klappt es, vielen Dank! Da hab ich wohl echt zu kompliziert gedacht.

    SeppJ schrieb:

    Dein Stichwort zum recherchieren: Zeigerarithmetik

    Guter Tipp. Diese ganze Zeiger-Geschichte ist mir wirklich unheimlich 😉


Anmelden zum Antworten