• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

تابعی که چند مقدار را برگرداند

nsh

Registered User
تاریخ عضویت
19 ژانویه 2006
نوشته‌ها
685
لایک‌ها
4
محل سکونت
i & j : 2 & 3
من یک تابع دارم که چند مقدار (2) رو برمیگردونه (تو c )
اما مشکلم اینه که نمیدونم تو مین چیجوری هر کدومو ذخیره کنم و بعد برای یک تابع دیگه بفرست :(
تو کتابم هم تو قسمت توابع اینو نگفته بود اگه کسی از دوستان میدونه ممنون میشم یه توضیحکی بده
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
سلام.
با return فکر کنم فقط یک مقدار میشه برگرداند و موقع احضار تابع درون یک متغیر ریخته می شود. که میشه محتوای اون متغیر را به تابع دیگر فرستاد.

اما در مورد چند خروجی از یک تابع در واقع دیگه return نیست بلکه یک راهش با آدرس فرستادن متغیر است &a مثلا(یا علامت اشاره گر شاید باشه. همون علامت ستاره.به کتاب مراجعه کنید). همون byvalue و byrefrence . که وقتی با آدرس بفرستیم. که به کتابتون مراجعه کنید برای طرز ارسال با آدرس .... در حالت ارسال با آدرس مسلمه که متغیر مقدارش تغییر می کنه بعد احضار تابع اول با main .
یعنی شما اول در مین یک متغیر دارید که به تابع اول با آدرس می فرستید و مسلمه که بعد ارسال اون به تابع اول مقدار متغیر تغییر می کنه. که میشه اون را مجددا به تابع دوم فرستاد که برای ارسال به تابع دوم هم ممکنه بخواهید مقدارش تغییر کنه یا بخواهید تغییر نکنه که با روش مناسب از مین اون را به تابع دوم ارسال می کنید.
البته بدون امتحان گفتم یعنی بدون کدنویسی ولی فکر کنم همین طور باشه.
 

nsh

Registered User
تاریخ عضویت
19 ژانویه 2006
نوشته‌ها
685
لایک‌ها
4
محل سکونت
i & j : 2 & 3
دستت درد نکنه
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
همانطور كه استاد سالك گفتند يك راهش استفاده از اشاره گر ها است و راه ديگر استفاده از استراكچر ها است
يعني اينكه شما يك استراكچر مثلا با دو متغيير ا و ب تعريف ميكنيد و بعد توي معين متغير سي رو از نوع اين استراكچر مي سازيد و بعد درون تايع يك متغير دي رو ساخته و بعد مقادير برگشت داده شده رو توي اين متغيير ميريزد و برگشت ميدهيد . اما روش پوينتر ها خيلي روس موثر تر و بهتري است .
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
در مورد ارسال استراکت برای اینکه من هم تمرینی کرده باشم از سایت زیر:
http://www.phptr.com/articles/article.asp?p=31783&seqNum=3&rl=1
مثال :
Listing 3.8 Constant reference arguments
را نقل می کنم:

کد:
// ref.C - const reference arguments
 #include <iostream.h>
 #include <conio.h>
 const int MaxBuf = 20;
 struct block {
  char buf[MaxBuf];

  int used;
 };

 int main()
 {
 clrscr();
  void display(const block &);      // prototype for display()
  block data;
  int i;

  data.used = 5;
  for (i = 0; i < data.used; i++)     // assign some values
    data.buf[i] = i + 'a';
  display(data);             // call by reference

  data.used = MaxBuf;

  for (i = 0; i < data.used; i++)
    data.buf[i] = i + 'a';
  display(data);             // call by reference
  getch(); // for turbo c 3.0
  return 0;
 }

 void display(const block & blockref) {
  for (int i = 0; i < blockref.used; i++)
    cout << blockref.buf[i] << ' ';
  cout << endl;
 }
نتیجه اجرا: با توربو سی 3 امتحان کردم.
کد:
 a b c d e
 a b c d e f g h i j k l m n o p q r s t
 

peymanafraz

کاربر تازه وارد
تاریخ عضویت
28 دسامبر 2005
نوشته‌ها
137
لایک‌ها
0
محل سکونت
$strHome
ميتونين از آرايه هم براي ارسال چند مقدار استفاده کنين
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
یه روش دیگه هم اینکه داده های کوچیک تر رو تو داده های بزرگتر چید مثلا می تونید چهار تا short int رو توی یه long long int قرار بدید البته فقط کاربرد های خیلی خیلی خاص می تونه داشته باشه
 

nsh

Registered User
تاریخ عضویت
19 ژانویه 2006
نوشته‌ها
685
لایک‌ها
4
محل سکونت
i & j : 2 & 3
ميتونين از آرايه هم براي ارسال چند مقدار استفاده کنين
فکر نمیکنم بشه میشه؟؟؟
saalek جان دستت درد نکنه همینطور ارش عزیز(راه خیلی بدیعی بود البته شاید چون من تازه کارم)
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
ميتونين از آرايه هم براي ارسال چند مقدار استفاده کنين

فکر نمیکنم بشه میشه؟؟؟

در پستهاي بالا گفتيم كه هر گاه تابع با * منتظر مقدار باشد با & برايش مقدار مي فرستيم.
ولي هر گاه متغير از نوع اشاره گر باشد يا از نوع آرايه باشد ، چون خودش از نوع آدرس است ، پس ،، بدون & مي فرستيم.


a4.gif


کد:
#include <iostream.h>

void f(char *x,char *y,int *z);

void main()
{
char *a="bahaar";
char b[20]="tabestaan";
int c[3]={123,45,11};
  cout <<"  a= "<<a<<endl;
  cout <<"  b= "<<b<<endl;
  cout <<"  c= "<<c<<endl;
  f(a,b,c);
  }
 void f(char *x,char *y,int *z )
  {  cout<<endl<<endl;
 cout <<"  x= "<< x<<endl;
 cout<<"  y= "<<y<<endl;
 cout<<"  z= "<<z<<endl;
	}

از :
http://forum.persiantools.com/t45911-page2.html

یک چیزی توی ذهنمه درست نمی تونم بگم. گفتم شاید با نقل این پست حل بشه.
آرایه و استراکت فکر کنم خودشان اشاره گر حساب بشوند.البته باید کد نوشت و امتحان کرد. یعنی باید داخل تابعی که main بهش آرایه و استراکت فرستاده آرایه و استراکت را تغییر داد و نتیجه را دید.
یعنی ببینیم بعد تغییر آرایه و استراکت داخل تابع آیا این تغییرات در داخل main منعکس می شود یا نه. البته آرش جان استاد هستند در این مورد ولی من هم نظری می دهم تا ایشان تکمیل و اصلاح کند.
ما دو چیز داریم. یکی استانداردهای زبان و دیگری اختلافات کامپایلرها. این مورد فکر کنم به زبان بیشتر مربوطه نه کامپایلر. در سی شارپ فکر کنم این نوع تقسیم بندی انواع داده ها با سی پلاس فرق داشته باشد. انواع داده ها منظورم کلاس استراکت آرایه و متغیرهای معمولی و .. است.
کلا در هر دو زبان انواع داده به دو دسته باید تقسیم بشوند. ارجاعی و معمولی. کار با ارجاعی ها فرق داره با معمولی ها.
در سی شارپ کلاس و استراکت در دو گروه ممکنه باشند ولی در سی پلاس در یک گروه. مثلا هر دو در ارجاعی ها. من الان بدون مراجعه نه سی شارپ را می توانم شرح بدهم و نه سی پلاس را .احاطه و حضور ذهن ندارم . فقط اینها را نوشتم تا شاید در مطالعه های بعدی بکارتان بیاید. و همچنین دوستان اشتباهاتم را بگویند تا من هم چیزی یاد بگیرم.
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
http://www.cplusplus.com/articles/Arrptr.html

تفاوت آرایه با اشاره گر را با استفاده از کد گفته.

--------------------------------------------------
The difference between pointers and arrays


1) A pointer is a place in memory that keeps address of another place inside, while an array is a single, preallocated chunk of contiguous elements (all of the same type), fixed in size and location.

