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

توسط | 28 آذر, 1398 | AVR, lpc, STM32, آردوینو, برنامه نویسی, وبلاگ | 17 دیدگاه ها

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

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

روح سیستم های دیجیتال میکروکنترلری

آموزش های رایگان برنامه نویسی C و C++

فیلم های آموزش برنامه نویسی استاندارد

آموزش خصوصی برنامه نویسی حرفه ای میکروکنترلر

اخبار جدید یوبرد در اینستاگرام

کلاس حافظه در C و C++، تعیین کنندۀ دو ویژگی «طول عمر» و «حوزۀ تعریف» داده است. طول عمر یک داده بیان کنندۀ این است که دادۀ ایجاد شده تا چه زمانی در حافظه باقی می ماند. مثلاً طول عمر یک داده از کلاس حافظه Static، از زمانی است که تعریف می شود، تا همیشه. یعنی این داده تا موقعی که سیستم روشن است، فضایی از حافظه را اشغال می کند. حوزۀ تعریف یک داده نیز بیانگر این است که یک داده در چه بلوک هایی قابل دسترسی است. در زبان C و C++ به طور کلی دو حوزۀ تعریف عمومی  و محلی وجود دارد. یک داده می تواند دارای حوزۀ تعریف عمومی باشد و در تمامی توابع برنامه در دسترس باشد. یا می تواند محلیِ یک تابع باشد و فقط در همان تابع قابل دسترسی است. در زبان C چهار کلاس حافظه وجود دارد: کلاس حافظه اتوماتیک، کلاس حافظه رجیستر، کلاس حافظه Static و کلاس حافظه خارجی. در زبان C++ علاوه بر کلاس های حافظۀ اتوماتیک، Static، رجیستر و خارجی، کلاس حافظه Mutable نیز وجود دارد. «کلاس حافظه» با نام «کلاس ذخیره سازی» هم شناخته می شود. همچنین منظور ما از داده، همۀ انواع داده شامل متغیرها، استراکچرها، یونیون ها، کلاس ها و … است. ممکن است بگوییم کلاس ذخیره سازی متغیر در C که منظور ما همان کلاس حافظه در C است. یا منظور ما از کلاس حافظه در C++ همان کلاس ذخیره سازی داده در C++ است. همچنین به طور کلی منظور ما از متغیر در این نوشته، انواع داده شامل متغیر، متغیر تعریف شده از استراکچر، متغیر تعریف شده از یونیون، شیء ایجاد شده از کلاس و … است. در ادامه متغیرهای عمومی و محلی را بررسی می کنیم و سپس به کلاس های حافظه در C و C++ می پردازیم.

انواع متغیر در C

انواع-کلاس-حافظه

تصویر 1 – کلاس های حافظه در زبان C و C++

 

پیش از ادامۀ متن پیشنهاد می شود ویدئوی زیر را مشاهده بفرمایید. این ویدئو مربوط به سالهای گذشته از پیج آپارات رضا اسدی درمورد کلاس های حافظه در زبان C است.

ویدئوی 1 – کلاس های حافظه در زبان C

متغیرهای عمومی و محلی در C و C++

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

int a = 0;

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

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

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


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

متغیرهای محلی یا Local، درون توابع تعریف می شوند و فقط برای تابعی که در آن تعریف شده اند، در دسترس اند. در مثال قبل، متغیر b یک متغیر محلی است. در مثال زیر هم متغیرهای i و j و x محلیِ تابع func2 هستند و در توابعِ func1 و main، در دسترس نیستند. a و b نیز محلیِ main هستند و در func1 و func2 در دسترس نیستند.

void func1(void)
{
	...
}

int func2(int x)
{
	int i = 0, j = 0;
	
	j = 2 * x * i;
	j = j + x * x + i * i;
	return j;
}


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

متغیر-عمومی-محلی

تصویر 2 – متغیرهای عمومی و محلی

کلاس حافظه در C و C++، کلاس حافظه اتوماتیک

