پرش به مطلب اصلی

اصول: متغیرها

متغیرها

یکی از مهم‌ترین مفاهیم در برنامه‌نویسی مفهوم 'متغیرها' است. در برنامه‌نویسی، متغیر موجودی است که قابل تغییر است، اما از نظر چه؟ در زبان Pawn یک متغیر در هر زمان 'مقداری' نگه می‌دارد و آن مقدار - همان‌طور که نام پیشنهاد می‌کند - 'متغیر' یا 'قابل تغییر' است.

دلیل اهمیت متغیرها این است که آن‌ها اساساً واحدهای کوچک حافظه کامپیوتر هستند که می‌توانند مقدارهای مختلف را در حالی که برنامه در حال اجرا است نگه دارند یا 'به خاطر بسپارند'، و این خاصیت در برنامه‌نویسی بسیار مفید است. برای مثال، می‌خواهید امتیاز 100 بازیکن در یک بازی را پیگیری کنید، می‌توانید به راحتی با برنامه‌نویسی کامپیوتر برای ذخیره (به خاطر سپردن) و به‌روزرسانی آن مقدارها این کار را انجام دهید. بعداً اگر بخواهید میانگین امتیاز آن بازیکن‌ها را پیدا کنید یا بخواهید جدول امتیازات بسازید، آن مقدارها از متغیرها می‌توانند به راحتی دسترسی پیدا کنند و برای آن منظور استفاده شوند.

اعلان متغیرها

نحو اعلان متغیر به شرح زیر است:

// ایجاد (بهتر است بگوییم، 'اعلان') متغیری به نام 'myVariable

new myVariable;

// کلمه کلیدی 'new' برای اعلان متغیر استفاده می‌شود
// در خط بالا متغیری با نام 'myVariable' اعلان شده
// نقطه ویرگول در انتها برای بستن دستور اعلان استفاده می‌شود.

نحو اعلان با نگاه کردن به چند مثال بهتر قابل درک است:

new var;
new ammo;
new score;
new vehicles;
new topScore;

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

new letters = 25;

در مثال بالا، متغیری به نام 'letters' اعلان می‌شود، با مقدار 25. علامت مساوی را متوجه خواهید شد که عملگر اختصاص ساده‌ای است که می‌تواند برای اختصاص مقدار به متغیرها استفاده شود. عبارت سمت راستش را ارزیابی می‌کند و مقدار نتیجه را به متغیر ارجاع داده شده در سمت چپش اختصاص می‌دهد. غیر از اختصاص مقدار مستقیماً در اعلان، می‌توانید در قسمت‌های بعدی کد نیز این کار را بکنید:

new letters;

letters = 25;

دامنه‌ها

تغییر مقدار متغیر فقط زمانی ممکن است که قسمت کدی که در آن متغیر را ارجاع می‌دهید در دامنه آن متغیر باشد. دامنه متغیر به بلوک کد یا موقعیتی که آن متغیر در آن اعلان شده بستگی دارد. برای مثال متغیری که خارج از هر بلوک کد، معمولاً در ابتدای اسکریپت اعلان شده، دامنه 'سراسری' دارد و می‌تواند از هر جایی در اسکریپت دسترسی پیدا کند:

#include <open.mp>

new g_var = 5;

public OnFilterScriptInit()
{
g_var = 10;

printf("The value is %i", g_var);

return 1;
}

public OnPlayerConnect(playerid)
{
g_var = 100;

printf("The value is %i", g_var);

return 1;
}

// Output :
// The value is 10
// The value is 100

// Note: The second output line is shown only when a player connects.

غیر از متغیرهای 'سراسری' (دامنه‌دار)، متغیرهای 'محلی' یا 'خصوصی' وجود دارند که فقط از داخل بلوک کدی که در آن اعلان شده‌اند قابل دسترسی هستند.

#include <open.mp>

public OnFilterScriptInit()
{
new localVar;

localVar = 5;

return 1;
}

public OnPlayerConnect(playerid)
{
localVar = 10; // This line will show an error upon compilation

return 1;
}

اگر سعی کنید کد بالا را کامپایل کنید، کامپایلر خطایی نشان خواهد داد که منطقی است چون متغیر محلی در بلوک کد کاملاً متفاوتی ارجاع داده شده. توجه: اگر بلوک کد تو در تو باشد آن‌گاه متغیر از آنجا قابل دسترسی است.

