دو روش برای انتقال اطلاعات به تابع در زبان C وجود دارد، به عنوان مثال، با فراخوانی با مقدار و فراخوانی با مرجع.
 

با صدازدن تابع با مقدار در C

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

در این مقاله برای شما نمونه کد ساده برای ایجاد عدد تصادفی قرار می دهم امیدوارم مفید واقع شود.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/* prints a random number in the range 0 to 99 */
int main(void)
{
randomize();
printf(“Random number in the 0-99 range: %d\n”, random (100));
return 0;
}

ادامه مطلب

برای استفاده از مویس در Dos می بایست از وقفه ۳۳ کمک گرفت . بنابراین در این مقاله قبل از توضیح بکارگیری ماوس در C ابتدا به تشریح بکارگیری وقفه ها در C می پردازیم.
کسانی که با زبان برنامه نویسی اسمبلی کار کرده اند ، با کار وقفه ها به خوبی آشنایی دارند . در واقع در زبان اسمبلی تمامی کارها با فراخوانی وقفه ها انجام میشود چرا که این زبان یک زبان سطح پایین است . اما در زبانهای سطح بالا مثل C وقفه ها از چشم کاربر دور شده اند تا زبان برنامه نویسی به زبان محاوره ای انسان نزدیکتر شود . با این حال فراخوانی وقفه ها در C برای برنامه نویس امکان پذیر است .
در زبان C ایتدا باید یک متغیر از نوع رجیستر تعریف شود تا بتوان به کمک آن به رجیستر ها دستیابی داشت :
REGS r;
در تعریف بالا متغیر r از نوع Register تعریف شده که این نوع در سرفایل Dos.h قرار دارد.
حال برای دستیابی به یک رجیستر مانند AX و یا اجزای آن یعنی AH , AL یک یونیون در Dos.h تعریف شده است که ساختمان داخلی x در آن برای دستیابی به رجیستر ۲ بایتی (رجیستر کامل ) مانند AX و ساختمان داخلی h برای دستیابی به اجزای رجیستر ۲ بایتی یعنی AH , AL که یک بایتی هستند ، می باشند:

Union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};

پس اگر بخواهیم به رجیستر AX و مانند آن دستیابی پیدا کنیم می نویسیم :
r.x.ax
و برای اجزای آن می نویسیم :

r.h.ah
r.h.al

پس از مقدار دهی رجیستر ها و مشخص کردن شماره تابع یا سرویس ، نوبت به فراخوانی وقفه یا اینتراپت می رسد که با فرمان زیر انجام می شود :
int86(آدرس متغیر رجیستر خروجی,آدرس متغیر رجیستر ورودی,شماره وقفه در مبنای ۱۶);
اعداد مبنای ۱۶ در C با ۰x شروع می شوند . مثلا اگر بخواهیم تابع شماره ۱ از وقفه ۳۳ را فراخوانی کنیم باید شماره تابع را در AH قرار داده و سپس وقفه را فراخوانی کنیم :

REGS in,out;
in.x.ax=0x01;
int86(0x33,&in,&out);

که البته در مثال بالا از آنجایی که AH جزوی از AX می باشد و در سمت راست مقدار دهی می شود از AX استفاده شده است . در واقع AX=01 یعنی AL=0 و AH=1 .
متغیر in شامل ورودی های وقفه است و چنانچه وقفه خروجی هم داشته باشد خروجی های آن در out قرار می گیرد.
حال به استفاده از ماوس می پردازیم .
۱- راه اندازی ماوس : تابع ۰ از وقفه ۳۳ : اگر پس از اجرای وقفه مقدار AX برابر ۰ باشد یعنی ماوس راه اندازی نشده است .

int Mouse(void){
REGS in,out;
in.x.ax=0x00;
int86(0x33,&in,&out);
if(out.x.ax==0) return 0;
return 1;
}

لازم به ذکر است که قبل از فراخوانی این تابع باید درایور ماوس در داس را اجرا کنید مثلا : GMouse.com
۲ – نمایش کرسر ماوس : تابع ۱ از وقفه ۳۳ : پس از راه اندازی مویس اجرا می شود .

void ShowCursor(void){
REGS in,out;
in.x.ax=0x01;
int86(0x33,&in,&out);
}

۳- مخفی کردن کرسر ماوس : تابع ۲ از وقفه ۳۳ :

 void HideCursor(void){
REGS in,out;
in.x.ax=0x02;
int86(0x33,&in,&out);
}

۴-بدست آوردن مختصات مکان نمای مویس : تابع ۳ از وقفه ۳۳ : پس از اجرای وقفه شماره ستون در CX و سطر در DX قرار می گیرد .

void CursorLocate(int* column,int* row){
REGS in,out;
in.x.ax=0x03;
int86(0x33,&in,&out);
*column=out.x.cx;
*row=out.x.dx;
}

۵- انتقال کرسر : تابع ۴ از وقفه ۳۳ : قبل از فراخوانی می بایست شماره ستون مورد نظر در CX و شماره سطر در DX قرار گیرد .

 void CursorTo(int column,int row){
REGS in,out;
in.x.ax=0x04;
in.x.cx=column;
in.x.dx=row;
int86(0x33,&in,&out);
}

۶- تست کلیک شدن ماوس : تابع ۵ از وقفه ۳۳ : شماره کلید ماوس باید در BX قرار گیرد ( ۰ برای چپ – ۱ برای راست و ۲ برای وسط ) . اگر کلیک شده باشد مقدار ۱ در BX و گرنه ۰ در آن قرار می گیرد.

int Click(int key){
REGS in,out;
in.x.ax=0x05;
in.x.bx=key;
int86(0x33,&in,&out);
return out.x.bx;
}

توابع گفته شده سرویسهای مهم بکارگیری ماوس بود . سایر توابع را می توانید در جدول وقفه های داس در ستون وقفه ۳۳ بیابید .