انواع متغیر در زبان برنامه نویسی C

توسط | 12 اسفند, 1398 | برنامه نویسی | 32 دیدگاه ها

انواع متغیرها در زبان C، تعریف انواع متغیر در زبان C، انواع متغیر در نرم افزار کدویژن و نرم افزار Keil، آرایه و رشته در زبان برنامه نویسی C، انواع متغیر استراکچر (Structure) و یونیون (union)، typedef در زبان C، متغیر نوع volatile، متغیرهای عمومی (Global)، متغیرهای محلی (Local)
انواع-متغیر-زبان-c-cpp

انواع متغیر زبان برنامه نویسی C بیانگر دو مشخصۀ متغیر تعریف شده است. اول: انواع متغیر بیان کنندۀ محدودۀ تغییرات متغیر و تعداد بیت هایی است که در حافظه برای ذخیرۀ متغیر در نظر گرفته می شود. دوم: انواع متغیر تعیین می کند که متغیر، می تواند عددِ صحیح علامت دار یا بدون علامت، عدد اعشاری و یا کاراکتر باشد. یعنی وقتی می خواهیم متغیری را تعریف کنیم باید محدوده و نوع آن را با تعیین انواع متغیر، مشخص کنیم. به عنوان مثال می خواهیم متغیری داشته باشیم که مقدار آن بین اعداد 0 تا 1000 تغییر می کند، بنابراین باید از انواع متغیر، نوع متغیر Unsigned int را برای آن تعیین می کنیم که با این کار، 16 بیت از حافظه برای این متغیر در نظر گرفته می شود و این متغیر می تواند از صفر تا 65536 تغییر کند (که مقدار 0 تا 1000 را پوشش می دهد). همچنین با نوشتن Unsigned تعیین کردیم که این متغیر بدون علامت یعنی فقط اعداد مثبت است. در ادامه تعریف متغیر در زبان C و نکات مربوط به تعریف متغیرها و محدودۀ تغییرات انواع متغیر بیان می شود.

تعریف انواع متغیرها در زبان C

در زبان برنامه نویسی C انواع متغیرها به صورت زیر تعریف می شوند. ابتدا (از سمت چپ)نوع متغیر از انواع متغیر انتخاب می شود، سپس نام متغیر و در نهایت مقدار اولیۀ متغیر می آید.

مقدار اولیه  = نام متغیر      نوع متغیر ;

برای تعریف متغیرها باید به نکات زیر توجه کرد:

  1. برای نام گذاری متغیرها در زبان C می توانیم ازترکیب حروف انگلیسی بزرگ و کوچک یعنی A تا Z و A تا Z و اعداد و همچنین آندرلاین (_) استفاده کنیم؛
  2. نام متغیر نمی تواند با عدد شروع شود؛
  3. حداکثر طول نام متغیرها 31 کاراکتر است؛
  4. نام متغیرها نباید از کلمات رزرو شده باشد؛
  5. توصیه می شود که نام گذاری متغیر ها طوری باشد که از نام آنها بفهمیم که چه عملکردی دارند.

متغیر ها در هنگام تعریف شدن می توانند مقدار دهی اولیه نشوند. به مثال های زیر توجه کنید:

int x1 , x2 , y1 , y2;
int Loop_counter_1;
unsigned char Key_Press_tatus=0 , Freq=50;
float temperature=15.5 , humidity=25.0;
float dictance1 , distance2;
bit SMOKE_STATUS=0;
char first_char='A';
int I2C_Received_data_status=0;

انواع متغیر در زبان برنامه نویسی C

انواع متغیر در زبان C برای نرم افزارهای کدویژن و Keil به صورت جداول 1 و 2 است. انواع متغیر ممکن است در نرم افزارهای مختلف نام های مختلف داشته باشند. همچنین در نرم افزار های مختلف ممکن است انواع متغیر دارای محدوده و اندازه ای متفاوت باشد. در جدول زیر انواع متغیر را در نرم افزار کدویژن می بینیم.

محدودۀ تغییرات متغیر اندازه بر حسب بیت انواع متغیرها در کدویژن
0 , 1 1 bit, _Bit
0 , 1 8 bool, _Bool
-128 to 127 8 char
0 to 255 8 unsigned char
-128 to 127 8 signed char
-32768 to 32767 16 int
-32768 to 32767 16 short int
0 to 65535 16 unsigned int
-32768 to 32767 16 signed int
-2147483648 to 2147483647 32 long int
0 to 4294967295 32 unsigned long int
-2147483648 to 2147483647 32 signed long int
±1.175e-38 to ±3.402e38 32 float
±1.175e-38 to ±3.402e38 32 double

