return کردن آرایه در c - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

return کردن آرایه در c

+1 امتیاز
من یک تابع نوشتم داخلش یک آرایه ساختم معکوس یک ماتریس رو که از ورودی گرفتم ریختم  توش حالا چجوری می تونم آرایه رو return کنم هر کار کردم نشد ؟!!
سوال شده آذر 15, 1392  بوسیله ی hojat1 (امتیاز 875)   12 68 99
دوباره تگ گذاری شد بهمن 22, 1392 بوسیله ی BlueBlade

4 پاسخ

+2 امتیاز
 
بهترین پاسخ

ببینید چند راه داره شما میتونین یکیشو انتخاب کنین یکیش اینه که اگه آرایه شما جزو پارامترهای ورودی تابع نیست (همون طوری که گفتین داخل تابع ایجاد کردین)

میتونین به راحتی اونو برگردونین

به این صورت :

 

     int[] func(){

      int arr[5];

..
..

       return arr;

      }


     void func(int arr[])
     {
          for(...);

      }

     void func(int *arr)
     {
           for(...);

     }


      int* func()
      {
            int *arr=new int[5];
            for(...);
           return arr;

      }

 

پاسخ داده شده آذر 16, 1392 بوسیله ی mahdi (امتیاز 392)   7
انتخاب شد آذر 17, 1392 بوسیله ی hojat1
ممنون منظورم همین جوری بود .
0 امتیاز
سلام. تا جایی که می دونم می تونید آدرس شروع آرایه رو برگردونید.
پاسخ داده شده آذر 15, 1392 بوسیله ی You-See (امتیاز 36)   1 1 5
+1 امتیاز
اگر استاتیک ساختیتد توی stack ساخته میشه و آدرسش بیرون از تابع معتبر نیست چون stack مربوط به آن تابع بعد از برگشت پاک میشه و اگر هم به صورت دینامیک ساختید یعنی از new و malloc استفاده می کنید خود اسم آرایه تونو برگشت بدید.
پاسخ داده شده آذر 15, 1392 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
+3 امتیاز

یک روش خوب هم اینه که آدرس آرایه ای رو بدید به تابع تا نتیجه رو روی اون اعمال کنه. مثال:

int * MatrixAdd(
    int * pOut,
    const int * pM1,
    const int * pM2,
    const int Width,
    const int Height)
{
    int index;
    for (int j = 0; j < Height; j++)
    {
        for (int i = 0; i < Width; i++)
        {
            index = j * Width + i;
            pOut[index] = pM1[index] + pM2[index];
        };
    };
    return pOut;
};

 

و برای استفاده:

    int M1[4][3]; // init...
    int M2[4][3]; // init...
    int M3[4][3];
    MatrixAdd(&M3[0][0], &M1[0][0], &M2[0][0], 3, 4);

و اگر برنامتون طوری هست که اشاره گر ها ممکنه آدرس های مشترکی رو بفرستن بهتره ازین روش استفاده کنید که خروجی مطمئن باشه:

int * MatrixAdd(
    int * pOut,
    const int * pM1,
    const int * pM2,
    const int Width,
    const int Height)
{
    size_t size_of_block = sizeof(int) * Height * Width;
    int * mat = (int *)malloc(size_of_block);
    int index;
    for (int j = 0; j < Height; j++)
    {
        for (int i = 0; i < Width; i++)
        {
            index = j * Width + i;
            mat[index] = pM1[index] + pM2[index];
        };
    };
    memcpy(pOut, mat, size_of_block);
    free(mat);
    return pOut;
};

حالا میتونیم نتیجه رو مستقیما تو یکی از دو ماتریسی که داریم جمع میکنیم بریزیم:

    int M1[4][3]; // init...
    int M2[4][3]; // init...
    MatrixAdd(&M1[0][0], &M1[0][0], &M2[0][0], 3, 4);

 

پاسخ داده شده آذر 15, 1392 بوسیله ی محمد قدیانی (امتیاز 317)   1 9
...