سؤال

وهنا هي وظيفة مماثلة لتلك التي كنت تعرف:

void Function( BYTE *data );

ما أود القيام به هو شيء من هذا القبيل:

Function( new BYTE { 0x00, 0x00 } );
هل كانت مفيدة؟

المحلول

ولا يمكنك استخدام مجموعة initialiser جملة مع صفائف المخصصة بشكل حيوي باستخدام 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 لجميع أصفار. (انا افترض ان هذا هو ويندوز نوع BYTE.) ولكن هذا هو تسرب عرضة على النحو المذكور، والأفضل تجنبها.

وأو هل يمكن استخدام القطع لتقليد بناء مجموعة الخاص بك:

ونلقي نظرة على هذا: http://www.cplusplus.com/ المرجع / clibrary / cstdarg / va_arg /

وإذا كنت تريد حقا أن كمان قبل وصول 0X، نلقي نظرة على هذا الرمز .

ودول مجلس التعاون الخليجي على ملحق يسمى "الحرفية مجمع"، والذي يسمح لك لإرسال:

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

لاحظ أن يتم تخصيص على المكدس، لذلك قد لا تكون مناسبة لأغراضك.

حسنا، إذا 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[]؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top