جدول 1 – انواع متغیر در زبان C، نرم افزار کدویژن

در جدول زیر انواع متغیر در نرم افزار Keil را می بینیم.

محدودۀ تغییرات متغیر اندازه بر حسب بایت اندازه بر حسب بیت انواع متغیر در Keil
0 to 255 (unsigned) by default. 1 (byte-aligned) 8 char
–128 to 127 (signed) when compiled with –signed_chars.
–128 to 127 1 (byte-aligned) 8 signed char
0 to 255 1 (byte-aligned) 8 unsigned char
–32,768 to 32,767 2 (halfword-aligned) 16 (signed) short
0 to 65,535 2 (halfword-aligned) 16 unsigned short
–2,147,483,648 to 2,147,483,647 4 (word-aligned) 32 (signed) int
0 to 4,294,967,295 4 (word-aligned) 32 unsigned int
–2,147,483,648 to 2,147,483,647 4 (word-aligned) 32 (signed) long
0 to 4,294,967,295 4 (word-aligned) 32 unsigned long
–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 8 (doubleword-aligned) 64 (signed) long long
0 to 18,446,744,073,709,551,615 8 (doubleword-aligned) 64 unsigned long long
1.175494351e-38 to 3.40282347e+38 (normalized values) 4 (word-aligned) 32 float
2.22507385850720138e-308 to 1.79769313486231571e+308 (normalized values) 8 (doubleword-aligned) 64 double
2.22507385850720138e-308 to 1.79769313486231571e+308 (normalized values) 8 (doubleword-aligned) 64 long double
Not applicable. 4 (word-aligned) 32 All pointers
false or true (0 or 1) 1 (byte-aligned) 8 _Bool

جدول 2 – انواع متغیر در زبان C، نرم افزار Keil

بنابراین می توان فهمید در نرم افزارهای مختلف انواع متغیر نوع صحیح چند بایت فضا اشغال می کند، انواع متغیرهای مختلف چه نام هایی دارند و … . برای مشاهدۀ انواع متغیرهایی که نرم افزار پشتیبانی می کند به Help نرم افزار بروید و عبارت Data types را سرچ کنید. برای مثال در تصویر زیر  برای نرم افزار کدویژن این کار را کرده ایم.

انواع-متغیر-کدویژن-زبان-برنامه-نویسی-c

تصویر 1 – انواع متغیر در Help نرم افزار کدویژن

نکات مربوط به انواع متغیر در زبان برنامه نویسی C

در بخش قبلی انواع متغیر در زبان C را بیان کردیم. در این بخش به بررسی چند نکته مربوط به انواع متغیرها در زبان C می پردازیم:

  • در برخی کامپایلرها نوع متغیر bit با نام flag است.
  • در برخی کامپایلرها باید به جای char بنویسیم byte.
  • در زبان C یک کلمه یعنی Word برابر چهار بایت است. بنابراین به int می گویند: Half word.
  • متغیر double ویژگی های float را دارد. اما در بعضی نرم افزارها اندازۀ آن فرق می کند. برای مثال در کدویژن دارای اندازۀ 32 بیتی و در Keil دارای اندازۀ 64 بیتی است.
  • نوع متغیر double از انواع متغیر در نرم افزار کدویژن در نسخۀ Professional آن قابل دسترسی است.

آرایه ها در زبان برنامه نویسی C

آرایه ها مجموعه ای از متغیرهای هم نوع هستند. در کاربردهایی نیاز داریم که چند متغیر از یکی از انواع متغیر داشته باشیم. مثلاً می خواهیم تعداد ده دما را ذخیره کنیم. بنابراین به جای این که ده متغیر تعریف کنیم، یک آرایه تعریف می کنیم که ده عنصر داشته باشد و نوع عناصر را نیز از انواع متغیر انتخاب می کنیم. به این صورت داریم:

float temp[10];

عددی که در هنگام تعریف آرایه در کروشه قرار می گیرد، تعداد عناصر آرایه را مشخص می کند. آرایۀ تعریف شده دارای ده عنصر زیر است:

temp[0] , temp[1] , temp[2] , temp[3] , temp[4] , temp[5] , temp[6] , temp[7] , temp[8] , temp[9]

که هر کدام از آنها می توانند یک عدد float را در خود جای دهند. در اینجا اعدادی که در کروشه نوشته شده است، اندیس عناصر آرایه هستند. یک آرایۀ n عنصری دارای n اندیس است که از صفر تا n-1 شماره گذاری می شوند و بیانگر مکان عناصر در آرایه هستند.

