توی این قسمت میخوام یکم در باره argument های تابع مین صحبت کنیم و روش کار با اون ها.

اگه شما توی Dev تا حالا پروژه باز کرده باشید ، قطعا دیدید که وقتی کد جدید باز میکنی ، تابع main رو به این صورت مینویسه : 

int main(int argc, char** argv)

 حالا اینا چی هستن و چه معنی ای دارن؟

این ها ، در اصل آرگومان های تابع مین هستن. وقتی سیستم عامل ، داره برنامه رو اجرا میکنه ، این آرگومان ها رو به تابع شما پاس میده ( در ادامه میبینیم که چطوری میشه این مقدار ها رو عوض کرد. فعلا برای این که اشتباه نشه میگم ، سیستم چیزی از خودش پاس نمی ده. کاربر میگه که چی ها پاس بده ).

اول ببینیم این ها چی هستن. دو تا ورودی داریم : 
  1. یه عدد. این عدد تعداد ورودی هاست. 
  2. یه آرایه دو بعدی از کاراکتر. این آرایه ، حاوی تمام چیز هاییه که کاربر به تابع پاس داده. در حقیقت ، چند رشته هست. تعداد این رشته ها ، توی ورودی اول هست.

حالا میریم ببینیم این ورودی ها چی هست دقیقا. محیط CMD رو در نظر بگیرید ، اونجا ما یه دستور مینویسیم و جلوش یه سری عبارت مینویسیم که برای سیستم قابل درکه مثلا : 
attrib -a -s

اینجا متد های "a-" و "s-" به برنامه attrib.exe پاس داده میشه. یعنی  argc = 2 و argv = آرایه شامل -a و -s.

حالا میخوایم یه برنامه ساده بنویسیم که چند تا عدد رو بگیره و سورت کنه. منتها این که با چه ترتیبی سورت کنه ( صعودی یا نزولی ) توی پارامتر ها تعیین میشه. اگه پارامتر -a بهش داده شد ، صعودی مرتب میکنه و اگر هم پارامتر -s بهش داده شد، نزولی. وگرنه اعدادو همونطوری خروجی میده.

#include <iostream>

using namespace std;

int main(int argc, char** argv) 
{
	int n, nums[100];
	// get n and n numbers
	cin>>n;
	for(int i = 0;i < n; i++)
	{
		cin>>nums[i];
	}
	
	if(argc != 1)
	{
		if(argv[1][0] == '-' && argv[1][1] == 'a')// -a
		{
			// sorting . . . 
			for (int i = 0;i < n;i++)
			{
				for(int j = 0; j < n - 1;j++)
				{
					if(nums[j] < nums[j + 1])
					{
						int temp = nums[j];
						nums[j] = nums[j + 1];
						nums[j + 1] = temp;
					}
				}
			}
		}
		if(argv[1][0] == '-' && argv[1][1] == 's')// -s
		{
			// sorting . . .
			for (int i = 0;i < n;i++)
			{
				for(int j = 0; j < n - 1;j++)
				{
					if(nums[j] > nums[j + 1])
					{
						int temp = nums[j];
						nums[j] = nums[j + 1];
						nums[j + 1] = temp;
					}
				}
			}
		}
	}
	
	cout<<"\n";
	for(int i = 0;i < n; i++)
	{
		cout<<nums[i]<<"\t";
	}
	return 0;
}

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

حالا میخوایم این برنامه رو اجرا کنیم و ببینیم چی میشه. اگه همینطوری اجرا کنید ، میبینید که عدد ها رو مرتب نمی کنه ( چون آرگومانی به تابع main نفرستادید) برای این که دو تا راه داریم : 
  1. استفاده از CMD : در قسمت سرچ ویندوز عبارت CMD را بنویسید و کامند پرامپت را اجرا کنید. با استفاده از دستور cd موقعیت خود را به جایی که برنامه ( فایل .exe) قرار دارد تغییر دهید. و نام برنامه را همراه با پسوند آن بنویسید. حال اگر دستوراتی را در مقابل نام برنامه ( با اسپیس فاصله ایجاد کنید و اینتر را نزنید ) بنویسید ، این دستورات به عنوان آرگومان های تابع main به برنامه داده میشوند. به محض فشردن enter برنامه اجرا میشود. 
  2. استفاده از کامپالر : شما میتوانید در تنظیمات کامپایلر خود ، آرگومان ها را مشخص کنید. به عنوان مثال در Dev در منوی execute وارد قسمت parameters شوید و آرگومان های مورد نظر را تایپ کنید یا در visual studio وارد تنظیمات پروژه شوید ( در آموزش قبلی برای اضافه کردن فایل .lib توضیح داده شد.) و به منوی debugging رفته و در قسمت command arguments آرگومان های مورد نظر را وارد کنید.
حال شما میتوانید این برنامه ها را به دستورات CMD در کامپیوتر شخصی خودتان تبدیل کنید. کافی است فایل اگزه برنامه را در آدرس زیر کپی کنید:
C:\Windows\SysWOW64

حالا دیگه میتونید از این برنامه خودتون ، مثل بقیه دستورای CMD استفاده کنید.