PDA

View Full Version : تعریف lenght یک ارایه global بعد از تابع main



hosseinghaheri
یک شنبه 28 خرداد 1396, 13:13 عصر
سلام خدمت دوستان.
من در زبان c یک ارایه دوبعدی از نوع char دارم که به صورت زیر تعریف کردم.


char myarray[1000][18];


بعد دوم ارایه همیشه شامل 18 المنت هست.
اما بعد اول ماکزیمم المنتش 1000 تا هست.
در صورتی که گاهی اوقات فقط در حد 2 یا 3 المنت (از بعد اول) نیاز هست . و تعریف 1000 المنت واسش فقط حافظه رو پر میکنه (+ توی اسکن کردن ارابه هم به شدت زمان تلف میکنه.)
فرض کنید من تعداد المنتی که نیاز دارم را در متغیری به نام k ذخیره کردم. حالا میشه به صورت char myarray[k][18] ارایه را تعریف کرد.
اما مشکلی که هست اینه که متغیر k تو تابع main مقدار دهی میشه.
از طرفی ارایه ی من global هست و نمیتونم توی main تعریفش کنم.
+ امکان استفاده از پوینتر ها را هم ندارم.

ممنون میشم راهنمایی کنید.

m.r226
جمعه 02 تیر 1396, 11:41 صبح
تا جایی که من میدونم این کار شدنی نیست
آرایه یا ابعادش ثابته که میتونی همونطور که خودتون نوشتین، تعریفش کنین البته این روش هم یه محدودیت داره. شما نمیتونی به هر اندازه دلخواه از حافظه بگیری چون در این روش از حافظه پشته استفاده می کنی که محدودیت داره.

مورد دوم اینه که ابعاد آرایه متغیر باشه که شما باید از malloc استفاده کنی. malloc اشاره گر نیست بلکه مکانیزمی برای گرفتن حافظه از heap هست.
اگر ابعاد آرایه در زمان کامپایل مشخصه از این روش میتونید استفاده کنید:




#define ROWS ...
#define COLS ...

int (*arr)[COLS] = malloc(sizeof *arr * ROWS);
if (arr)
}
do stuff with arr[i][j] //
free(arr)
{

}اگر ابعاد آرایه در زمان کامپایل مشخص نباشه و شما از کامپایلر C99 و C2011 استفاده میکنید، از این روش استفاده کنید

size_t rows, cols;
assign rows and cols//
int (*arr)[cols] = malloc(sizeof *arr * rows);
if (arr)
}
do stuff with arr[i][j]//
free(arr);
{

اگر ابعاد آرایه در زمان کامپایل مشخص نباشه و شما از کامپایلر C99 و C2011 استفاده نمیکنید، از این روش استفاده کنید


size_t rows, cols;
// assign rows and cols
int *arr = malloc(sizeof *arr * rows * cols);
{
// do stuff with arr[i * rows + j]
free(arr);
}