مقدار دهی به عناصر آرایه

می توان در هنگام تعریف آرایه ها و تعیین نوع آنها از انواع متغیرها، آنها را مقدار دهی اولیه کرد. برای مثال:

int counter[4] = { 1 , 10 , 100 , 1000};

در این صورت داریم:

counter[0] = 1;
counter[1] = 10;
counter[2] = 100;
counter[3] = 1000;

یعنی عنصر صفرم برابر 1، عنصر یک برابر 10، عنصر دوم برابر 100 و عنصر سوم برابر 1000 است.

در حین برنامه نیز با این روش عناصر آرایه را مقدار دهی می کنیم:

counter[2]=49;

بنابراین عنصر دوم آرایۀ counter که 100 بود، برابر 49 می شود.

آرایه

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

اگر هر یک از عناصر آرایۀ یک بعدی (که در بخش قبل توضیح داده شد)، خود یک آرایه باشد، آرایۀ دو بعدی شکل می گیرد.

unsigned int position[4][3]={{0,1,10},{20,15,120},{400,800,500},{1000,2000,3000}};

که مقادیر عناصر این آرایه برابر است با:

position[0][0] = 0
position[0][1] = 1
position[0][2] = 10
position[1][0] = 20
position[1][1] = 15
position[1][2] = 120
position[2][0] = 400
position[2][1] = 800
position[2][2] = 500
position[3][0] = 1000
position[3][1] = 2000
position[3][2] = 3000

اگر بخواهیم در حین برنامه مقدار عنصری از آرایه را تغییر دهیم، به این صورت عمل می کنیم:

position[3][1] = 1800;

بنابراین داریم:

آرایه-دو-بعدی


ویدئوی 1 – ارسال آرایه به تابع در زبان C

کاراکترها در زبان C

هرکدام از انواع متغیر که بیان شد، دارای ماهیت عددی بود. متغیرها نمی توانند بیانگر کاراکتر باشند. بنابراین کدهای ASCII برای تعریف کاراکترها معرفی شده اند. کدهای ASCII به هر کاراکتر یک عدد اختصاص می دهند. این عددها از صفر تا 127 هستند. با وجود این که کدهای ASCII بین صفر تا 127 هستند، یعنی 7 بیت، ولی برای تعریف کاراکتر باید آن را از نوع char از انواع متغیر تعریف کرد. بنابراین متغیر نوع char در زبان C هم برای تعریف اعداد صحیح 8 بیتی و هم برای تعریف کاراکتر است. در تعریف کاراکتر باید آن را در بین دو تا کوتیشن ( ‘ ) قرار دهیم.

char first_character = 'A' , second_character = 'B';
char a1 = 'c';

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

رشته آرایه ای از کاراکترهای پشت سر هم است. برای تعریف رشته ها کافی است یک آرایه تعریف کنیم که نوع آن از انواع متغیر، char باشد. رشته را می توان مانند آرایه ها تعریف کرد و هنگام تعریف کردن آن، مقدار دهی اولیه کرد. می توان به آن مقدار اولیه نداد. همچنین باید توجه داشت که عددی که در کروشه هنگام مقدار دهی به رشته ها نوشته می شود، یعنی عددی که بیانگر تعداد کاراکترهای رشته است، باید حداقل یک واحد از تعداد کاراکترهای رشتۀ تعریف شده بیشتر باشد. دلیل این امر آن است که در آخرین جایگاه رشته، کاراکتر Null (یعنی کاراکتر /0) قرار می گیرد و این کاراکتر بیان کنندۀ انتهای رشته است.

char lcd_str[20];
char name[5] = {'R','E','Z','A'};
char family[6] = "ASADI";

همان طور که مشاهده می شود، در تعریف رشته ها پس از تعیین نوع char از انواع متغیر، نام رشته و تعداد کاراکترهای آن (بعلاوه 1)، مقدار دهی اولیه می تواند انجام شود. که این مقدار دهی می تواند به دو صورت باشد. یکی با تعریف شبیه آرایه ها و قرار دادن کاراکترها در دو عدد کوتیشن (‘). و دیگری قرار دادن کل رشته در دو عدد دابل کوتیشن (“). همان طور که می بینید، تعداد عناصر یک واحد بیشتر از تعداد کاراکترهای رشته در نظر گرفته شده است.

انواع متغیر، استراکچر (Structure)

استراکچر (Structure) یا ساختمان یا ساختار می تواند چند نوع از انواع متغیر را تحت نامی واحد به صورت یکجا تعریف کند. به این صورت می توان گفت متغیری با نوع جدید از انواع متغیر ساخته می شود. برای مثال اگر بخواهیم سه دادۀ طول، عرض و ارتفاع را به صورت استراکچر ذخیره کنیم، داریم:

