Hier Passing ist eine Funktion ähnlich dem I definiert haben:C++ - Arrays Methoden
void Function(BYTE *data);
Was ich möchte, ist, etwas zu tun wie folgt aus:
Function(new BYTE { 0x00, 0x00 });
Hier Passing ist eine Funktion ähnlich dem I definiert haben:C++ - Arrays Methoden
void Function(BYTE *data);
Was ich möchte, ist, etwas zu tun wie folgt aus:
Function(new BYTE { 0x00, 0x00 });
Sie können nicht verwenden die Arrayinitialisierungssyntax mit dynamisch zugewiesenen Arrays unter Verwendung von new
. Sie könnten so etwas tun:
BYTE *ary=new BYTE[2];
ary[0] = 0;
ary[1] = 0;
Function(ary);
delete [] ary;
Aber warum verwenden Sie dynamisch allozierten Speicher hier? Wird das Array 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 std::vector
die STL-Klasse zu verwenden, die wie ein dynamisch zugewiesenen wirkt (aber typsicher) Array:
std::vector<BYTE> ary(2);
Function(&ary[0]);
Nun, wenn BYTE eine Klasse ist, könnten Sie ein Konstruktor
BYTE::BYTE(char c1,char c2){
//something here.
}
haben und dann
nennenFunction(new BYTE(0X00,0X00))
Dies ist jedoch leckanfällig. Sie sollten das Argument vor dem Beenden der Funktion löschen. Und das ist nicht immer möglich (zum Beispiel, wenn Sie nicht Funktion der Quelle haben)
BYTE foo[] = { 0x00, 0x00 };
Function(foo);
C++ 0x wird Initialisiererliste Syntax einführen, die etwas näher ermöglichen, was Sie oben wollten.
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, erstellt Arrays mit new[]
mit delete[]
gestrichen;
Nur ein Kommentar zum Funktionsnamen: Die Arity von Array ist die Nummer der Dimension, nicht die Anzahl der Elemente. –
#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, dass dies der Windows-Typ BYTE
ist.) Dies ist jedoch, wie erwähnt, undicht und anfällig und wird am besten vermieden.
Oder Sie könnten die Auslassungspunkte verwenden Aufbau Ihres Arrays zu imitieren:
werfen Sie einen Blick auf diese: http://www.cplusplus.com/reference/clibrary/cstdarg/va_arg/
Und wenn Sie wirklich Geige wollen, bevor die 0x ankommt, einen Blick auf this code nehmen.
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.
Ich würde bereit sein, hier zu gehen und vorschlagen, dass "BYTE" ist nicht der Name einer Klasse. Gutes Denken außerhalb der Box, obwohl –
@ 1800. Stimmt wahrscheinlich.Vielleicht könnte es eine mögliche Lösung als Wrapper spielen? – Tom
Mit Hilfe einer Funktionsüberladung glaube ich, dass nichts die implizite Verwendung eines intelligenten Zeigers verhindert, der sich um das Löschen kümmern würde. –