ここに私が定義したものと同様の関数があります:
void Function( BYTE *data );
私がやりたいことは次のようなものです:
Function( new BYTE { 0x00, 0x00 } );
ここに私が定義したものと同様の関数があります:
void Function( BYTE *data );
私がやりたいことは次のようなものです:
Function( new BYTE { 0x00, 0x00 } );
を使用して動的に割り当てられた配列で、配列初期化子構文を使用することはできませんnew
。次のようなことができます。
BYTE *ary=new BYTE[2];
ary[0] = 0;
ary[1] = 0;
Function(ary);
delete [] ary;
しかし、なぜここで動的に割り当てられたメモリを使用しているのですか? 配列は現在の関数のスコープ外に保持されていますか? そうでない場合は、スタックに割り当てられた配列を使用できます。
BYTE ary[2] = {0};
Function(ary);
C++ で推奨される方法はstd::vector
、動的に割り当てられた (ただしタイプ セーフな) 配列のように機能する STL クラスを使用することです。
std::vector<BYTE> ary(2);
Function(&ary[0]);
BYTE foo[] = { 0x00, 0x00 };
Function( foo );
C++0x では、上記の必要に近いものを可能にする初期化リスト構文が導入されます。
#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;
}
上記は、BYTE
配列をすべてゼロに初期化することだけが必要な場合に機能します。(これは Windows のBYTE
タイプだと思います。) ただし、これは前述のようにリークが発生しやすく、避けるのが最善です。
gcc には「複合リテラル」と呼ばれる拡張機能があり、次のように記述できます。
Function((BYTE[]){1, 2, 3, 4});
スタックに割り当てられるため、目的には適さない可能性があることに注意してください。
または、省略記号を使用して配列の構築を模倣することもできます。
これを見てください:http://www.cplusplus.com/reference/clibrary/cstdarg/va_arg/
0x が到着する前に本当にいじりたい場合は、このコードを見てください。
BYTE がクラスの場合、コンストラクターを持つことができます
BYTE::BYTE(char c1,char c2){
//something here.
}
そして電話する
Function( new BYTE(0X00,0X00))
ただし、これは漏れやすいです。関数を終了する前に、引数を削除する必要があります。そして、それは常に可能であるとは限りません (たとえば、関数のソースがない場合)
補助機能;
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;
で作成された配列は;new[]
で削除されることを覚えておいてください。delete[]