Question

Voici une fonction similaire à celle que j'ai définie:

void Function( BYTE *data );

Ce que je voudrais faire est quelque chose comme ceci:

Function( new BYTE { 0x00, 0x00 } );
Était-ce utile?

La solution

Vous ne pouvez pas utiliser la syntaxe d'initialisation de tableau avec des tableaux alloués dynamiquement à l'aide de nouveau . Vous pouvez faire quelque chose comme ça:

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

Mais pourquoi utilisez-vous ici de la mémoire allouée dynamiquement? Le tableau est-il bloqué en dehors de la portée de la fonction actuelle? Sinon, vous pouvez utiliser un tableau alloué sur la pile:

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

En C ++, une méthode recommandée consiste à utiliser la classe STL std :: vector , qui agit comme un tableau alloué dynamiquement (mais avec un type sécurisé):

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

Autres conseils

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

C ++ 0x introduira la syntaxe de la liste d’initialisation qui permettra quelque chose de plus proche de ce que vous vouliez plus haut.

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

Ce qui précède fonctionne si tout ce que vous vouliez était d'initialiser le tableau BYTE à tous les zéros. (Je suppose qu’il s’agit du type BYTE de Windows.) Toutefois, il est sujet aux fuites, comme indiqué, et il est préférable de l’éviter.

Vous pouvez également utiliser les points de suspension pour imiter la construction de votre tableau:

jetez un coup d'œil à ceci: http://www.cplusplus.com/ reference / clibrary / cstdarg / va_arg /

Et si vous voulez vraiment jouer avant que le 0x n'arrive, consultez ce code .

gcc a une extension appelée "Littéraux composés", qui vous permet d'écrire:

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

Notez qu'il est alloué sur la pile, il ne convient donc peut-être pas à vos besoins.

Eh bien, si BYTE est une classe, vous pourriez avoir un constructeur

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

puis appelez

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

Cependant, ceci est sujet aux fuites. Vous devez supprimer l'argument avant de quitter Function. Et ce n’est pas toujours possible (par exemple, si vous n’avez pas la source de la fonction)

Fonction auxiliaire;

  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;

N'oubliez pas que les tableaux créés avec new [] sont supprimés avec delete [] ;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top