زبان برنامه نویسی سی/تبدیل و جایگزینی داده‌ها: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
بدون خلاصۀ ویرایش
بدون خلاصۀ ویرایش
خط ۳۶۵:
تا اینجا فقط کاربرد معنا بخشیدن typedef را نشان دادیم ؛ اما فرض کنید می‌خواهید نمونه‌های اشاره‌گری از یک ساختمان بسازید ، با کمک typedef کار شما راحت‌تر و کد نوشته شده شما خواناتر خواهد شد
 
مثلاً اگر یک ساختمان با نام node داشته باشید و بخواهید از آن نمونه‌های اشاره‌گر زیادی بسازید یک بار می‌نویسید typedef node* nodeptr و سپس با کمک نام جایگزین nodeptr چندین نمونه اشاره‌گر با نام‌های معمولی startptr و endptr و curptr و prevptr و errptr و refptr با نوشتن در مقابل nodeptr ایجاد می‌کنید . از این ترفند در مورد ساخت لیست‌های پیوندی نیز استفاده می‌شود
 
در مورد تابع‌های اشاره‌گر نیز typedef به وفور به کار می‌رود ، مخصوصاً که تابع‌های اشاره‌گری تعریف کنیم که پارامترهای آنها تابع‌های اشاره‌گر دیگری باشند . مثال :
خط ۴۰۶:
 
'''توضیح :''' در مثال بالا یک تابع با نام add تعریف نمودیم که دو پارامتر a و b را می‌پذیرد و آنها را با هم جمع می‌کند و حاصل‌جمع را به عنوان خروجی عرضه می‌کند . تابع sub دو پارامتر a و b را می‌گیرد و b را از a کم می‌کند و نتیجه را عرضه می‌کند . تابعی از نوع صحیح اشاره‌گر با نام function که با همین نام جایگزین نیز شده است ( به خاطر وجود کلیدواژه typedef ) با دو پارامتر a و b اعلان شده و سپس تابع call_function با پارامتر اول که یک function است که خود یک صحیح اشاره‌گر می‌باشد تعریف شده و همچنین دو پارامتر دیگر یعنی a و b را می‌پذیرد که به عنوان خروجی تابعی را از نوع صحیح اشاره‌گر که روی دو پارامتر a و b پردازش می‌کند به عنوان خروجی عرضه می‌کند . در نهایت در تابع main یک متغیر صحیح با نام sum به عنوان حاصل اعلان شده که بار اول call_function را احضار می‌کند و به عنوان آرگومان تابع add و اعداد ۱۰ و ۵ را به ترتیب به آن پاس می‌دهد و سپس عدد حاصل را در خروجی خط‌دستوری پرینت می‌کند . در بار دوم متغیر sum برابر با خروجی احضار call_function با آرگومان‌های تابع sub و اعداد ۱۰ و ۵ ( به ترتیب ) است و این مقدار در خروجی خط‌دستوری با کمک تابع printf چاپ می‌شود
 
می‌توان تابع‌های اشاره‌گری که تابع‌های اشاره‌گری نیز دارند را هم با کمک typedef خواناتر نمود . مثلاً در کرنل FreeBSD نوشته شده بود :
 
{{چپ‌چین}}
<code>code>void (*signal(int sig, void (*func)(int)))(int);</code>
{{پایان چپ‌چین}}
 
که به جای آن می‌توان نوشت :
 
{{چپ‌چین}}
<code>typedef void (*SignalHandler)(int signum);
</code>extern SignalHandler signal(int signum, SignalHandler handler);
{{پایان چپ‌چین}}
 
که بسیار خواناتر است . SignalHandler نام تابع و نام جایگزین تابع پوچ اشاره‌گر است که یک پارامتر از نوع صحیح دارد و به کمک آن تابع signal را تعریف نموده‌ایم تا تابعی از نوع پوچ اشاره‌گر باشد که یک پارامتر صحیح دارد و یک پارامتر با نام handler که تابعی از نوع پوچ اشاره‌گر است که یک پارامتر صحیح نیز دارد
 
به مثال زیر دقت کنید :
 
{{چپ‌چین}}
<code>
struct dim3 {
int x;
int y;
int z;
};
 
struct dim3 * (*fnptr)( struct dim3 *, int );
</code>
{{پایان چپ‌چین}}
 
که می‌توان آن را به صورت زیر نیز نوشت :
 
{{چپ‌چین}}
<code>
typedef struct {
int x;
int y;
int z;
} DIM3;
 
typedef DIM3 * DIM3FN( DIM3 *, int );
 
DIM3FN * fnptr;
</code>
{{پایان چپ‌چین}}
 
که بسیار خلاصه‌تر و خواناتر است . هر دو قطعه کد یک کار را انجام می‌دهند اما در توضیح قطعه کد دوم :
ابتدا با کمک typedef یک ساختمان را که سه عضو صحیح دارد با نام جایگزین DIM3 ایجاد کردیم . در خط پایانی fnptr از نوع DIM3FN است که در خط قبل‌تر توسط typedef به صورت یک تابع با نام DIM3FN و با نام جایگزین همسان ( یعنی DIM3FN ) تعریف شده بود که از نوع ساختمان اشاره‌گر است و یک پارامتر DIM3 که یک ساختمان اشاره‌گر است و یک پارامتر دیگر که صحیح است تعریف نموده و در هنگام احضار می‌پذیرد ( چون هنوز به بحث تابع نرسیده‌ایم بیش از این مثال‌های پیچیده نمی‌زنیم و توضیحات ما در سطحی که مثال می‌زنیم برای آشنایی با تابع و توضیح در مورد بحثی که در آن هستیم می‌باشند )
 
'''نکته :''' با کمک اشاره‌گرها و ساختمان‌ها نوعی داده می‌توان ایجاد کرد که به آن داده نامرئی می‌گویند و دسترسی به اعضای آن امکان‌پذیر نیست مگر با استفاده از تابع‌های دسترس . پس از به اتمام رسیدن بحث‌های زبان C به بیان ترفندهایی که در زبان C به کار می‌روند می‌پردازیم
 
 
 
[[رده:زبان برنامه نویسی سی]]