View Full Version : سوال: چرا باید با ارجاع ارسال کنیم؟
prince4prodigy
سه شنبه 21 شهریور 1391, 10:57 صبح
دوستان من دلیل این که در برنامه ی زیر از ارسال با ارجاع اسفاده میکنیم رو متوجه نمیشم.
ممنون اگه یه توضیح کامل بدید.
void read(int[],int &);
const int MAXSIZE = 5 ;
int main()
{
cout<<"please enter five number : \n";
int a[MAXSIZE]={0},size;
read(a,size);
}
void read(int a2[],int& n){
n=0;
for(;n<MAXSIZE;n++){
cout<<"a2["<<n<<"]: ";
cin>>a2[n];
}
}
meisam12
سه شنبه 21 شهریور 1391, 12:50 عصر
سلام دوست عزیز
در این مثال اختیارآً این کار را انجام داده است. ولی این روش برای زمانی خوب است که شما بخواهید چند تا متغیر را برگشت دهید اون وقت است که ارجاع مناسب می باشد.
prince4prodigy
سه شنبه 21 شهریور 1391, 13:42 عصر
اگه ارجاع نباشه اصلا برنامه اجرا نمیشه.
اگه یه توضیح کامل تری بدید ممنون میشم.
MAN_UNITED
سه شنبه 21 شهریور 1391, 13:50 عصر
سلام دوست عزیز
شما از یک آرایه ایستا استفاده کرده اید آرایه های ایستا یه طول اصلی دارند یه واقعی طول اصلی اینجا MAXSIZE هستش که به اندازه اون حافظه برای آرایه در نظر گرفته شده
حالا ما نمیدونیم از چند خانه آرایه استفاده میکنیم پس یه طول اصلی میخواییم که اون n هستش
حالا دلیل ارجایی بودنش، تو این برنامه برای پر کردن آرایه از یک تابع به نام read استفاده شده خوب طول واقعی رو ما تو تابع بدست میاریم پس باید بتونیم طول واقعی رو به تابع اصلی برگردونیم پس باید از ارجاع استفاده کنیم چون در تمام عملیات های آینده روی آرایه باید از n استفاده بشه
البته این تابع رو جور دیگه هم میتونید بنویسید:
int read(int a[])
{
int n=0;
for(;n<MAXSIZE;n++){
cout<<"a2["<<n<<"]: ";
cin>>a[n];
}
return n;
}
و داخل main به صورت زیر فراخوانی بشه :
int main()
{
int n,a[MAXSIZE];
n=read(a);
}
البته این برنامه یکم غیر منطقی هستش چون شما کاربر رو مجبور میکنید به اندازه طول اصلی عدد وارد بکنه و این درست نیست و باید به اندازه نیاز عدد وارد بشه و به کاربر اجازه بدید هر موقع که خواست ورود اطلاعات و قطع کنه
امیدوارم مفید باشه
Alireza_1387
سه شنبه 21 شهریور 1391, 17:19 عصر
سلام
دوست عزیز پاسخ شما رو یافتم
کلا ما مواقعی از ارجاع استفاده می کنیم
که می خوایم متغیری بعد از اینکه در تابعی تغییر کرد ، وقتی بخوایم محتویات اون رو چاپ کنیم ، محتویات متغیر که تغییر کرده چاپ می شود.
اما تو این برنامه یه استفاده ی دیگه ای ازش میشه
همونطور که دوستمون گفتم چون در اینجا ما متغیر size را تعریف کرده ایم ولی مقدار دهی نکرده ایم ، اگر عملگر ارجاع(&) رو پاک کنیم می بینیم ، که خطایی مبنی بر اینکه
"متغیر size قبل از اینکه استفاده شود ، مقدار دهی نشده است"
را مشاهده می کنیم
البته یه چیزی که من فهمیدم این بود که اصلا متغیر size توی این برنامه به درد نمی خوره و برنامه بدون متغیر size به صورت زیر قابل نوشتن هستش:
باز اگه سوالی بود خوشحال می شم جواب بدم
#include <iostream.h>
#include <conio.h>
void read(int[]);
const int MAXSIZE = 5 ;
int main()
{
cout<<"please enter five number : \n";
int a[MAXSIZE]={0};
read(a);
getch();
}
void read(int a2[]){
int n=0;
for(;n<MAXSIZE;n++){
cout<<"a2["<<n<<"]: ";
cin>>a2[n];
}
}
prince4prodigy
سه شنبه 21 شهریور 1391, 19:02 عصر
سلام دوست عزیز
شما از یک آرایه ایستا استفاده کرده اید آرایه های ایستا یه طول اصلی دارند یه واقعی طول اصلی اینجا MAXSIZE هستش که به اندازه اون حافظه برای آرایه در نظر گرفته شده
حالا ما نمیدونیم از چند خانه آرایه استفاده میکنیم پس یه طول اصلی میخواییم که اون n هستش
دوست عزیز شما هم MAXSIZE و هم N رو یه عنوان طول اصلی معرفی کردی . میشه در مورد یه کم بیشتر توضیح بدی...
MAN_UNITED
چهارشنبه 22 شهریور 1391, 00:25 صبح
نه دوست عزیز n طول واقعی هستش ولی در برنامه شما فرقی بین طول واقعی و اصلی نیست
ببین فرض کن یه استاد 100 تا دانشجو داره(MAXSIZE) بعد ما میخواییم که یه برنامه برا اون بنویسیم که نمرات دانشجو هارو وارد کنه بعد مثلا میانگین و ... بگیره
خوب حتما که 100 دانشجو تو امتحان شرکت نمیکنند بعضی ها حذف میکنند و بعضی ها بالاخره سر جلسه نمیاند خوب ما الان کمتر از 100 تا خانه نمره داریم پس نیازی نیست از کل آرایه استفاده بشه پس اینجا به طول واقعی نیاز داریم که خود کاربر که اینجا همان استاد هستش وارد میکنه یا با استفاده از شرط حلقه نگهبان نمرات و وارد میکنه تا تموم بشه بعد طول واقعی بدست میاد
prince4prodigy
چهارشنبه 22 شهریور 1391, 09:17 صبح
میشه در مورد مفهوم این جمله که گفتید باید طول واقعی به تابع برگردونده یه کم بیشتر توضیح بدید و اصلا دلیل انجام این کار چیه و یا این که در سایر برنامه ها چه موقغ باید تشخیص بدیم که باید از این روش (ارسال با ارجاع) استفاده کنیم؟
با تشکر فراوان
مسعود اقدسی فام
چهارشنبه 22 شهریور 1391, 09:52 صبح
میشه در مورد مفهوم این جمله که گفتید باید طول واقعی به تابع برگردونده یه کم بیشتر توضیح بدید و اصلا دلیل انجام این کار چیه و یا این که در سایر برنامه ها چه موقغ باید تشخیص بدیم که باید از این روش (ارسال با ارجاع) استفاده کنیم؟
با تشکر فراوان
شما یه لیست صدتایی (MAXSize = 100) تعریف کردید. اما ممکن بود فقط از 70 تا استفاده کنید. به اولی طول اصلی، و به دومی طول واقعی میگن. ممکنه کد شما به نحوی باشه که اطلاعات دانشجوها رو داخل تابع از کاربر دریافت می کنه. در اینصورت باید طول واقعی بعد از دریافت همه اطلاعات مشخص بشه (مثلا 70) و در محلی که تابع فراخوانی شده مشخص باشه. حالا اینکار می تونه با برگردوندن طول واقعی انجام بشه (با return)، یا با اشاره گر، یا با ارجاع.
اما بحث ارجاع فقط اینطور جاها نیست. چون همونطور که گفتم روشهای دیگه ای هم برای کار کردن وجود داره. یکی از جاهایی که ارجاع خدمت خیلی بزرگی به برنامه نویسی می کنه، زمانیه که می خوای پارامتری با حجم بزرگ (مثلا یا ساختار یا یک شی از کلاس حجیم) به یه تابع بفرستی. در این حال سرعت پردازش در حالت عادی پایین می یاد. چون با هر بار فراخوانی تابع باید یه کپی از پارامتر تهیه بشه و داخل آرگومانهای تابع قرار بگیره. برای جلوگیری از این اتقاق متغیر رو به صورت ارجاع ارسال می کنن که انگار خود متغیر ( و نه کپی) ارسال شده. فرقش با اشاره گر که آدرس متغیر رو می فرستاد کاربری راحتتره اونه که لازم نیست طرف با مفهوم و عملکرد اشاره گر سر و کله بزنه. اگر هم نمی خواید داخل تابع مقدار متغیر عوض بشه کافیه یه const به اول تعریف آرگومان اضافه کنید.
این لینک رو هم بخونید:
http://www.algorithmha.ir (http://www.algorithmha.ir/post-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7%DB%8C-%D9%85%D8%B1%D8%AC%D8%B9-%D8%AF%D8%B1-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3.aspx)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.