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

چرا کد زیر خروجی نمی دهد؟ ( برگرداندن ارایه از تابع )

0 امتیاز



#include <iostream>

using namespace std;
int *bob(int arr[],int c)
{
    int t;
    for(int i=c-1;i>=0;i++)
    {
        for(int j=0;j<i;j++)
        {
          if(arr[j]>arr[j+1])
          {
              t=arr[j];
              arr[j]=arr[j+1];
              arr[j+1]=t;
          }
        }
    }
    return arr;
}
int main()
{
    int r[50],i,j,n;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cout<<"r["<<i<<"] : ";
        cin>>r[i];
    }
    int *p=bob(r,n);
    for(j=0;j<n;j++)
    {
        cout<<"*(p+"<<j<<") = "<<*(p+j);
    }
    return 0;



}

 

سوال شده خرداد 25, 1399  بوسیله ی جواد (امتیاز 9)   1 1

2 پاسخ

0 امتیاز

سلام؛ توی خط ۱۱ شرط شما باعث میشه که به حافظه‌ای خارج از حافظهٔ موجود برنامه دست پیدا کنید که خطای Segmentation fault رو دریافت می‌کنید. 

    - پیشنهاد می‌کنم که به جای C-style array از std::array استفاده کنید که موقع این اشتباهات یک Exception پرتاپ کنه و سریعاً متوجهٔ خطا بشید.

    - زمانی‌که شما یک C-Style array رو به تابعی ارسال می‌کنید، اشاره‌گری به خونهٔ اوّل اون آرایه ارسال میشه. پس شما هر تغییراتی که در اون آرایهٔ اعمال کنید مستقیماً روی آرایهٔ تابع فراخواننده اعمال میشه و نیازی به برگردوندن آرایه از تابع نیست (هرچند که اینکاری هم که می‌کنید کار اشتباهی هست).

پاسخ داده شده خرداد 25, 1399 بوسیله ی mg_ramezani (امتیاز 727)   1 1 12
0 امتیاز

کد شما چند اشکال داره

۱- شمارنده i کاهشی هستش پس باید کاهش بدید در هر مرحله.

۲-شما زمانیکه در تابع اشاره گری  را از ورودی دریافت می کنید اجازه ندارید اون اشاره گر را به خروجی ارسال کنید .

۳- تابع اشاره گر را دریافت می کنه و تغییرات را در محتوی اشاره گر اعمال می کنه در ضمن اگر قصد دارید یک خروجی مجزا داشته باشید یا اشاره گر مجزای آن را از ورودی بگیرید و یا اینکه داخل تابع بسازیدش و به  عنوان خروجی تابع  برگردونیدش.

#include <iostream>
 
using namespace std;
void bob(int* arr,int c)
{
    int t;
    for(int i=c-1;i>=0;i--)
    {
        for(int j=0;j<i;j++)
        {
          if(arr[j]>arr[j+1])
          {
              t=arr[j];
              arr[j]=arr[j+1];
              arr[j+1]=t;
          }
        }
    }
    
}
int main()
{
    int r[50],i,j,n;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cout<<"r["<<i<<"] : ";
        cin>>r[i];
    }
    bob(r,n);
    for(j=0;j<n;j++)
    {
        cout<<"*(p+"<<j<<") = "<<*(r+j);
    }
    return 0;
 
 
 
}

 

پاسخ داده شده خرداد 25, 1399 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
...