یکی از کلاس های حافظه در زبان C و C++، کلاس حافظه اتوماتیک (Automatic) است. این کلاس حافظه تنها برای متغیرهای محلی است. یعنی تنها متغیرهای محلی می توانند دارای کلاس حافظه اتوماتیک باشند. بنابراین حوزۀ تعریف متغیرهایی با کلاس اتوماتیک، محلی است. طول عمر متغیرهای کلاس حافظه اتوماتیک، مدت زمان اجرای تابع است. وقتی متغیرهای کلاس حافظه اتوماتیک، درون تابعی تعریف می شوند، بخشی از حافظه به آنها اختصاص می یابد. و وقتی اجرای تابع تمام می شود، این متغیرها از بین می روند. و حافظۀ اختصاص داده شده به آنها، به سیستم برگردانده می شود. متغیرهایی که درون یک تابع تعریف می شوند، به طور پیش فرض دارای کلاس حافظه اتوماتیک هستند. برای تعریف متغیرهای کلاس حافظه اتوماتیک از مشخص کنندۀ auto استفاده می شود. توجه داشته باشید که در برخی نرم افزارهای برنامه نویسی از کلمۀ کلیدی auto پشتیبانی نمی شود. مثل نرم افزار کدویژن که برای برنامه نویسی میکروکنترلرهای AVR به کار می رود. در مثال زیر متغیرهای a و b و c از کلاس حافظه اتوماتیک هستند.

void func(int a)
{
	auto int b = 0;
	int c = 3;
	...
}

کلاس-حافظه-اتوماتیک

تصویر 3 – کلاس حافظه در C و C++، اختصاص حافظه به متغیر کلاس حافظه اتوماتیک

کلاس حافظه در C و C++، کلاس حافظه رجیستر

یکی دیگر از کلاس های حافظه در زبان C و C++ کلاس حافظه رجیستر (Register) است. متغیرهایی با این کلاس حافظه مانند متغیرهای کلاس حافظه اتوماتیک هستند. حوزۀ تعریف آنها محلی است و طول عمرشان نیز مدت زمان اجرای تابع است. یعنی با تعریف یک متغیر از کلاس حافظه رجیستر، بخشی از حافظه به آن اختصاص داده می شود. و این متغیر با اتمام اجرای تابع، از بین می رود. تفاوت این کلاس حافظه با کلاس حافظه اتوماتیک در این است که در کلاس حافظه اتوماتیک، متغیر در حافظۀ SRAM ذخیره می شود. اما در کلاس حافظه رجیستر، متغیر در فضای رجیسترهای عمومی ذخیره می شود. سرعت دسترسی CPU به محل رجیسترها بالاست. بنابراین تنها زمانی که سرعت بالا در عملیات روی متغیرها مورد نیاز باشد، از کلاس حافظه رجیستر تعریف می شوند. متغیرهای کلاس حافظه رجیستر، با مشخص کنندۀ register تعریف می شوند. در مثال زیر متغیرهای a و b و c از کلاس حافظه رجیستر هستند.

void func(register int a)
{
	register int b;
	register unsigned char c;
	//...
}

نکته: پارامترهای ورودی توابع می توانند از کلاس حافظه رجیستر باشند.

نکته: آدرس متغیرهای کلاس حافظه رجیستر با عملگر & قابل دستیابی نیست.

کلاس-حافظه-رجیستر

تصویر 4 – کلاس حافظه در C و C++، اختصاص حافظه رجیستر به متغیرهای کلاس حافظه رجیستر

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