struct POSITION {
	float x;
	float y;
	unsigned int z;
	unsigned char distance;
	} pos1 , pos2;

در استراکچر بالا عبارات float x و float y … تا unsigned int distance هر کدام اعضای استراکچر هستند. عبارت زیر نوع متغیر جدید است که از انواع متغیر ساخته شده است:

{
	float x;
	float y;
	unsigned int z;
	unsigned char distance;
}

یعنی این عبارت خود نوعی از انواع متغیر می شود. عبارات pos1 و pos2 نیز متغیرهایی با نوعی هستند که توسط استراکچر به وجود آمده است. استراکچر را می توان به صورت زیر نیز تعریف کرد (مثال).

struct BOOK_FEATURES{
	char name[100];
	char year[5];
	char author[50];
	unsigned char num_of_page;
	float weight;
	};

این استراکچر اکنون هیچ فضایی از حافظه اشغال نمی کند و صرفاً بیان کنندۀ یک نوع جدید از انواع متغیر است. حال می توان یک یا چند متغیر با این نوع از انواع متغیر تعریف نمود:

struct BOOK_FEATURES book1 , book2 , book3;

بنابراین نوع متغیر book1 و book2 و book3 از انواع متغیر، می شود مجموعه ای از انواع متغیرها:

{
	char name[100];
	char year[5];
	char author[50];
	unsigned char num_of_page;
	float weight;
}

برای مقدار دهی به اعضای استراکچر باید به روش زیر عمل کرد:

book1.num_of_page=120;
book2.weight=0.78;

استراکچر آرایه ای

می توان متغیرهای استراکچر را به صورت آرایه ای تعریف کرد.

struct BOOK_FEATURES book[3];

که مقدار دهی به اعضای آن به صورت زیر است:

book[0].num_of_page=120;
book[1].weight=0.78;

نوع دیگر تعریف استراکچر آرایه ای نیز به صورت زیر است:

struct BOOK_FEATURES{
	char name[100];
	char year[5];
	char author[50];
	unsigned char num_of_page;
	float weight;
}book[3];

که در اینجا نیز مقدار دهی مانند قبلی است.

استفاده از typedef در زبان برنامه نویسی C

typedef یک قابلیت از زبان C است که با استفاده از آن می توان کدهای قابل حمل ساخت. همان طور که گفته شد، ممکن است در نرم افزارهای مختلف انواع متغیر نامی متفاوت داشته باشند. حال می خواهیم برنامه ای بنویسیم که در نرم افزارهای مختلف به کار گرفته شود. بنابراین باید از قابلیت typedef استفاده کنیم.

typedef char my_char

از این به بعد در طول برنامه متغیرهای نوع char از انواع متغیرا به این صورت تعریف می کنیم:

my_char a=10;

که بیان کنندۀ این است که a یک متغیر از نوع char از انواع متغیر است. چون char را در ابتدای برنامه typedef کردیم به my char. حال اگر برنامه را به نرم افزار دیگری ببریم که نوع char از انواع متغیر، نام دیگری مثلاً byte داشته باشد، کافی است byte را به my char در ابتدای برنامه typedef کنیم.

typedef byte my_char

در این صورت هر  جای برنامه که متغیر از نوع my char تعریف شده باشد، از نوع byte محسوب می شود.

my_char a=10;

اکنون متغیر a از نوع byte است. همانطور که گفته شد در برخی نرم افزارها byte از انواع متغیر و معادل char است.

چگونه استراکچر را typedef کنیم؟

می توان استراکچرها را typedef کرد. چون استراکچر یک نوع متغیر جدید از انواع متغیر می سازد و خود نوعی جدا محسوب می شود، می توان آن را typedef کرد.

typedef struct {
	char name[100];
	char year[5];
	char author[50];
	unsigned char num_of_page;
	float weight;
} BOOK_FEATURES;

اکنون نوع متغیر زیر را به BOOK FEATURES یعنی نام اصلی استراکچر typedef کردیم.

{
	char name[100];
	char year[5];
	char author[50];
	unsigned char num_of_page;
	float weight;
}

بنابراین از این پس برای تعریف متغیر از این نوع، کافی است نامی را بیاوریم که این نوع، به آن typedef شده است:

BOOK_FEATURES book1 , book2 , book3;

و یا به صورت آرایه ای:

BOOK_FEATURES book[3];

یونیون ها در زبان برنامه نویسی C

