Frage

Hier ist eine Funktion ähnlich dem I definiert haben:

void Function( BYTE *data );

Was würde Ich mag es, etwas zu tun, wie folgt aus:

Function( new BYTE { 0x00, 0x00 } );
War es hilfreich?

Lösung

Sie können nicht die Array initialiser Syntax mit dynamisch zugewiesenen Arrays verwenden mit new. Man könnte so etwas tun:

BYTE *ary=new BYTE[2];
ary[0] = 0;
ary[1] = 0;
Function(ary);
delete [] ary;

Aber warum sind Sie mit dynamisch zugewiesenen Speicher hier? Ist das Array auf außerhalb des Bereichs der aktuellen Funktion gehalten? Wenn nicht, können Sie einen Array auf dem Stapel reserviert verwenden:

BYTE ary[2] = {0};
Function(ary);

In C ++ ist eine bevorzugte Methode ist es, die Klasse STL std::vector zu verwenden, die wie ein dynamisch zugewiesenen wirkt (aber gibt safe) Array:

std::vector<BYTE> ary(2);
Function(&ary[0]);

Andere Tipps

BYTE foo[] = { 0x00, 0x00 };
Function( foo );

C ++ 0x wird Initialisiererliste Syntax einführen, die etwas näher ermöglichen, was Sie wollten oben.

#include <windows.h>
#include <iostream>
using namespace std;
void foo(BYTE *d) {
    cout << (int)d[ 0 ] << " " << (int)d[ 1 ] << endl;
}
int main(void) 
{
    foo(new BYTE[ 2 ]());
    return 0;
}

Die oben genannten Arbeiten, wenn alles, was Sie jemals wollte, war die BYTE Array auf alle Nullen zu initialisieren. (Ich gehe davon aus das ist der Windows-BYTE Typ.) Dies ist jedoch leckageanfälligen wie erwähnt und wird am besten vermieden werden.

Oder Sie könnten die Auslassungspunkte verwenden Aufbau Ihres Arrays zu imitieren:

werfen Sie einen Blick auf diese: http://www.cplusplus.com/ Referenz / clibrary / cstdarg / va_arg /

Und wenn Sie wirklich Geige wollen, bevor die 0x ankommt, nehmen Sie einen Blick auf diesem Code .

gcc hat eine Erweiterung „Verbindung Literale“ genannt, was Sie schreiben können:

Function((BYTE[]){1, 2, 3, 4});

Beachten Sie, dass es auf dem Stapel zugeordnet, so dass es möglicherweise nicht für Ihre Zwecke geeignet sein.

Nun, wenn BYTE eine Klasse ist, könnten Sie einen Konstruktor haben

BYTE::BYTE(char c1,char c2){
 //something here.
}

und rufen Sie dann

Function( new BYTE(0X00,0X00))

Dies ist jedoch leckanfällig. Sie sollten das Argument löschen, bevor Funktion zu verlassen. Und das ist nicht immer möglich (zum Beispiel, wenn Sie nicht Funktion der Quelle haben)

Hilfsfunktion;

  BYTE* makeNaryByteArray( int n, BYTE exemplar = 0 ) {
    BYTE* r = new BYTE[ n ];
    for( int i = 0 ; i < n ; ++i )
       n[i] = exemplar;
    return r;
  }

  //call them:
  BYTE* myByteArray;
  Function( myByteArray = makeNaryByteArray(2) );

  // done with array:
  delete[] myByteArray;

Denken Sie daran, mit new[] erstellt Arrays mit delete[] gelöscht werden;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top