کلاس حافظه Static هم برای متغیرهای عمومی وجود دارد و هم برای متغیرهای محلی. وقتی یک متغیر با کلاس حافظه Static تعریف می شود، بخشی از حافظه، برای همیشه به آن اختصاص می یابد. پس طول عمر متغیرهای کلاس حافظه Static، تا همیشه است. ویژگی متغیر Static محلی این است که این متغیر در تابع، تنها یک بار تعریف می شود. و هنگام پایان اجرای تابع از بین نمی رود و مقدار خود را نیز حفظ می کند. اگر تابع دوباره اجرا شود، این متغیر آخرین مقدار قبلی خود را دارد. حوزۀ تعریف متغیرهایی که با کلاس حافظه Static در توابع تعریف می شوند، محلی است. برای تعریف متغیرهای کلاس حافظه Static باید از مشخص کنندۀ static استفاده کنیم. در مثال زیر، متغیر a که در تابع func با حوزۀ محلی تعریف شده، دارای کلاس حافظه Static است. دفعۀ اول که تابع func اجرا می شود، متغیر a تعریف و مقدارش برابر صفر می شود. در ادامه مقدار a تغییر می کند. دفعات بعدی که func اجرا می شود، a دیگر تعریف نمی شود. مقدار آن نیز برابر آخرین مقداری است که در اجرای قبلیِ func گرفته بود.

void func(int i)
{
	static int a = 0;
	a = i;
	a+=3;
	...
}

ویژگی متغیر عمومی با کلاس حافظه Static این است که تنها برای توابعی که بعد از آن و در فایل حاضر تعریف می شوند قابل دسترسی است و نه فایل های دیگر. اگر بخواهیم یک متغیرعمومی در یک فایل تعریف کنیم که تنها در همان فایل استفاده شود، از کلاس حافظه Static استفاده می کنیم. این متغیر برای فایل های دیگر قابل دسترسی نیست. البته در برخی نرم افزارها چنین نیست. و متغیرهای عمومی با کلاس حافظه Static، در فایل های دیگر هم در دسترس هستند.مثل نرم افزار اتمل استودیو. در مثال زیر a متغیر Static عمومی است.

static int a;

void func1(int i)
{
	a = 1;
	...
}

void func2(void)
{
	a = 2;
	...
}

کلاس-حافظه-static

تصویر 5 – کلاس حافظه در C و C++، اختصاص حافظه به متغیرهای کلاس حافظه Static محلی و عمومی

کلاس حافظه در C و C++، کلاس حافظه خارجی

کلاس حافظه خارجی برای استفاده از متغیرهای عمومی یک فایل، در فایلی دیگر است. اگر در یک فایل یک متغیر عمومی داشته باشیم و بخواهیم از آن در فایل دیگری نیز استفاده کنیم، در فایل دوم آن را از کلاس حافظه خارجی اعلان می کنیم. در این صورت متغیر موجود در فایل اول، در فایل دوم قابل استفاده است. دقت کنید که برای متغیری که از کلاس حافظه خارجی اعلان می شود، فضای جدیدی در حافظه اختصاص نمی یابد. این متغیر همان متغیر موجود در فایل اول است که در فایل دوم در دسترس است. بنابراین نمی توان گفت که متغیر از کلاس حافظه خارجی «تعریف» شده، و باید گفت این متغیر «اعلان» شده است. متغیرهای کلاس حافظه خارجی دارای حوزۀ عمومی هستند. و چون این متغیرها همان متغیرهای عمومی موجود در فایل اول هستند، طول عمرشان، تا همیشه است. در برخی نرم افزارها می توان از یک متغیر که در یک فایل تعریف شده، در فایل دیگر استفاده کرد. بدون آن که نیاز باشد متغیر، در فایل دوم از کلاس حافظه خارجی اعلان شود. برای اعلان متغیر از کلاس حافظه خارجی از مشخص کنندۀ extern استفاده می کنیم. در مثال زیر، متغیر a در file1.h با حوزۀ عمومی تعریف شده است. و در فایل main.c از کلاس حافظه خارجی اعلان شده است.

نکته: زمان اعلان متغیر از کلاس حافظه خارجی، نمی توان به آن مقدار اولیه داد. زیرا فقط یک اعلان است. در صورت لزوم، می توان هنگام تعریف متغیر در فایل اول، به آن مقدار اولیه داد.

// file1.h

...
int a;

// main.c

#include "file1.h"
...
extern int a;

...


int main(void)
{
	
	
	
}

کلاس-حافظه-خارجی

تصویر 6 – کلاس حافظه در C و C++، اعلان متغیرها در فایل های دیگر با کلاس حافظه خارجی

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