اگر بخواهیم در یک مکان از حافظه چند نوع متغیر از انواع متغیر را ذخیره کنیم، از یونیون ها استفاده می کنیم. در این کاربرد، فضایی که از حافظه اشغال می شود، برابر است با فضایی که توسط بزرگترین نوع از انواع متغیر اشغال می شود و این فضا برای همۀ اعضای یونیون مشترک است. تعریف یونیون ها شبیه استراکچرهاست، ولی به جای کلمۀ کلیدی struct باید از کلمۀ کلیدی union استفاده کنیم.

union DIST{
	unsigned char low_byte;
	unsigned int distance;
	}dist;

ویدئوی 2 – قوانین Cast در استاندارد MISRA C

انواع متغیر در زبان C، متغیر نوع volatile

همان طور که در نوشتۀ «کلاس حافظه در C و C++» توضیح دادیم، این کلمۀ کلیدی ممکن است در کامپایلرهای مختلف عملکرد متفاوتی داشته باشد. اما می توان گفت که استفاده از این کلمۀ کلیدی در تعریف متغیر باعث می شود که نرم افزار در بهینه کردن (optimize) برنامه از این متغیر صرف نظر کند. یعنی آن را بهینه نکند. کامپایلر هنگام بهینه سازی برنامه ممکن است در برخی موارد به اشتباه یک متغیر را حذف کند و یا مقدار آن را تغییر دهد. وقتی کلمۀ volatile را در تعریف متغیر استفاده می کنیم، کامپایلر عملیات بهینه سازی را برای این متغیر انجام نمی دهد. بنابراین متغیری که در تعریف آن از volatile استفاده شده حذف نمی شود و همواره مقداری معتبر دارد. مقدار آن نیز آخرین مقداری است که در برنامه (در توابع و یا در روتین های وقفه) در آن قرار گرفته است.

یک اتفاق دیگر نیز ممکن است بیفتد. در زبان اسمبلی اگر برنامه بخواهد عملیاتی روی یک متغیر که در SRAM قرار دارد انجام دهد، باید ابتدا آن را به حافظۀ رجیستر انتقال دهد و سپس عملیات مورد نظر را انجام دهد. اگر در جای دیگری از برنامه این متغیر فراخوانی شود، مقدار آن از حافظۀ رجیسترها خوانده می شود. ولی ممکن است توسط یک پردازش دیگر، مقدار متغیر در SRAM تغییر کرده باشد. بنابراین مقدار موجود در حافظۀ رجیستر معتبر نخواهد بود. برای جلوگیری از چنین خطایی باید در تعریف متغیر از volatile استفاده شود. تا هر وقت برنامه بخواهد عملیاتی روی آن انجام دهد و یا آن را فراخوانی کند، مقدار آن مستقیماً از SRAM خوانده شود.

گاهی برنامه ای داریم که قرار است در روتین های وقفه، مقدار یک متغیر عمومی تغییر کند. در اینجا بهتر است از volatile استفاده کنیم. چون ممکن است کامپایلر با بهینه سازی مقدار متغیر را تغییر بدهد و یا آن را حذف کند. به مثال زیر توجه کنید. در این برنامه هر وقت مقدار a بیشتر از 50000 شود، برنامه از while خارج می شود. اگر volatile را نمی نوشتیم ممکن بود کامپایلر حین بهینه سازی متغیر را حذف می کرد  و یا مقدار آن را تغییر می داد و یا این که مقدار آن در رجیستر قرار می گرفت و خطایی که گفتیم اتفاق می افتاد. اما چون volatile را در تعریف متغیر استفاده کرده ایم هیچ کدام از موارد فوق اتفاق نمی افتد. همچنین بررسی شرط درون while توسط برنامه به این صورت است که مقدار a مستقیماً از SRAM خوانده می شود.

unsigned int a=0;

ISR(TIMER0_OVF_vect)
{
	a++;
}

int main (void)
{
	...
	while(a<=50000);
	...
}

ممکن است در تعریف متغیرهای محلی حتی اگر از کلاس حافظه رجیستر استفاده نکرده باشیم، کلاس حافظه رجیستر برای متغیرها در نظر گرفته شود. یعنی مثلاً ما میخواهیم یک متغیر با کلاس حافظه اتوماتیک در کدویژن تعریف کنیم. در این نرم افزار برای تعریف متغیر با کلاس حافظه اتوماتیک باید فقط نوع متغیر و نام آن نوشته شود و عبارت auto را نباید بنویسیم. در این صورت ممکن است کامپایلر، کلاس حافظه آن را از نوع رجیستر قرار دهد. برای جلوگیری از این خطا باید از volatile استفاده کنیم.