نکته مهمی که باید توجه کنید این است که نمی‌توانید متغیرها را با نام‌های یکسان اعلان کنید اگر دامنه‌هایشان تداخل داشته باشد. برای مثال اگر از قبل متغیری به نام 'score' در دامنه سراسری دارید، نمی‌توانید متغیر دیگری به نام 'score' در دامنه سراسری و همچنین محلی ایجاد کنید، و این برای طرف مقابل نیز صدق می‌کند (اگر از قبل متغیر محلی دارید، از اعلان متغیر سراسری با همان نام خودداری کنید).

#include <open.mp>

new g_score;

public OnFilterScriptInit()
{
new g_score = 5; // This line will show an error.
return 1;
}

قوانین نامگذاری

حالا که می‌دانید چگونه متغیر اعلان کنید، باید قوانین نامگذاری برای اعلان متغیر که در زیر فهرست شده‌اند را بدانید:

  • همه نام‌های متغیر باید با حرف یا زیرخط (_) شروع شوند
  • بعد از حرف اول ابتدایی، نام‌های متغیر می‌توانند حاوی حروف و اعداد باشند اما فاصله یا کاراکتر خاص نه.
  • نام‌های متغیر حساس به case هستند یعنی حروف بزرگ از حروف کوچک متمایز هستند.
  • استفاده از کلمه رزرو شده (کلمه کلیدی) به عنوان نام متغیر خطا خواهد داد.

مثال‌ها:

new new; // نادرست: استفاده از کلمه رزرو شده
new _new; // درست

new 10letters; // نادرست: نام شروع شده با عدد
new letters10; // درست
new letters_10; // درست

new my name; // نادرست: فاصله در نام
new my_name; // درست

new !nternet; // نادرست
new Internet; // درست

ذخیره انواع مختلف داده

بعد از آن، حالا بیایید نگاهی به چند مثال از انواع داده‌هایی که می‌توانند در متغیر ذخیره شوند و چگونه بیندازیم:

new letter = 'M';


new value = 100;


new decimalValue = 1.0;
// Works, but will show a compiler warning
// warning 213: tag mismatch


new engineOn = true;
// Works, and will not show a compiler warning but using a Tag is suggested


new sentence = "This is a sentence";
// Will show an error.
// error 006: must be assigned to an array

متغیر قادر است کاراکتر، مقدار integer، boolean (درست یا نادرست) و مقدار float (مقدار اعشاری) نگه دارد. کامنت‌ها در کد بالا نشان می‌دهند که ذخیره رشته در متغیر منجر به خطا می‌شود (چون رشته‌ها فقط در آرایه‌ها قابل ذخیره هستند). غیر از آن، اختصاص مقدار float به متغیر منجر به هشدار کامپایلر خواهد شد که می‌تواند با اضافه کردن 'تگ‌ها' از آن جلوگیری کرد. بدون تگ‌های صحیح، اسکریپت در کامپایل هشدار خواهد داد اما قابل اجرا خواهد بود. تگ‌ها به کامپایلر در مورد نوع داده‌ای که قرار است در متغیر ذخیره شود می‌گویند، که در نتیجه در قالب خطا یا هشدار به ما اطلاع می‌دهند اگر اشتباه برنامه-شکنی در کد بکنیم. مثال تگ‌ها:

new decimalValue = 1.0; // نادرست
new bool:decimalValue = 1.0 // نادرست
new Float:decimalValue = 1.0; // درست

new switchOn = 1.0; // نادرست
new switchOn = true; // نادرست، هشدار نشان نمی‌دهد
new bool:switchOn = true; // درست

استفاده از تگ‌های صحیح برای جلوگیری از هرگونه باگ یا خطا در حین اجرای برنامه مهم است.

Pawn که زبان بدون نوع است به ما اجازه می‌دهد انواع مختلف داده را در همان متغیر ذخیره کنیم که می‌تواند در برخی موارد مفید و در موارد دیگر دردسرساز باشد، اما چنین استفاده‌ای از متغیرها توصیه نمی‌شود.

#include <open.mp>

public OnFilterScriptInit()
{

new var;

var = 'a';
printf("%c", var);

var = 1;
printf("%d", var);

var = 1.0;
printf("%f", var);

var = true;
printf("%d", var); // prints a value 0 or 1

return 1;
}

// Output :
a
1
1.000000
1