3) Array like pointers can't be initialized at definition like arrays.
کد:
char car[3]={'a','b',66}; 
char* cpt=new char[3]; //No way to be initialized here.

4) When we allocate memory for a pointer to use it as a dynamic array. The memory can be resized or freed later. But this is not the case for arrays.

For example:
کد:
char* pta=new char[12];
//Using pta
delete[] pta;

3) They produce different assembly code. Look and compare:
کد:
int main()
{ 
	char arr[3];
	char* ptr=new char[3];

	arr[0]='C';   //Assembly is for this.  
	ptr[0]='p';   //And for this.

	return 0;
}

Will have an assembly like this:
کد:
arr[0]='C';
            mov         byte ptr [ebp-4],43h  //The code for putting one character in an array

ptr[0]='p';
            mov         ecx,dword ptr [ebp-8]  //The two line code for putting one character
            mov         byte ptr [ecx],70h     //in a place where a pointer points to

Hope to be useful...

Refferences:
http://67.40.109.61/torek/c/index.html
http://c-faq.com/questions.html
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
استراکت اشاره گر نیست ولی آرایه ذات یه اشاره گره مثلا یه اراهی که به صورت زیر تعریف بشه
کد:
int a[10];
کامپایلر نوع این متغییر رو اینگونه می بینه
کد:
int * const a;
 
بالا