انواع متغیرها از لحاظ عمومی یا محلی بودن

در نوشتۀ کلاس های حافظه در C و C++، متغیرهای عمومی و محلی را به صورت زیر تعریف کردیم.

متغیرهای عمومی (Global)

این نوع متغیر در یک فایل و در بیرون از توابع نوشته می شود و برای توابع زیر آن متغیر در آن فایل و یا فایل های دیگر قابل شناسایی است. مقدار اولیۀ پیش فرض برای متغیرهای عمومی صفر است. اگر در یک تابع مقدار متغیر عمومی تغییر کند، در تابع دیگر که فراخوانی شود، مقدار آن تغییر نمی کند. به مثال زیر توجه کنید. متغیر a برای  توابع main، func1، func2 و func3 قابل شناسایی و دسترسی است. مقدار نهایی متغیر a در b ریخته می شود. مقدار a و b در نهایت برابر 10 می شود.

int a=0;

int main(void)
{
	int b=0;
       func1();
	func2();
	func3();
	b=a;
}

void func1(void)
{
       ...
       a=3;
       ...	
}

func2()
{
	...
	a=45;
	...
}

func3()
{
	...
	a=10;
	...
}

متغیرهای محلی (Local)

متغیرهایی که داخل تابع نوشته می شوند متغیرهای محلی هستند. این متغیرها تنها برای همان تابع قابل شناسایی و دسترسی اند. این متغیرها اگر مقداری نگیرند، مقداری نامشخص به آنها اختصاص می یابد. در مثال قبل متغیر b یک متغیر محلی است.

انواع متغیرها در زبان C را بررسی کردیم و نتیجه می گیریم:

  1. انواع متغیر در زبان C بیانگر دو مشخصۀ متغیر تعریف شده است. اول: انواع متغیر بیان کنندۀ محدودۀ تغییرات متغیر و تعداد بیت هایی است که در حافظه برای ذخیرۀ متغیر در نظر گرفته می شود. دوم: انواع متغیر تعیین می کند که متغیر، می تواند عددِ صحیح علامت دار یا بدون علامت، عدد اعشاری و یا کاراکتر باشد.
  2. نام گذاری متغیرها دارای نکاتی است که باید آنها را رعایت کنیم. در غیر این صورت کامپایلر خطا می دهد.
  3. در نرم افزار های مختلف ممکن است انواع متغیر دارای نام، محدوده و اندازه ای متفاوت باشد.
  4. در اغلب نرم افزارها می توان انواع متغیرهایی را که آن نرم افزار پشتیبانی می کند، از Help نرم افزار بدست آورد.
  5. در زبان C یک کلمه یعنی Word برابر چهار بایت است. بنابراین به int می گویند: Half word.
  6. آرایه ها مجموعه ای از متغیرهای هم نوع هستند.
  7. رشته آرایه ای از کاراکترهای پشت سر هم است.
  8. عددی که در کروشه هنگام مقدار دهی به رشته ها نوشته می شود، یعنی عددی که بیانگر تعداد کاراکترهای رشته است، باید حداقل یک واحد از تعداد کاراکترهای رشتۀ تعریف شده بیشتر باشد.
  9. استراکچر (Structure) یا ساختمان یا ساختار می تواند چند نوع از انواع متغیر را تحت نامی واحد به صورت یکجا تعریف کند و خود نوعی از انواع متغیر شود.
  10. در استراکچرها به ازای هر یک از اعضا در صورتی که متغیری نیز تعریف شود، فضایی از حافظه اشغال می شود.
  11. ممکن است در نرم افزارهای مختلف، انواع متغیر، نامی متفاوت داشته باشند، بنابراین typedef کردن انواع متغیر، ویژگی مهمی برای قابل حمل کردن برنامه است.
  12. اگر بخواهیم در یک مکان از حافظه چند نوع متغیر از انواع متغیر را ذخیره کنیم، از یونیون ها استفاده می کنیم.
  13. در تعریف یونیون ها، فضایی که از حافظه اشغال می شود، برابر است با فضایی که توسط بزرگترین نوع از انواع متغیر اشغال می شود و این فضا برای اعضای یونیون مشترک است.

آموزش های یوبرد مرتبط با این نوشته:

رضا اسدی

رضا اسدی

مدیر یوبرد، خالق و توسعه دهندۀ پلتفرم یوبرد، مجری پروژه های الکترونیکی، فعال در صنعت آسانسور، سابقه فعالیت در صنعت خودرو و همکاری در صنعت پزشکی و صنایع دیگر، آموزگار آموزش های یوبرد

