علی نادری
علی نادری
خواندن ۱ دقیقه·۴ سال پیش

ارایه های دو بعدی در C اینبار با اشارگر ها !!!

این مبحث به نظر بسیار ساده است به طوری که می توان با چنین دستوری یک ارایه ساخت

char arr[100]; char arr2[100][100]; // 2D array

اما چنین کدی نیز مشکلاتی به همراه دارد مثلا اگر از ارایه برای یک رشته به طول 100 استفاده شود

ولی در ان رشته ای به طول 20 نوشته شود 80 خانه بی استفاده می ماند

و یا اگر ارایه ای به طول 104857600 بسازید ممکن است با خطای Segmentation fault رو به رو شوید

پس چاره کار چیست ؟

معمولا برای حل این مشکل از توابع malloc و calloc استفاده میشود که بخش از حافظه را گرفته و اشاره گری به اول ان را باز می گردانند

و می شود به راحتی از ان به اعنوان یک متغیر یا ارایه استفاده کرد
اما چطور می توان از این حافظه به صورت یک ارایه دو بعدی استفاده کرد ؟

این فرمول را شاید بعضی افراد بدانند اما بنده باز هم توضیح می دهم

درک ارایه دو بعدی

به نظر ما ارایه دو بعدی شبیه ماتریس زیر است

ماتریس ارایه دو بعدی
ماتریس ارایه دو بعدی

اما برای کامپیوتر اینگونه نیست و در اصل قرار گیری ارایه در حافظه به این شکل است

ارایه دو بعدی در حافظه
ارایه دو بعدی در حافظه

شاید حالا خودتان هم فکر هایی کرده باشید و شاید به نتیجه درست رسیده باشین !

درست است. با یک محاسبه اشارگری ساده می توان به ایندکس های ارایه دسترسی پیدا کرد

*(&arr[0][0] + MAX_X*y +x)

این یک شماتیک کلی از فرمول است

مثلا :

char *array = malloc(100);

در اینجا با استفاده از malloc مقدار 100 خانه از حافظه را گرفته ایم

ولی مقدار MAX_X و ... را از کجا بیاریم ؟

وقتی 100 خانه از حافظه را میگیرید می تواندی یک ارایه که طول مضرب 100 را بسازید

مثلا 1 در 100 یا 2 در 50 یا 4 در 25 یا 5 در 20 یا ...

به طور نمونه ارایه ای به ابعاد 4 در 25 می سازیم

y=4

x = 25

for(int y=0; y<4;y++){ for(int x=0;x<25;x++){ *(array + 25*y + x) = 1; } }

می توان به این صورت از ارایه استفاده کرد مثلا در دو حلقه تو در تو

توجه بعضی افراد در ارسال ارایه ها به فانکشن ها و return ان ها مشکل دارند و با این روش می توانند به راحتی و با سرعت بیشتر این کار را بکنن به طوری که نقطه 0 یا همون اشاره گر ساخته شده توسط malloc به فانکشن به اعنوان یک اشاره گر بفرستند

توضیح اضافه نمی دهم

نکته می توانید ابعاد ارایه را هر وقت خواستین عوض کنید اونم فقط با تغییر MAX_X و MAX_y در هر مکان یا کلا با relloc ابعاد ارایه را تغییر داد

مثلا برای ساخت base64 در C می توان کاراکتر را به صورت 8 اکتد در حافظه قرار داد و بعد به صورت 6 اکتد خواند و درصورت نیاز در نهایت padding را قرار داد

https://github.com/khod-naderi/C/blob/master/games/game_of_life.c

نمونه

cارایه2d
اگه خواستی می تونیم با khod.naderi@gmail.com با هم در ارتباط باشیم ;)
شاید از این پست‌ها خوشتان بیاید