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

محتوای حذف‌شده محتوای افزوده‌شده
بدون خلاصۀ ویرایش
بدون خلاصۀ ویرایش
خط ۲۴۵:
<code>'''typedef''' ''data-type'' ''new-name''</code>
 
از typedef یا برای خواناتر شدن کدهای نوشته شده استفاده می‌شود که این خواناتر شدن در دو محور معنی می‌یابد : ۱− کوتاه‌تر نوشته می‌شود ۲− به کدهای نوشته شده معنای قابل درکی می‌بخشد یا برای قابل حمل بودن و راحت‌تر شدن ویرایش برنامه استفاده می‌شود ؛ مثلاً فرض کنید نوعی داده ایجاد کرده‌اید که کوچک یا بزرگ است و در هر صورت نامتناسب با مقداری که می‌گیرد یا قرار است در کامپیوتر و سیستم عامل دیگری بگیرد ، در چنین شرایطی برنامه‌نویس دیگر که قرار است کد شما را اصلاح کند با مشکلی بزرگ مواجه می‌شود و محبور است یک به یک تمام داده‌ها را عوض کند ، اما اگر از typedef استفاده کنید با یک تغییر در نوع داده مشکل حل می‌شود
 
مثال :
خط ۳۶۲:
 
در هر دو مثال برای ساختمان mystr با کمک نام جایگزین mysamp نمونه firststr را ایجاد کرده و در تابع printf به اعضای ساختمان مقدار داده و آنها را نمایش داده‌ایم ولی دو با شکل متفاوت و در مثال دوم دو جایگزین برای ساختمان mystr ایجاد کرده‌ایم که از اولی یعنی sample استفاده‌ای نشده است اما مجازیم تا از آن نیز برای ایجاد نمونه‌هایی از ساختمان mystr استفاده کنیم
 
تا اینجا فقط کاربرد معنا بخشیدن typedef را نشان دادیم ؛ اما فرض کنید می‌خواهید نمونه‌های اشاره‌گری از یک ساختمان بسازید ، با کمک typedef کار شما راحت‌تر و کد نوشته شده شما خواناتر خواهد شد
 
مثلاً اگر یک ساختمان با نام node داشته باشید و بخواهید از آن نمونه‌های اشاره‌گر زیادی بسازید یک بار می‌نویسید typedef node* nodeptr و سپس با کمک نام جایگزین nodeptr چندین نمونه اشاره‌گر با نام‌های معمولی startptr و endptr و curptr و prevptr و errptr و refptr با نوشتن در مقابل nodeptr ایجاد می‌کنید
 
در مورد تابع‌های اشاره‌گر نیز typedef به وفور به کار می‌رود ، مخصوصاً که تابع‌های اشاره‌گری تعریف کنیم که پارامترهای آنها تابع‌های اشاره‌گر دیگری باشند . مثال :
 
{{چپ‌چین}}
<source lang="C#">
#include <stdio.h>
 
int add(int a, int b) {
return a + b;
}
 
int sub(int a, int b) {
return a - b;
}
 
typedef int (*function)(int a, int b);
 
int call_function(function p, int a, int b) {
return p(a, b);
}
 
int main(void) {
int sum;
sum = call_function(&add, 10, 5);
printf("add: %d\n", sum);
sum = call_function(&sub, 10, 5);
printf("sub: %d\n", sum);
return 0;
}
</source>
{{پایان چپ‌چین}}
 
در مثال بالا می‌توان به جای اینکه تابع function را با typedef اشاره‌گر تعریف کرد ، آن را یک تابع غیراشاره‌گر تعریف نموده و سپس در تابع call_function پارامتر p را اشاره‌گر تعریف نمود تا تابع function را به عنوان آرگومان بپذیرد
 
'''دقت کنید :''' در جایگزینی تابع به واسطه 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 چاپ می‌شود
 
[[رده:زبان برنامه نویسی سی]]