آموزش زبان C و MISRA یوبرد

آموزش زبان C++ و MISRA یوبرد

خدمات برنامه نویسی میکروکنترلر یوبرد

انواع-متغیر-زبان-c-cpp

انواع متغیر در زبان برنامه نویسی C

انواع متغیرها در زبان C، تعریف انواع متغیر در زبان C، انواع متغیر در نرم افزار کدویژن و نرم افزار Keil، آرایه و رشته در زبان برنامه نویسی C، انواع متغیر استراکچر (Structure) و یونیون (union)، typedef در زبان C، متغیر نوع volatile، متغیرهای عمومی (Global)، متغیرهای محلی (Local)

ساخت-کتابخانه-c-cpp

نحوۀ ساخت کتابخانه در زبان برنامه نویسی C برای میکروکنترلرها

کتابخانه در زبان برنامه نویسی چیست؟ ساخت کتابخانه در نرم افزار CodevisionAVR، کتابخانه با پسوند h، کتابخانه با پسوند c، کتابخانه با پسوند h و c، فراخوانی کتابخانه، کاربرد دستور پیش پردازندۀ #ifndef در نوشتن کتابخانه، فراخوانی کتابخانه از پوشه های مختلف، ساخت کتابخانه در نرم افزار Keil

کلاس-حافظه-زبان-c-cpp

کلاس حافظه در C و C++

کلاس حافظه چیست؟ تعریف کلاس حافظه، کلاس حافظه در C و C++، حوزۀ تعریف متغیرها، طول عمر متغیرها، متغیرهای عمومی و محلی، کلاس حافظۀ اتوماتیک (Automatic)، کلاس حافظۀ رجیستر (Register)، کلاس حافظۀ Static محلی و عمومی، کلاس حافظۀ خارجی (External)، کلاس حافظۀ Mutable، کلمۀ کلیدی volatile

مقایسۀ برابری انواع float

در برنامه نویسی، عبارات floating-point نباید از نظر برابری یا نابرابری آزمایش شوند. ماهیت ذاتی انواع float به گونه‌ای است که مقایسۀ برابری آنها اغلب درست نخواهد بود. رفتار چنین مقایسه‌ای را نمی‌توان قبل از اجرا پیش‌بینی کرد و ممکن است از یک اجرا به اجرای دیگر متفاوت باشد. مثلاً نتیجۀ آزمایش if(x == y) وقتی که x و y از نوع float باشند، غیر قابل پیش‌بینی است.

استاندارد MISRA C، قانون 13.3

تاخیر میکروثانیه ای

تأخیرهایی در حد میکروثانیه و به صورت Non-blocking (یعنی تأخیری که کل سیستم را منتظر نگذارد) معمولاً توسط OSها یا پلتفرم‌ها ایجاد نمی‌شوند. زیرا برای این کار باید وقفۀ یک تایمر، حداقل هر یک میکروثانیه اتفاق بیفتد. وقفه‌ای با این سرعت و به صورت پیوسته، باعث افزایش بار پردازشی UPC می‌شود و در بسیاری از پروژه‌ها، معایب این موضوع بیشتر از مزایای آن است. نکات ارائه شده در ویدئوی پیوست کتابخانۀ Delay

توابع و داده های static

در تعریف و اعلان توابع و داده‌هایی که لینک داخلی دارند، یعنی تنها در یک فایل استفاده می‌شوند، باید از مشخص کنندۀ کلاس حافظۀ static استفاده شود. دلیل این موضوع این است که ممکن است دربارۀ این که متغیر یا تابعی، extern یا static است، ابهام به وجود بیاید. استفاده از کلمۀ static این ابهام را برطرف می‌کند.

استاندارد MISRA C، قانون 8.11

آرایه با کلاس حافظۀ خارجی

در زمانی که یک آرایه با کلاس حافظۀ extern اعلان می‌شود، تعداد اعضای آن باید به صورت صریح (قرار دادن عدد در براکت) یا به صورت ضمنی (مقداردهی اولیۀ اعضای آن) مشخص شود. اگرچه می‌توان آرایه‌ها را با کلاس ذخیره سازی extern، بدون مشخص کردن اندازۀ آنها اعلان کرد، اما در زمانی که امکان تعیین اندازۀ آرایه‌ها وجود دارد، انجام این کار ایمن‌تر است.
استاندارد MISRA C، قانون 8.12

کد مرده در برنامه نویسی