یکی از کلاس های حافظه در زبان C++ کلاس حافظه Mutable است. کلاس حافظه Mutable در C++ برای مواقعی است که از کلاس، یک شیء const ایجاد می کنیم. وقتی از یک کلاس، شیء const ایجاد می کنیم، نمی توانیم مقدار اعضای داده ای کلاس را برای آن شی تغییر دهیم. چرا که شیء مذکور const است. اما اگر کلاس دارای عضو با کلاس حافظه Mutable باشد، در صورتی که شیء const هم از آن ایجاد کنیم، می توانیم مقدار عضو داده ای آن را تغییر دهیم. برای تعریف عضو داده ای از کلاس حافظه Mutable از مشخص کنندۀ mutable استفاده می کنیم. در مثال زیر کلاس c یک عضو داده ای a دارد که کلاس حافظۀ آن، Mutable است. در تابع main، از کلاس c، شیء object به صورت const ایجاد شده است. در برنامه نمی توانیم مقدار عضو داده ای b را برای object تغییر دهیم. اما a را چون که از کلاس حافظه Mutable است، می توانیم تغییر دهیم.

class c
{
public:
	mutable int a;
	int b;
	...
};

int main(void)
{
	const c object;
	
	object.a = 2;
	object.a = ++;
	// object.b = 3; // error
	
	...
}

کلاس-حافظه-mutable

تصویر 7 – کلاس حافظه Mutable و امکان تغییر دادۀ عضو برای شیء const

توصیف کننده volatile

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

volatile-بهینه-سازی-کلاس-اتوماتیک

تصویر 8 – خاصیت متغیرهایی با توصیف کننده volatile

کاربردهای دیگر volatile

در بخش قبل گفتیم، volatile می تواند با کلاس حافظه در C و C++ در ارتباط باشد و ارتباط آن را بیان کردیم. اما volatile کاربردهای دیگری هم دارد. در زبان اسمبلی اگر عملیاتی روی یک متغیر انجام شود، متغیر باید ابتدا به حافظۀ رجیستر منتقل و سپس عملیات مورد نظر انجام شود. اگر در جای دیگری از برنامه این متغیر استفاده شود، مقدار آن از حافظۀ رجیسترها خوانده می شود. ممکن است در همان لحظه توسط یک پردازش دیگر، مقدار متغیر در 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);
	...
}

کاربرد-volatile

تصویر 9 – یک کاربرد volatile

نتایج کلاس حافظه در C و C++

  1. هر داده یک حوزۀ تعریف و یک طول عمر دارد.
  2. حوزۀ تعریف داده، تعین می کند که یک داده در چه بلوک هایی از برنامه در دسترس است.
  3. طول عمر داده تعیین کنندۀ مدت زمان اختصاص یافتن حافظه به آن است.
  4. در زبان C چهار کلاس حافظۀ اتوماتیک، رجیستر، Static و خارجی وجود دارد.
  5. در زبان C++ پنج کلاس حافظۀ اتوماتیک، رجیستر، Static، خارجی و Mutable وجود دارد.
  6. حوزۀ تعریف متغیرها شامل دو حوزۀ عمومی و محلی است. متغیرهای عمومی در همۀ توابعی که بعد از تعریف آن می آیند، در دسترس هستند. متغیرهای محلی تنها در تابعی که تعریف می شوند قابل دسترسی هستند.
  7. متغیر با کلاس حافظه اتوماتیک، حوزۀ تعریف محلی دارد و طول عمرش، تا زمان پایان اجرای تابع است.
  8. متغیر با کلاس حافظه رجیستر دارای حوزۀ محلی است و طول عمر آن تا پایان اجرای تابع است. متغیرهای کلاس حافظه رجیستر در بخش رجیسترهای عمومی ذخیره می شوند و با عملگر & نمی توان به آدرس آنها دسترسی داشت.
  9. طول عمر متغیر محلی با کلاس حافظه Static، تا همیشه است. متغیر محلی با کلاس حافظه Static، پس از پایان اجرای تابع از بین نمی رود و مقدار خود را حفظ می کند.
  10. طول عمر متغیر عمومی با کلاس حافظه Static، تا همیشه است. حوزۀ تعریف متغیر با این کلاس فایلی است که در آن تعریف می شود و در توابع بعد از تعریف آن، در دسترس است.
  11. اگر یک متغیر در یک فایل تعریف شده باشد و در یک فایل دیگر مورد استفاده قرار گیرد، در فایل دوم باید آن را از کلاس حافظه خارجی اعلان کرد. متغیر اعلان شده همان متغیر موجود در فایل اول است که در فایل دوم قابل دسترسی است.
  12. در زبان C++ وقتی یک شیء const از یک کلاس ایجاد می شود، برای این که بتوان اعضای داده ای کلاس را برای شیء مذکور تغییر داد، می توان از کلاس حافظه Mutable برای آن عضو دده ای استفاده کرد.
  13. کلمۀ کلیدی volatile برای کاربردهایی مثل جلوگیری از بهینه سازی متغیر، جلوگیری از تعریف شدن متغیر با کلاس ذخیره سازی رجیستر و خوانده شدن مستقیم از SRAM، استفاده می شود.

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

