سؤال

هل هناك أي طريقة لإرجاع مصفوفة من دالة؟وبشكل أكثر تحديدًا، قمت بإنشاء هذه الوظيفة:

char bin[8];

for(int i = 7; i >= 0; i--)
{
    int ascii='a';
    if(2^i-ascii >= 0)
    {
        bin[i]='1';
        ascii=2^i-ascii;
    }
    else
    {
        bin[i]='0';
    }
}

وأنا بحاجة إلى وسيلة للعودة bin[].

هل كانت مفيدة؟

المحلول

ومجموعة الخاص بك هو متغير محلي المخصصة على المكدس. يجب عليك استخدام new [] تحيله على الكومة. ثم هل يمكن أن أقول: return bin;. حذار أنه سيكون لديك لتحرير صراحة مع delete [] عند الانتهاء معها.

نصائح أخرى

لا يمكنك فعل ذلك ولكن يمكنك:

  • قم بإرجاع مصفوفة مخصصة ديناميكيًا - من الأفضل أن يمتلكها مؤشر ذكي بحيث لا يضطر المتصل إلى الاهتمام بإلغاء تخصيص الذاكرة له - يمكنك أيضًا إرجاع شيء مثل std::vector بهذه الطريقة.
  • قم بملء مصفوفة/متجه تم تمريره إليك كوسيطة بواسطة المؤشر (مقترح) أو مرجع غير ثابت.

وأنت تطلب حقا السؤال الخطأ. إذا كنت تريد أن تفعل معالجة سلسلة في C ++، استخدم الأمراض المنقولة جنسيا :: سلسلة و / أو فئات الأمراض المنقولة جنسيا :: ناقلات، وليس صفائف شار. التعليمات البرمجية ثم يصبح:

vector <char> func() {
    vector <char> bin(8);
    for( int i = 7; i >= 0; i-- ) {
       int ascii='a';
       if ( 2 ^ i - ascii >= 0 ) {
          bin[i] = '1';
          ascii = 2^i - ascii;
       }
       else {
        bin[i] ='0';
       }
    }
    return bin;
}

وأعتقد أن أفضل رهان هو استخدام ناقلات. يمكن أن تعمل بطرق كثيرة مثل مجموعة ولديها العديد من الإيجابيات (طول المخزن مع نوع، إدارة الذاكرة التلقائي).

void Calculate( std::vector<char>& bin) {
  for(int i = 7; i >= 0; i--)
  {
    int ascii='a';
    if(2^i-ascii >= 0)
    {
        bin.push_back('1');
        ascii=2^i-ascii;
    }
    else
    {
        bin.push_back('0');
    }
  }
}

إذا كنت ترغب في عودة نسخة من مجموعة (قد يكون من المنطقي للصفائف صغيرة) ومجموعة وثابتة الحجم، يمكنك احتوائه في البنية؛

struct ArrayWrapper {
   char _bin[8];
};

ArrayWrapper func()
{
    ArrayWrapper x;

    // Do your stuff here using x._bin instead of plain bin

    return x;
}

وأو مجرد استخدام الأمراض المنقولة جنسيا :: ناقلات كما اقترح بالفعل.

وتنفيذها لالجواب @ آري ومماثلة، أريد أن أقول هناك بالفعل حل دفعة، boost::array حل مشكلتك:

boost::array<char, 8> f() {
    boost::array<char, 8> bin;
    for(int i = 7; i >= 0; i--) {
        int ascii = 'a';
        if(2 ^ i-ascii >= 0) {
            bin[i] = '1';
            ascii = 2 ^ i-ascii;
        } else {
            bin[i] = '0';
        }
    }
}

...
boost::array<char, 8> a(f());

<الفرعية> [I لست متأكدا ما تريد القيام به مع أن خوارزمية الرغم من ذلك، ولكن لاحظ أن أعتقد أنك تريد أن تفعل 1 << i (التحول بت الحكمة) بدلا من 2 ^ i وهو <م> لا الأسي في C ++.]

وتفعيل مجموعة هي مجموعة العادية، اختتم أعماله مؤخرا في البنية، وبالتالي تفقد أي أداء ما لذلك على الإطلاق. وسوف تكون متاحة أيضا في النسخة المقبلة C ++ كما std::array، ومن السهل جدا القيام به نفسك إذا كنت لا تحتاج إلى begin() / size() / data() من السكر فإنه يضيف (أن تكون وعاء). اذهبوا مع أبسط واحد:

template<typename T, size_t S>
struct array { 
    T t[S];
    T& operator[](ptrdiff_t i) { return t[i]; }
    T const& operator[](ptrdiff_t i) const { return t[i]; }
};

ولكن كالعادة، استخدام الأدوات سبق أن كتبت من قبل أشخاص آخرين، في هذه الحالة boost::array. كما انها حصلت على ميزة كونها تجمعا (وهذا هو السبب في أنه قد أعلن أي مستخدم منشئ)، لذلك يسمح تهيئة بقائمة هدفين المغلقة:

boost::array<int, 4> a = {{ 1, 2, 3, 4 }};

تحتاج إلى تمرير array bin كوسيطة في وظيفتك.مجموعة تمر دائما حسب العنوان, لذلك لا تحتاج إلى إرجاع أي قيمة.سيظهر لك تلقائيًا جميع التغييرات في برنامجك الرئيسي

void FunctionAbc(char bin[], int size);


void FuncationAbc(bin, size)
{
for(int i = 7; i >= 0; i--)
{
    int ascii='a';
    if(2^i-ascii >= 0)
    {
        bin[i]='1';
        ascii=2^i-ascii;
    }
    else
    {
        bin[i]='0';
    }
}

}

وأنت تريد تمرير بالإشارة، كما يلي:

void modifyBin(char (&bin)[8])
{
    /* your function goes here and modifies bin */
}

int main() 
{
    char bin[8];
    modifyBin(bin);
    /* bin has been updated */
    return 0;
}

وأعتقد أن الجميع أجاب هذا واحد ... استخدام حاوية بدلا من صفيف. هنا في النسخة std::string:

std::string foo() {
    int ascii = 'a';
    std::string result("00000000");
    for (int i=7; i>=0; --i) {
        if (2^i-ascii >= 0) {
            result[i] = '1';
            ascii = 2^i-ascii;
        }
    }
    return result;
}

ولست متأكدا حقا إذا 2^i-ascii هي تريد تريد أو لا. سيتم تحليل هذه كما (2 ^ (i - ascii)) وهي غريبة بعض الشيء.

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