2009-05-01 4 views
0

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 }); 

Antwort

6

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]); 
0

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

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

haben und dann

nennen
Function(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)

+0

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 –

+0

@ 1800. Stimmt wahrscheinlich.Vielleicht könnte es eine mögliche Lösung als Wrapper spielen? – Tom

+0

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. –

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

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

0

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;

+0

Nur ein Kommentar zum Funktionsnamen: Die Arity von Array ist die Nummer der Dimension, nicht die Anzahl der Elemente. –

2
#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.

1

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.

+0

Das ist eine Art, über die ich nachgedacht habe, danke. – xian

+2

Ellipsis ist BÖSE! Es funktioniert nur für POD-Typen und Sie verlieren die Sicherheit. –

+0

@Richard: es ist! Deshalb habe ich versucht, die Typensicherheit durch eine Template-Funktion wieder einzuführen. – xtofl

1

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.