ورود

View Full Version : سوال: تابع و نوع void



Spentboy
یک شنبه 17 آبان 1388, 16:22 عصر
دوستان به متن زیر توجه کنید :


" اگر تابع هیچ مقداری را به برنامه فراخوان باز نگرداند و فاقد آرگومان باشد ، نوع آن به صورت void تعریف می شود "

تعاریف بالا تابع و خصوصا مقدار void را تعریف کرده است .

خب حالا به دو مثال زیر توجه کنید :

1 :




#include <stdio.h>


int main (void)


{


printf (“Programming is fun.\n”);


return 0;


}


2 :




void printMessage (void)


{


printf(“Programming is fun.\n”);


}




مثال 1 :

در این برنامه بعد تعریف تابع اصلی برنامه در داخل پرانتز واژه void استفاده شده و کار اصلی برنامه هم چاپ یک رشته است ! حالا سوالی که اینجا برای من پیش آمده است این است که چرا در داخل پرانتز واژه void به کار رفته است و چرا این برنامه از این واژه استفاده کرده .

مثال 2 :

و اما در این مثال باز هم برنامه از واژه void استفاده کرده ، هم در قسمت نوع تابع و هم در قسمت آرگومان تابع! و کار اصلی این برنامه هم چاپ یک رشته است که این وظیفه را به تابع واگذار کرده است . و تابع هم بعد پردازش دستورات ، رشته را به برنامه ی اصلی تحویل می دهد تا برنامه اصلی آن مقدار را چاپ کند !!!

حال سوال اصلی

طبق تعریف بالا تابعی که در مثال 2 استفاده شده است عملا نباید مقداری را به برنامه فراخوان تحویل دهد .

اما بعد از پردازش دستورات ، رشته مورد نظر را به برنامه فراخوان تحویل می دهد و برنامه اصلی هم رشته را چاپ می کند ، با توجه به این تعاریف آیا اصل مقدار void زیر سوال نمی رود ؟

یا اینکه بنده من درست متوجه نشده ام ... ؟!

خواهشمند است حقر را راهنمایی بفرمایید .

حامد مصافی
یک شنبه 17 آبان 1388, 18:25 عصر
منظور نوشته کلمه void قبل از نام تابع که در مثال اول int درج شده است، می باشد.

m.soleimani
یک شنبه 17 آبان 1388, 19:55 عصر
نوشته شده توسط Spentboy دوستان به متن زیر توجه کنید : &quot; اگر تابع هیچ مقداری را به برنامه فراخوان باز نگرداند و فاقد آرگومان باشد ، نوع آن به صورت void تعریف می شود &quot; تعاریف بالا تابع و خصوصا مقدار void را تعریف کرده است . خب حالا به دو مثال زیر توجه کنید : 1 :
#include <stdio.h> int main (void) { printf (“Programming is fun.\n”); return 0; } 2 :
void printMessage (void) { printf(“Programming is fun.\n”); } مثال 1 : در این برنامه بعد تعریف تابع اصلی برنامه در داخل پرانتز واژه void استفاده شده و کار اصلی برنامه هم چاپ یک رشته است ! حالا سوالی که اینجا برای من پیش آمده است این است که چرا در داخل پرانتز واژه void به کار رفته است و چرا این برنامه از این واژه استفاده کرده . مثال 2 : و اما در این مثال باز هم برنامه از واژه void استفاده کرده ، هم در قسمت نوع تابع و هم در قسمت آرگومان تابع! و کار اصلی این برنامه هم چاپ یک رشته است که این وظیفه را به تابع واگذار کرده است . و تابع هم بعد پردازش دستورات ، رشته را به برنامه ی اصلی تحویل می دهد تا برنامه اصلی آن مقدار را چاپ کند !!! حال سوال اصلی طبق تعریف بالا تابعی که در مثال 2 استفاده شده است عملا نباید مقداری را به برنامه فراخوان تحویل دهد . اما بعد از پردازش دستورات ، رشته مورد نظر را به برنامه فراخوان تحویل می دهد و برنامه اصلی هم رشته را چاپ می کند ، با توجه به این تعاریف آیا اصل مقدار void زیر سوال نمی رود ؟ یا اینکه بنده من درست متوجه نشده ام ... ؟! خواهشمند است حقر را راهنمایی بفرمایید . شما توسط تابع printf یا توابع مشابه در این تابع یه متن را به صورت مستقیم به خروجی استاندارد که در حالت پیش‌فرض نمایش‌گر شماست می‌فرستید و به برنامه فراخوان چیزی را تحویل نخواهید داد چون به صورت صریح با استفاده از کلمه کلیدی void به کامپایلر گفتین که این تابع چیزی را بر نمی‌گرداند در واقع استفاده از این کلمه یک جور محکم کاری برای جلوگیری از اشتباه در فراخوانی تابع به صورت آرگومان دار یا برگشت دهنده هست که البته بسیاری از کامپایلرها خودشون این گونه اشتباهات را گوش‌زد می‌کنن موفق باشید کلمه void در تابع اول یعنی این که به تابع main هیچ آرگومانی پاس نمی‌شه و همین کلمه در مثال بعد یعنی این که تابع printMessage هیچ آرگومانی را نمی‌گیرد و هیچ آرگومانی را بر نمی‌گرداند. شما توسط تابع printf یا توابع مشابه در این تابع یه متن را به صورت مستقیم به خروجی استاندارد که در حالت پیش‌فرض نمایش‌گر شماست می‌فرستید و به برنامه فراخوان چیزی را تحویل نخواهید داد چون به صورت صریح با استفاده از کلمه کلیدی void به کامپایلر گفتین که این تابع چیزی را بر نمی‌گرداند در واقع استفاده از این کلمه یک جور محکم کاری برای جلوگیری از اشتباه در فراخوانی تابع به صورت آرگومان دار یا برگشت دهنده هست که البته بسیاری از کامپایلرها خودشون این گونه اشتباهات را گوش‌زد می‌کنن موفق باشید.