문제

다음은 내가 정의한 것과 유사한 기능입니다.

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 ++에서 선호하는 방법은 STL 클래스를 사용하는 것입니다. std::vector 동적으로 할당 된 (하지만 안전한 타입) 배열처럼 작용합니다.

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 모든 0에 배열. (나는 이것이 창문이라고 가정합니다 BYTE 유형.) 그러나 이것은 언급 된대로 누출되며 피하는 것이 가장 좋습니다.

또는 타원을 사용하여 배열의 구성을 모방 할 수 있습니다.

이것을 살펴보십시오 : http://www.cplusplus.com/reference/clibrary/cstdarg/va_arg/

그리고 0x가 도착하기 전에 정말 바이올린을 원한다면 이 코드.

GCC는 "Compound Literals"라는 확장 기능이있어 다음을 작성할 수 있습니다.

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

스택에 할당되므로 목적에 적합하지 않을 수 있습니다.

바이트가 클래스라면 생성자가있을 수 있습니다.

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[];

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top