در هیچ جای برنامه نباید کد مرده وجود داشته باشد. هر کدی که حذف آن، تأثیری بر خروجی برنامه نگذارد، کد مرده است. برای مرور کنندۀ کد مشخص نیست که وجود این کد عمدی است یا به دلیل خطای برنامه نویس رخ داده است. از نمونه‌های کد مرده، کدهای درون ifی است که شرط آن هیچ‌گاه True نمی‌شود. در این صورت کدهای درون if هیچ‌گاه اجرا نمی‌شوند.

استاندارد MISRA C++، قانون 0-1-9

عملگرهای رابطه‌ای برای اشاره‌گرها

عملگرهای <، =<، > و => نباید برای اشاره‌گرها اعمال شوند، مگر در مواردی که اشاره‌گرها به یک آرایۀ یکسان اشاره می‌کنند. اگر دو اشاره‌گر به شیء یکسانی اشاره نکنند، تلاش برای مقایسه بین آنها، رفتار نامشخص ایجاد می‌کند.
استاندارد MISRA C++، قانون 5-0-18

مقداردهی متغیر قبل از خواندن

همۀ متغیرها قبل از استفاده باید مقدار مشخصی داشته باشند. بنابراین قبل از خوانده شدن، باید در آنها نوشت و لزوماً نیاز به مقداردهی اولیه در زمان اعلان نیست. متغیر با مدت زمان ذخیرۀ استاتیک، اگر مقداردهی اولیه نشود، به طور خودکار صفر می‌شود. در عمل، بسیاری از محیط‌های امبدد این کار را نمی‌کنند. متغیر با مدت زمان ذخیرۀ اتوماتیک هم معمولاً به طور خودکار مقداردهی اولیه نمی‌شود. سازنده‌های کلاس هم باید همۀ اعضای غیر ثابت کلاس را مقداردهی اولیه کنند.
استاندارد MISRA C++، قانون 1-5-8

32 دیدگاه ها

  1. سلام ، مهندس شما فوق‌العاده اید ممنون ، بسیار کاربردی بود

    پاسخ
    • سلام. خیلی ممنون. خیلی لطف دارید. خواهش میکنم. موفق و پیروز باشید

      پاسخ
  2. سلام یه سوال تو چه ارایه ای من میتونم کلمه مثلا hello رو ذخیره کنم؟

    پاسخ
    • سلام. میتونید تو آرایه ای از نوع char به این صورت ذخیره کنید:

      char str[6] = “Hello”;

      یا:

      char str[6] = {‘H’,’e’,’l’,’l’,’o’};

      این دو در واقع  رشته هستند.

      پاسخ
  3. سلام
    اگر ما در برنامه نوع داده متغییر را مشخص نکرده باشیم با فرض به این خط دستور w=x+y کامپایلر ما چه نوع عملکردی را برای عمل جمع + ما در نظر می گیرد

    پاسخ
    • سلام. تا جایی که به خاطر دارم، همۀ کامپایلرهایی که باهاشون کار کردم، اگه نوع متغیر رو تعیین نکنیم، خطا می گیرن و کلاً کار به این که چه عملیاتی رو در نظر میگیره نمیرسه

      پاسخ
  4. سلام وقت بخیر
    میخواستم بپرسم اگه توی برنامه بنویسم
    ;temp=PINB
    ;PORTC=temp
    فرقش با اینکه یک دفعه بنویسیم
    ;PORTC=PINB
    در محیط کدویژن چی هست

    پاسخ
    • سلام. ممکنه توی بعضی از معماری ها این امکان وجود نداشته باشه که CPU به صورت همزمان به دو رجیستر دسترسی داشته باشه. توی میکروکنترلرهای AVR این امکان وجود داره که توی یک دستور، CPU بتونه به دو رجیستر مستقل دسترسی داشته باشه. بنابراین می تونید از متغیر temp استفاده نکنید. تفاوتش اینه که وقتی که از temp استفاده نمی کنید، CPU مقدار PINB رو میخونه و اون رو توی یه بخشی از حافظه قرار میده.این بخش از حافظه به صورت خودکار از حافظه گرفته میشه و CPU خودش اون رو مدیریت میکنه. و آدرسش هم خودش تعیین میکنه. اما وقتی متغیری تعریف می کنیم، صریحاً میگیم که میخوایم مقدار PINB توی متغیر تعریف شده، قرار بگیره. حالا بعدش این مقدار رو توی PORTC قرار میدیم.

      پاسخ
  5. بسیار ممنون از توضیحات خوبتون

    پاسخ
    • خواهش میکنم. خیلی لطف دارید.

      پاسخ

یک دیدگاه بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

ضبط پیام صوتی

زمان هر پیام صوتی 4 دقیقه است