رضا اسدی

رضا اسدی

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

سفارش پروژه میکروکنترلر یوبرد

زیرساخت مطمئن صنعت

جدیدترین تاپیک های برنامه نویسی

استفاده از زبان سی در سیستم های حیاتی

از همه ابزارهای زبان برنامه نویسی میکروکنترلرها استفاده کنیم؟!

ابزارهای زبان برنامه نویسی میکروکنترلرها در استانداردهای برنامه نویسی محدود شده است. بطور مثال در استاندارد MISRA-C برای سیستم های حیاتی، استفاده از دستورهای goto و continue ممنوع شده است. در این نوشته به بررسی این موضوع می پردازیم.

مهمترین کاربردهای اشاره گر

مهمترین کاربردهای اشاره گر در زبان C میکروکنترلرها

کاربردهای اشاره گر در زبان C میکروکنترلرها شامل موارد مختلفی است که مهمترین آنها «ارسال اشاره گر به تابع» و «اشاره گر به تابع» است. در این نوشته ابتدا آنها را به اختصار شرح داده سپس در مورد اهمیت کاربرد اشاره گر در میکروکنترلر توضیح می دهیم.

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

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

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

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

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

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

17 دیدگاه ها

  1. سلام استاد واقعا عالی بود.

    پاسخ
    • سلام. خواهش میکنم. حتماً ویدئوهای آموزشی نوشته ها رو هم ببینید. ممکنه مطلبی که تو ویدئوها توضیح داده میشه گویاتر باشه.

      پاسخ
  2. سلام استاد،
    من هم خیلی جستجو کردم، بهترین منبعی بود که پیدا کردم و ویدیو خیلی عالی بود. مطلب برای من کمی سخته ولی اینطور که متوجه شدم کاربرد این نوع متغیرها باید در برنامه نویسی میکروکنترلرها باشه و در خود سی من هنوز به مثالی بر نخوردم.. تشکر میکنم از توضییحاتون.

    پاسخ
    • سلام. خواهش میکنم. خیر فقط در کاربر میکروکنترلرها نیست. همچنین مورد 14 در نتیجه گیری که فرمودید، در مورد متغیرهای محلی هست و نه عمومی. در اسرع وقت ویرایش میشه. خواهش میکنم.

      پاسخ
  3. سلام استاد،
    من هم خیلی جستجو کردم، بهترین منبعی بود که پیدا کردم و ویدیو خیلی عالی بود. مطلب برای من کمی سخته ولی اینطور که متوجه شدم کاربرد این نوع متغیرها باید در برنامه نویسی میکروکنترلرها باشه و در خود سی من هنوز به مثالی بر نخوردم.مورد 14 هم بنظرم منظورتون متغیر محلی هست. تشکر میکنم از توضییحاتون.

    پاسخ
    • سلام. خواهش میکنم. خیر فقط در کاربر میکروکنترلرها نیست. همچنین مورد 14 در نتیجه گیری که فرمودید، در مورد متغیرهای محلی هست و نه عمومی. در اسرع وقت ویرایش میشه.

      پاسخ
  4. سلام عرض میکنم. اگر یک نمونه کد زحمت می کشیدید و قرار میدادید که از انواع متغیرها در جاهای مختلف اون استفاده شده بود خیلی عالی می شد. البته الان هم عالی هست‌. تشکر

    پاسخ
    • سلام. خیلی ممنون. توی نوشته هایی که نمونه کد و پروژه بررسی می کنیم، در صورت لزوم از متغیرهایی با کلاس های حافظۀ متفاوت استفاده می کنیم. در آینده تعداد این نوشته ها بیشتر هم میشه و توی اونا دلیل انتخاب کلاس حافظه هم ذکر می کنیم.

      پاسخ
  5. سلام. جناب اسدی مفهوم volatile رو خیلی خوب توضیح دادید. سپاسگزارم

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

      پاسخ
  6. سلام موضوع خوبی رو بیان کردید اما بهتر بود همینجا اشاره ای هم به تابع استاتیک میزدید من واسه این اومده بودم ولی چیزی پیدا نکردم تابع استاتیک برای محدود کردن یک تابع برای دسترسی فقط در همان فایل هست و کاربرد دوم هم برای استفاده چندتابع با نام یکسان هست 

    پاسخ
    • سلام. خیلی ممنون از نظرتون. این نوشته در آینده ویرایش میشه و اگر موضوعی که مطرح کردید متناسب با موضوع باشه بیان میشه. اگر هم نه، در نوشته های آینده با موضوعات دیگه گفته میشه. ممنون از توجهتون

      پاسخ
  7. سلام توی بند 14 در آخر این آموزش در عبارت "برای این که مطمئن شویم یک متغیر عمومی از نوع اتوماتیک تعریف شود" کلمه "عمومی" نباید "محلی" باشه؟ چون خودتون گفتید کلاس اتوماتیک فقط برای متغیر محلی است

    پاسخ
    • سلام. بله. این اشتباه ویرایش شد. ممنون از توجهتون

      پاسخ
  8. سلام استاد گرامی ، من میخواهم تو یک آدرس حافظه که بصورت هگزادسیمال است مثلا 0xaa یک مقدار هگزادسیمال مثلا 0xbb بریزم . و مدت عمر این همیشگی باشد .استاد چه کنم ؟ چگونه میشه به یک مکان حافظه در میکرو دسترسی پیدا کرد ؟ چیزی در آن نوشت یا خواند ؟ از لطف شما بسیار سپاسگزارم

    پاسخ
  9. سلام خسته نباشید!
    خواهشی که از شما دارم تا فردا ب این سوال من پاسخ بدین و نذارید برا چند روز دیگه خیلی ممنونم!
    آرایه از کدام کلاس حافظه نمی تواند تعریف شود؟
    1 ثبات
    2 خودکا
    3 ایستا
    4 خارج ی

    پاسخ
    • سلام وقت بخیر.
      برای تمام کلاسهای حافظۀ گفته شده از آرایه ها هم می توانید استفاده کنید.

      پاسخ

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دیگر آموزش های یوبرد

آموزش ARM STM32 یوبرد

شروع بازی ST

آموزش طراحی PCB و نویز یوبرد

تجسم دنیای الکترونیک

آموزش لحیم کاری و IPC-A-610 یوبرد

ساخت دنیای الکترونیک

آموزش FreeRTOS یوبرد

زمان واقعی در میکروکنترلر و پردازنده های کوچک با FreeRTOS

آموزش آردوینو یوبرد

جادۀ آسفالت میکروکنترلر

آموزش ماژول های SIM800 یوبرد

تلفن همراه صنعت

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

لمس شی گرایی در میکروکنترلرها

آموزش میکروکنترلرهای AVR یوبرد

شاهکار 8 بیتی Atmel

آموزش میکروکنترلرهای LPC یوبرد

یادگار فیلیپس

آموزش های شاخص

دانلود

لطفا برای دریافت لینک دانلود اطلاعات خواسته شده را وارد نمایید
ضبط پیام صوتی

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