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

آرايه ها

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
سلام
هيچ وقت نميشه يه آرايه رو توسط assignement oprator( = ) به آرايه ي ديگه انتساب داد يعني اين كد اشتباهه
کد:
int a[ 4 ];
int b[ 4 ];
a  = b;
حالا با توجه به مطالب بالا و كد زير ميخوام بدونم چرا خطي كه با *** مشخص شده باعث ارور نميشه و كد زير به راحتي اجرا ميشه؟:(
کد:
#include <iostream>

sing std::cout;
using std::endl;

#include <conio.h>

void arr( int [], int );

int a[ 4 ] = { 0 };

int main()
{
	cout << "Array a is : \n";
	for ( int i = 0; i < 4; i++ )
		cout << a[ i ] << " ";
	cout << endl;
	int b[ 4 ] = { 1, 2, 3, 4 };
	cout << "Array b is : \n";
	for ( int i = 0; i < 4; i++ )
		cout << b[ i ] << " ";
	cout << endl;
	arr( b, 4 );
	cout << "Array b is : \n";
	for ( int i = 0; i < 4; i++ )
		cout << b[ i ] << " ";
	cout << endl;

	_getch();
	return 0;

}

void arr( int c[], int s )
{
	cout << "Array c is : \n";
	for ( int i = 0; i < 4; i++ )
		cout << c[ i ] << " ";
	cout << endl;
	*** c = a;
	cout << "Array c is : \n";
	for ( int i = 0; i < 4; i++ )
		cout << c[ i ] << " ";
	cout << endl;

}
 

aftab110

کاربر تازه وارد
تاریخ عضویت
25 ژوئن 2006
نوشته‌ها
37
لایک‌ها
0
توجه داريد كه ما كدي مي نويسيم كه مورد قبول كامپايلر باشد.
يعني هر چه كامپايلر قبول كند ، حكم قانون را دارد.
ولي كامپايلرها در بعضي نكات يكسان عمل نمي كنند.

احتمالا نياز بوده چنين اجازه اي داده شود و كاربردهايي دارد.
با استفاده از اشاره گرها ، مكانيسم موضوع را بررسي كنيد. ولي شايد اشاره گر از نوع دور لازم باشد به علت تفاوت احتمالي قطعه ها در محل ذخيره متغيرهاي گلوبال و منطقه اي.
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
توي ويژوال سي پلاس پلاس انتساب يه آرايه به آرايه ي ديگه باعث ارور ميشه حالا چرا وقتي يه آرايه رو به يه تابعي ميفرستم اجازه دارم يه آرايه رو به آرايه ي فرستاده شده انتساب بدم بدون هيچگونه اروري؟!
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از sasan_66 :
توي ويژوال سي پلاس پلاس انتساب يه آرايه به آرايه ي ديگه باعث ارور ميشه حالا چرا وقتي يه آرايه رو به يه تابعي ميفرستم اجازه دارم يه آرايه رو به آرايه ي فرستاده شده انتساب بدم بدون هيچگونه اروري؟!
سلام

اگه اشتباه نکنم این c که شما در تابع استفاده کردید یک نوع اشاره گر هست وقتی دستور
c=a
رو اجرا می کنید آدرسی که در اشاره گر a رو به اشاره گر c می دهد. تا اونجاییکه من می دونم تمام آرایه ها اشاره گر هستند و دستور
a[2]=1
رو به اینصورت
کد:
*(a+2)=1
می بینند. پس عجیب نیست وقتی که به دستور c=a می رسه فقط اشاره گره c رو با آدرسی که در اشاره گر a هست مقدار دهی می کنه.
 

apache**

کاربر تازه وارد
تاریخ عضویت
15 جولای 2006
نوشته‌ها
26
لایک‌ها
0
محل سکونت
Tehran
سلام

در زبان C که مادر ++C به حساب میاد تعریف دوگانه ای از آرایه موجوده :

مثلاً آرایه دو بعدس به اسم S رو به دو شکل زیر میشه تعریف کرد:



[]s
یا
*s

تفاوت این دو در چیه؟

1- برای تعریف اول تعیین طول آرایه اجباری است یا باید آن را initialize کرد.
2- آدرس خانه اول در تعریف اول تعیین میشه و در S ذخیره میشه .

حالا اگر دو آرایه از دو نوع تعریف داشته باشیم میتونیم تعریف نو اول و منتسب کنیم به دومی یعنی تعریف
دوم در سمت چپ علامت = باشه!

برای عضو گیری برای آرایه هایی با تعریف نوع دوم یه کم مشکل داریم مثلاً در C مجبوریم برای دوری از
segmentation fault!!!!
از تابع malloc استفاده کنیم!

حالا برخورد تابع با آرایه های آرگومانی!

وقتی که ما یک آرایه رو به آرگومان یک تابع می دیم دید تابع از اون یک دید از نوع تعریف دوم بالاست
پس کاری که شما درون تابع می کنی دقیقاً همون انتساب نوع اول به نوع دومه که بالا گفتم!
موفق باشی!
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
تا اونجاییکه من می دونم تمام آرایه ها اشاره گر هستند
صد البته كه آرايه ها اشاره گرند منتها اشاره گر ثابت !! اشاره گر ثابت هم نيمتونه به جايي غير از اونجايي كه دفعه اول به اون اشاره كرده اشاره كنه
c = a; يعني آدرس جايي كه a داره به اونجا اشاره ميكنه رو انتساب بده به c و بعد از اين انتساب c به همون جايي اشاره كنه كه a به اونجا اشاره مي كنه اين حرفا زماني ميتونن درست باشن كه c يه اشاره گر باشه در حالي كه c يه آرايه يا همون اشاره گر ثابته و چون c هنگام تعريف با b (آرگومان تابع) initialize شده پس در طول برنامهc نميتونه به جايي غير از b اشاره كنه! وجود دستوري مثل b= a; در خود تابع main باعث بروز ارور ميشه
حالا اگه حرفايي رو كه بالا گفتم درسته ( اشاره گر ثابت ) چرا انتساب يه آرايه ي global (a( به يه آرايه ي ديگه كه به عنوان پارامتر به تابعي فرستاده ميشه باعث بروز هيچ اروري نميشه:blink: :(
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
وقتی که ما یک آرایه رو به آرگومان یک تابع می دیم دید تابع از اون یک دید از نوع تعریف دوم بالاست
پس کاری که شما درون تابع می کنی دقیقاً همون انتساب نوع اول به نوع دومه که بالا گفتم!
ولي من تو كتاب ديتل خوندم توابعي كه به عنوان آركومان به تابع فرستاده ميشن كامپايلر اونا رو به چشم اشاره گر ثابت ميبينه نه اشاره گر خالي!
 

apache**

کاربر تازه وارد
تاریخ عضویت
15 جولای 2006
نوشته‌ها
26
لایک‌ها
0
محل سکونت
Tehran
البته من در کتاب کرنیگان که خودش طراح syntax این زبانه
اینجوری خوندم!
شاید پلاس پلاس با C فرق کنه ولی من کتاب رو بزودی برات میفرستم!:blink:
 

apache**

کاربر تازه وارد
تاریخ عضویت
15 جولای 2006
نوشته‌ها
26
لایک‌ها
0
محل سکونت
Tehran
این کتاب اصول C رو بطور خفنی یاد آدم میده!
 

فایل های ضمیمه

  • CBook.ZIP
    262.2 KB · نمایش ها: 6

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
apache**از بابت كتاب ممنونم ولي هنوز مشكلم حل نشده:(
 

hamun

کاربر تازه وارد
تاریخ عضویت
3 می 2006
نوشته‌ها
76
لایک‌ها
1
سن
39
محل سکونت
karaj
به نقل از sasan_66 :
apache**از بابت كتاب ممنونم ولي هنوز مشكلم حل نشده:(

dar arguman vaghti ye array tarif mikoni masalan int c[]; hich makani baraye un dar nazar gerefte nemishe
va zamani ke tabe tarif mishe compailer un ro be cheshme int *c; mibine va adresse arraye ro tush mizare
dar vaghe arraye jadidi tarif nashode va shoma faghat ye pointer be arrayatun darin ke const ham nist
agar motmaen nistid mitunid az darsture typeof ke dar linux mojude estefade konid ]
man emtehan kardam noee c int * bud na int const *
bye
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
typeof چيكار ميكنه ؟ توي visual c++ نيست؟
 

apache**

کاربر تازه وارد
تاریخ عضویت
15 جولای 2006
نوشته‌ها
26
لایک‌ها
0
محل سکونت
Tehran
خوب در C دو نوع صدا کردن متغیر ها رو داریم :

call by value
call by refference

نوع اول برای متغیر های ساده مثل int و char و ....

نوع دوم برای array و در برخی جاها structure و Union ها!

برای اینکه بتونیم آرایه رو به تابع بدیم نمیتونیم ازش کپی درست کنیم چون در C اندازه array در
بلاک خودش موجوده!

وقتی می خواهیم آرایه رو به تابع پاس بدیم فقط اشاره گر به خونه اولش به تابع داده میشه واسه همین توابع
ما که با آرایه کار دارن void هستن و معمولاً طول آرایه هم به عنوان یه آرگومان به تابع داده میشه!

اگر برنامه بالایی که خودت نوشتی رو تست کنی میبینی که آرایه ای که تو تابع عوضش کردی هیچ تغییری
نکرده !! من اینجوری پیش بینی می کنم!

موفق باشی!:f34r:
 

hamun

کاربر تازه وارد
تاریخ عضویت
3 می 2006
نوشته‌ها
76
لایک‌ها
1
سن
39
محل سکونت
karaj
typeof faghat tuye g++ tarig shode
bye
 
بالا