c da int main nimani anglatadi. int main() va int main(void) o'rtasidagi farq? Rasmiy va haqiqiy parametrlar

Asosiy funktsiya.

Har bir C va C++ dasturlarida asosiy funksiya bo'lishi kerak; va uni qaerga qo'yish sizga bog'liq. Ba'zi dasturchilar uni faylning boshiga, ba'zilari esa oxiriga joylashtiradilar. Biroq, uning pozitsiyasidan qat'i nazar, siz quyidagilarni eslab qolishingiz kerak: "Asosiy" funktsiyaga argumentlar. Borland C++ boshlang'ich protsedurasi asosiy funktsiyaga uchta parametr (argument) yuboradi: argc, argv va env. - argc, butun son, asosiy funktsiyaga yuborilgan buyruq qatori argumentlari soni, - argv - satrlarga ko'rsatgichlar massivi (char *). DOS 3.x va undan keyingi versiyalarida argv ishga tushiriladigan dasturning to'liq yo'li sifatida aniqlanadi. DOS ning oldingi versiyalarida ishlayotganda argv null satrga ("") ishora qiladi. argv dastur nomidan keyingi birinchi buyruq qatoriga ishora qiladi. argv dastur nomidan keyingi ikkinchi buyruq qatoriga ishora qiladi. argv asosiyga yuborilgan oxirgi argumentga ishora qiladi. argv tarkibida NULL mavjud. - env ​​shuningdek, satrlarga ko'rsatgichlar massividir. Har bir env elementi ENVVAR=value shaklidagi qatorni o'z ichiga oladi. ENVVAR - PATH yoki 87 kabi muhit o'zgaruvchisining nomi.<значение>bu berilgan muhit oʻzgaruvchisining qiymati, masalan C:\DOS;C:\TOOLS (PATH uchun) yoki YES (87 uchun). Ammo shuni yodda tutingki, agar siz ushbu argumentlarning ba'zilarini ko'rsatsangiz, ularni quyidagi tartibda ko'rsatishingiz kerak: argc, argv, env. Masalan, quyidagi argument deklaratsiyasi amal qiladi: main() main(int argc) /* amal qiladi, lekin unchalik yaxshi emas */ main(int argc, char *argv) main(int argc, char *argv, char *env) Main (int) argc deklaratsiyasi) unchalik qulay emas, chunki parametrlar sonini bilgan holda, siz ularga o'zingiz kirish imkoniga ega emassiz. Env argumentiga har doim environ global o'zgaruvchisi orqali kirish mumkin. Environ o'zgaruvchisiga (3-bobda) va putenv va getenv funktsiyalariga (2-bobda) qarang. argc va argv parametrlari _argc va _argv o'zgaruvchilari orqali ham mavjud. Argc, argv va env dan foydalanadigan misol dastur. Bu asosiy funktsiyaga uzatilgan argumentlardan foydalanishning eng oddiy usulini ko'rsatadigan ARGS.EXE dasturining namunasidir. /* ARGS.C dasturi */ #include #o'z ichiga oladi void main(int argc, char *argv, char *env) ( int i; printf("argc qiymati %d \n\n",argc); printf("Buyruqlar satrida %d parametr mavjud \n\ n" ,argc); uchun (i=0; i<=argc; i++) printf(" argv[%d]: %s\n",i,argv[i]); printf("Среда содержит следующие строки:\n"); for (i=0; env[i] != NULL; i++) printf(" env[%d]: %s\n",i,env[i]); return 0; } Предположим, что вы запускаете программу ARGS.EXE со следующей командной строкой: C:> args first_arg "bo'shliqlar bilan arg" 3 4 "oxirgi, lekin bir" to'xtash! E'tibor bering, dastur chaqiruvidagi "bo'sh joylar bilan argument" va "oxirgi, lekin bitta" misolida ko'rsatilganidek, siz argumentni qo'sh tirnoq ichiga olish orqali bo'sh joylar bilan yuborishingiz mumkin. Dasturni ishga tushirish natijasida siz shunday bir narsaga ega bo'lasiz: argc qiymati 7 Buyruqlar qatorida 7 ta parametr mavjud argv: c:\turboc\testargs.exe argv: first_arg argv: arg bo'sh argv: 3 argv: 4 argv: oxirgi, lekin bitta argv: to'xtang! Muhit quyidagi qatorlarni o'z ichiga oladi: env: COMSPEC=C:\COMMAND.COM env: PROMPT=$p $g env: PATH=C:\SPRINT;C:\DOS;C:\BC Buyruqning maksimal umumiy uzunligi asosiy funktsiyaga yuborilgan satr (shu jumladan bo'shliqlar va dasturning nomi) 128 belgidan oshmasligi kerak; Bular DOS cheklovlari. Buyruq satridan qochish belgilari Buyruqlar qatori argumentlari qochish belgilarini o'z ichiga olishi mumkin. Biroq, ular argumentga mos keladigan barcha fayl nomlari uchun kengaytirilishi mumkin, masalan, DOS nusxa ko'chirish buyrug'i bilan. Escape belgilaridan foydalanish uchun dasturni bog'lovchi bilan bog'lashda Borland C++ bilan birga kelgan WILDARGS.OBJ obyekt faylini kiritish kerak. Agar WILDARGS.OBJ fayli dasturingizga biriktirilgan bo'lsa, buyruq satrida "*.*" kabi argumentlardan foydalanishingiz mumkin. Bunday holda, ushbu niqobga mos keladigan barcha fayllarning nomlari argv massiviga kiritiladi. Argv massivining maksimal hajmi faqat dinamik xotira maydonining o'lchamiga bog'liq. Agar berilgan niqob uchun mos fayllar topilmasa, u holda argument buyruq satrida yozilgan shaklda uzatiladi. (Ya'ni, asosiy funktsiyaga qochish belgilarini o'z ichiga olgan qator uzatiladi). Ikki tirnoq ichida ("...") argumentlar kengaytirilmaydi. Misol. Quyidagi buyruqlar ARGS.C faylini kompilyatsiya qiladi va uni WILDARGS.OBJ moduliga bog'laydi va natijada olingan ARGS.EXE dasturini ishga tushiradi: bcc args wildarg.obj args C:\BORLANDC\INCLUDE\*.H "*.C" ARGS.EXE dasturini ishga tushirganda, birinchi argument Borland C++ INCLUDE katalogidagi H kengaytmali barcha fayllar nomiga kengayadi. E'tibor bering, barcha qatorlar to'liq marshrutni o'z ichiga oladi (masalan, C:\TC\INCLUDE\ALLOC.H). *.C argumenti kengaytirilmaydi, chunki qo'shtirnoq ichiga olinadi. Agar siz Integrated Environment (BC.EXE) da ishlayotgan bo'lsangiz, u holda loyiha menyusida loyiha fayli nomini ko'rsatish kifoya, unda quyidagi qatorlar bo'lishi kerak: ARGS WILDARGS.OBJ Keyin, "Ishga tushirish/Argumentlar" " buyruqlarida siz buyruq qatori parametrlarini o'rnatishingiz kerak. Izoh. Agar siz qochish belgilarini qayta ishlash har doim sodir bo'lishini istasangiz, ya'ni. WILDARGS.OBJ havola muharriri tomonidan avtomatik ravishda bog'lanishi uchun siz standart C?.LIB kutubxonangizni WILDARGS.OBJ faylini o'z ichiga oladigan tarzda o'zgartirishingiz kerak. Buning uchun kutubxonadan SETARGV-ni olib tashlang va WILDARGS-ni qo'shing. Buni quyidagi buyruqlar yordamida amalga oshirish mumkin (biz standart kutubxonalar va WILDARGS.OBJ joriy katalogda joylashgan deb taxmin qilamiz): TLIB Foydalanuvchi qo‘llanmasining 7-bobida, Utilitalarda tasvirlangan. tlib cs -setargv +wildargs tlib cc - setargv +wildargs tlib cm -setargv +wildargs tlib cl -setargv +wildargs tlib ch -setargv +wildargs -p kaliti yordamida kompilyatsiya qilish (Paskal chaqiruvi konventsiyasi) Agar dasturingizni Paskal chaqiruv konventsiyasidan foydalanib kompilyatsiya qilsangiz (9-bobda batafsil tavsiflangan " Assambleya tili bilan interfeys", "Dasturchi qo'llanmasi"), siz asosiy funktsiya aniq C funktsiyasi sifatida e'lon qilinishi kerakligini yodda tutishingiz kerak. Buni yordamida amalga oshirish mumkin. kalit so'z cdecl shunga o'xshash narsa: cdecl main(int argc, char *argv, char *env) Asosiy funksiya tomonidan qaytarilgan qiymat. Asosiy funktsiya dasturning chiqish kodi bo'lgan qiymatni qaytaradi: bu butun son. Biroq, agar sizning dasturingiz chiqish uchun chiqish (yoki _exit) funksiyasidan foydalansa, qaytariladigan qiymat ushbu funktsiyaning argumenti bo'ladi. Misol uchun, agar sizning dasturingizda chaqiruv mavjud bo'lsa: exit(1) u holda chiqish kodi 1 bo'ladi. Agar dasturni ishga tushirish uchun Borland C++ integratsiyalashgan muhitidan (BC.EXE) foydalansangiz, u holda asosiy faylning qaytish qiymatini ko'rishingiz mumkin. "Fayl | Ma'lumot olish" ni tanlash orqali funksiyani tanlang.

53/85 sahifa

1.5.3. Parametrlarni asosiy funktsiyaga o'tkazish

C dasturini bajarishni boshlaydigan asosiy funktsiyani tashqi muhitdan, masalan, buyruq satridan uzatiladigan parametrlar bilan aniqlash mumkin. Tashqi muhit ma'lumotlarni ko'rsatish uchun o'z qoidalariga ega, to'g'rirog'i, barcha ma'lumotlar belgilar qatorlari shaklida taqdim etiladi. Ushbu satrlarni asosiy funktsiyaga o'tkazish uchun ikkita parametr ishlatiladi, birinchi parametr uzatiladigan satrlar sonini uzatish uchun ishlatiladi, ikkinchisi satrlarning o'zini uzatish uchun ishlatiladi. Ushbu parametrlarning umumiy (lekin shart emas) nomlari argc va argv. argc parametri int tipidagi bo'lib, uning qiymati buyruq qatorini tahlil qilish natijasida hosil bo'ladi va buyruq satridagi so'zlar soniga, shu jumladan chaqirilgan dastur nomiga teng (so'z bo'sh joy bo'lmagan har qanday matndir) belgi). argv parametri har birida buyruq satridan bitta so'z bo'lgan satrlarga ko'rsatgichlar massividir. Agar so'z bo'sh joy belgisini o'z ichiga olishi kerak bo'lsa, uni buyruq qatoriga yozishda qo'shtirnoq ichiga olinishi kerak.

Asosiy funktsiya uchinchi parametrga ham ega bo'lishi mumkin, u odatda argp deb ataladi va C dasturlash tilida dastur bajariladigan operatsion tizim (muhit) parametrlarini asosiy funktsiyaga o'tkazish uchun xizmat qiladi.

Asosiy funktsiya sarlavhasi quyidagicha ko'rinadi:

Agar, masalan, C dasturlash tilidagi dasturning buyruq qatori quyidagicha ko'rinsa:

Javob:\>cprog "C dasturi" 1

u holda argc, argv, argp argumentlari 1-rasmdagi diagrammada ko'rsatilgandek xotirada ifodalanadi.

Argc[4]
argv --> -->
-->
-->
-->
argp --> -->
-->
-->
-->
1-rasm. Buyruqlar qatori parametrlari tartibi

Operatsion tizim argc, argv, argp parametrlari uchun qiymatlarni uzatishni qo'llab-quvvatlaydi va asosiy funktsiyaga haqiqiy argumentlarni o'tkazish va ulardan foydalanish foydalanuvchining javobgarligidir.

Quyidagi misol operatsion tizim va operatsion tizim parametrlaridan asosiy funktsiyaga o'tkazilgan haqiqiy argumentlarni chop etadigan dasturdir.

Misol:
int main (int argc, char *argv, char *argp)
( int i=0;
printf("\nDastur nomi %s", argv);
uchun (i=1; i>=argc; i++)
printf("\n argument %d - %s", argv[i]);
printf("\nOperatsion tizim sozlamalari:");
esa (*argp)
(printf ("\n %s",*argp);
argp++;
}
qaytish (0);
}

Operatsion tizim parametrlariga geteuv kutubxonasi funksiyasi yordamida ham kirish mumkin; uning prototipi quyidagicha ko'rinadi:

char *geteuv (const char *varname);

Ushbu funktsiyaning argumenti muhit parametrining nomini belgilaydi, uning qiymatiga ko'rsatgich geteuv funktsiyasi tomonidan qaytariladi. Belgilangan parametr hozirda muhitda aniqlanmagan bo'lsa, qaytarish qiymati NULL bo'ladi.

Geteuv funktsiyasi tomonidan olingan ko'rsatkichdan foydalanib, siz faqat operatsion tizim parametrining qiymatini o'qishingiz mumkin, lekin uni o'zgartira olmaysiz. Puteuv funktsiyasi tizim parametrining qiymatini o'zgartirish uchun ishlatiladi.

C dasturlash tili kompilyatori C dasturini shunday quradiki, dasturning boshida ba'zi bir ishga tushirish amalga oshiriladi, shu jumladan, asosiy funktsiyaga o'tkazilgan argumentlarni qayta ishlash va unga atrof-muhit parametrlarining qiymatlarini uzatish. Bu amallar _setargv va _seteuv kutubxona funksiyalari tomonidan bajariladi, ular kompilyator tomonidan doimo asosiy funksiyadan oldin joylashtiriladi.

Agar C dasturlash tilidagi dastur operatsion tizim parametrlarining argumentlari va qiymatlarini uzatishdan foydalanmasa, u holda C dasturiga dasturlash tilida joylashtirish orqali kutubxonaning _setargv va _seteuv funksiyalaridan foydalanishni taqiqlash tavsiya etiladi, asosiy funksiyadan oldin bir xil nomli, lekin hech qanday harakatni (stublarni) bajarmaydigan funktsiyalar. Bu holda dasturning boshlanishi quyidagicha ko'rinadi:

setargv()
}
-seteuv()
(qaytish; /* bo'sh funksiya */
}
int main()
( /* argumentlarsiz asosiy funksiya */
...
...
qaytish (0);
}

Yuqoridagi dasturda kutubxona funksiyalarini _setargv va _seteuv chaqirishda foydalanuvchi dasturga joylashtirgan funksiyalardan foydalaniladi va hech qanday amalni bajarmaydi. Bu hosil bo'lgan exe faylining hajmini sezilarli darajada kamaytiradi.

Borland C++ main() ga uchta argumentni qo'llab-quvvatlaydi. Birinchi ikkitasi an'anaviy argc va argv. Bular ANSI C standarti tomonidan belgilangan main() uchun yagona argumentlar bo‘lib, ular buyruq qatori argumentlarini dasturga o‘tkazish imkonini beradi. Buyruqlar qatori argumentlari - bu operatsion tizimning buyruq satrida dastur nomidan keyin keladigan ma'lumotlar. Misol uchun, dastur Borland line kompilyatori yordamida kompilyatsiya qilinganda, u odatda bcc deb yoziladi dastur_nomi

Qayerda dastur_nomi kompilyatsiya qilinishi kerak bo'lgan dasturdir. Dastur nomi kompilyatorga argument sifatida uzatiladi.

argc parametri buyruq qatori argumentlari sonini o'z ichiga oladi va butun sondir. U har doim kamida 1 ga teng, chunki dastur nomi birinchi argument sifatida mos keladi. argv parametri belgilar ko'rsatkichlari massiviga ko'rsatgichdir. Ushbu massivning har bir elementi buyruq qatori argumentiga ishora qiladi. Barcha buyruq qatori argumentlari satrlardir. Barcha raqamlar dastur tomonidan ichki formatga aylantiriladi. Quyidagi dastur to'g'ridan-to'g'ri dastur nomidan keyin kiritilganda "Salom" so'ng foydalanuvchi nomini chop etadi:

#o'z ichiga oladi

{
if(argc!=2)
{
printf("Ismingizni yozishni unutdingiz\n");
qaytish 1;
}
printf("Salom %s", argv);
qaytish 0;
}

Agar siz ushbu dastur nomini chaqirsangiz va foydalanuvchi nomi Sergey bo'lsa, dasturni ishga tushirish uchun quyidagilarni yozishingiz kerak:
ismi Sergey.
Dastur natijasida quyidagilar paydo bo'ladi:
"Salom Sergey."

Buyruqlar qatori argumentlari bo'sh joylar yoki yorliqlar bilan ajratilishi kerak. Vergul, nuqtali vergul va shunga o'xshash belgilar chegaralovchi hisoblanmaydi. Masalan:

Uch qatordan iborat, esa

Herb, Rik, Fred

Bu bitta qator - vergullar chegaralovchi emas.

Agar siz bo'shliqlar yoki yorliqlarni o'z ichiga olgan qatorni bitta argument sifatida o'tkazishingiz kerak bo'lsa, uni qo'sh tirnoq ichiga olishingiz kerak. Masalan, bu bitta dalil:

"bu sinov"

Argv ni to'g'ri e'lon qilish muhimdir. Eng tipik usul:

Bo'sh qavslar massivning belgilangan uzunligiga ega emasligini ko'rsatadi. Kirishingiz mumkin individual elementlar argv indekslashdan foydalanish. Masalan, argv har doim dastur nomini o'z ichiga olgan birinchi qatorga ishora qiladi. argv keyingi qatorga ishora qiladi va hokazo.

Quyida buyruq qatori argumentlaridan foydalanishning kichik misoli keltirilgan. U buyruq satrida ko'rsatilgan qiymatdan pastga sanaydi va u nolga yetganda signal beradi. E'tibor bering, birinchi argumentda standart atoi() funksiyasi yordamida butun songa aylantirilgan raqam mavjud. Agar ikkinchi argument sifatida "displey" qatori mavjud bo'lsa, u holda hisoblagichning o'zi ekranda ko'rsatiladi.

/* hisoblash dasturi */

#o'z ichiga oladi
#o'z ichiga oladi
#o'z ichiga oladi
int main (int argc, char *argv)
{
int disp, hisoblash;
agar (argc<2)
{
printf("Hisob uzunligini kiritishingiz kerak\n");
printf("buyruqlar qatorida. Qayta urinib ko'ring.\n");
qaytish 1;
}
agar (argc==3 && !strcmp(argv,"displey")) disp = 1;
Aks holda disp = 0;
for(count=atoi(argv); count; -count)
if (disp) printf("%d ", hisoblash);
printf("%c", "\a"); /* ko'pgina kompyuterlarda bu qo'ng'iroq */
qaytish 0;
}

E'tibor bering, agar argumentlar ko'rsatilmagan bo'lsa, xato xabari paydo bo'ladi. Bu, agar dasturni to'g'ri ma'lumotsiz ishga tushirishga urinilgan bo'lsa, ko'rsatmalar berish uchun buyruq qatori argumentlaridan foydalanadigan dasturlar uchun odatiy holdir.

Shaxsiy buyruq qatori belgilariga kirish uchun argv-ga ikkinchi indeks qo'shing. Misol uchun, quyidagi dastur o'zi chaqirilgan barcha argumentlarni bir vaqtning o'zida bitta belgi bilan chop etadi:

#o'z ichiga oladi
int main (int argc, char *argv)
{
int t, i;
uchun(t=0; t {
i = 0;
while(argv[t][i])
{
printf("%c", argv[t][i]);
}
printf("");
}
qaytish 0;
}

Shuni esda tutishimiz kerakki, birinchi indeks satrga kirish uchun, ikkinchisi esa satrdagi belgiga kirish uchun.

Odatda argc va argv manba buyruqlarini olish uchun ishlatiladi. Nazariy jihatdan 32767 tagacha argumentga ega bo'lish mumkin, ammo ko'pchilik operatsion tizimlar bunga yaqinlashishga ham ruxsat bermaydi. Odatda bu argumentlar fayl nomi yoki parametrlarini belgilash uchun ishlatiladi. Buyruqlar qatori argumentlaridan foydalanish dasturga professional ko'rinish beradi va dasturni ommaviy ish fayllarida ishlatishga imkon beradi.

Borland C++ bilan ta'minlangan WILDARGS.OBJ faylini qo'shsangiz, *.EXE tipidagi argumentlarda shablonlardan foydalanishingiz mumkin. (Borland C++ joker belgilarni avtomatik tarzda boshqaradi va argc ni mos ravishda oshiradi.) Masalan, agar siz WILDARGS.OBJ ni quyidagi dasturga ulasangiz, u buyruq satrida ko'rsatilgan fayl nomiga qancha fayl mos kelishini aytib beradi:

/* Ushbu dasturni WILDARGS.OBJ bilan bog'lang */

#o'z ichiga oladi
int main (int argc, char *argv)
{
ro'yxatdan o'tish int i;
printf("%d ta fayl belgilangan nomga mos keladi\n", argc-1);
printf("Ular:");
uchun (i=1; i printf("%s ", argv[i]);
qaytish 0;
}

Agar biz ushbu dasturni WA deb atasak, uni quyidagicha ishga tushiramiz, biz EXE kengaytmali fayllar sonini va ushbu fayllar nomlari ro'yxatini olamiz:

argc va argv-dan tashqari, Borland C++ uchinchi buyruq qatori -env argumentini ham taqdim etadi. env parametri dasturga operatsion tizim muhiti haqidagi ma'lumotlarga kirish imkonini beradi. env parametri argc va argv ga amal qilishi kerak va quyidagicha e'lon qilinadi:

Ko'rib turganingizdek, env argv bilan bir xil tarzda e'lon qilinadi. Xuddi argv kabi, u qatorlar qatoriga ko'rsatgichdir. Har bir satr operatsion tizim tomonidan belgilangan muhit qatoridir. env parametrida qancha muhit qatorlari mavjudligini ko'rsatadigan ekvivalent argc parametri yo'q. Buning o'rniga, muhitning oxirgi qatori null. Quyidagi dastur hozirda operatsion tizimda aniqlangan barcha muhit satrlarini chop etadi:

/* bu dastur atrof-muhitning barcha qatorlarini ko'rsatadi */

#o'z ichiga oladi
int main (int argc, char *argv, char *env)
{
int t;
for(t=0; env[t]/ t++)
printf("%s\n", env[t]);
qaytish 0;
}

E'tibor bering, argc va argv dastur tomonidan ishlatilmasa ham, ular parametrlar ro'yxatida bo'lishi kerak. C parametr nomlarini bilmaydi. Buning o'rniga, ulardan foydalanish parametrlarni e'lon qilish tartibi bilan belgilanadi. Aslida, parametrni o'zingiz yoqtirgan narsani chaqirishingiz mumkin. argc, argv va env anʼanaviy nomlar boʻlgani uchun dasturni oʻqiyotgan har bir kishi bu main() funksiyasining argumentlari ekanligini bir zumda tushunishi uchun ulardan foydalanishda davom etgan maʼqul.

Dasturlar uchun odatiy vazifa atrof-muhit qatorida aniqlangan qiymatni qidirishdir. Masalan, PATH liniyasining mazmuni dasturlarga qidiruv yo'llaridan foydalanish imkonini beradi. Quyidagi dastur standart qidiruv yo'llarini e'lon qiladigan satrlarni qanday topishni ko'rsatadi. U quyidagi prototipga ega bo'lgan strstr() standart kutubxona funksiyasidan foydalanadi:

Char *strstr(const char *str1, const char *str2);

strstr() funksiyasi str1 tomonidan ko'rsatilgan satrni str2 tomonidan ko'rsatilgan satrda qidiradi. Agar shunday satr topilsa, birinchi pozitsiyaga ko'rsatgich qaytariladi. Hech qanday moslik topilmasa, funktsiya NULLni qaytaradi.

/* dastur atrof-muhit satrlari orasida PATH ni o'z ichiga olgan qatorni qidiradi */

#o'z ichiga oladi
#o'z ichiga oladi
int main (int argc, char *argv, char *env)
{
int t;
for(t=0; env[t]; t++)
{
if(strstr(env[t], "PATH"))
printf("%s\n", env[t]);
}
qaytish 0;
}

Har qanday C dasturi main() funksiyasiga qo'ng'iroq qilish bilan boshlanadi. Ushbu funktsiya har bir dasturda bo'lishi kerak.

Boshqa har qanday funktsiya singari, main() funksiyasi ham parametrlarga ega bo'lishi mumkin. Ba'zan dasturni ishga tushirishda unga ba'zi ma'lumotlarni uzatish foydali bo'ladi. Ushbu ma'lumot buyruq qatori argumentlari yordamida main() ga uzatiladi. Buyruqlar qatori argumentlari- bu dasturni ishlab chiqish muhitidan tashqarida bajarish uchun dastur ishga tushirilganda dastur nomidan keyin buyruq satriga kiritiladigan ma'lumotlar. Masalan, task.cpp faylini arxivlashni boshlash uchun buyruq satriga quyidagilarni kiritishingiz kerak:

winrar bosh vazifatask.cpp // winrar.exe bosh vazifatask.cpp

bu erda winrar arxivchi dasturining nomi va qatorlar " a», « archTask"Va" vazifa. cpp» dasturga arxiv yaratishni buyuradigan buyruq qatori argumentlarini ifodalaydi (" a") Nomi bilan archTask bitta fayldan vazifa. cpp.

Parametrlarni main() funktsiyasiga o'tkazishda u quyidagicha aniqlanishi kerak:

int main(int argc, char *argv) ( ) // yoki void main(...)()

argc parametri buyruq satridagi argumentlar sonini o'z ichiga oladi va butun son bo'lib, u har doim kamida 1 bo'ladi, chunki birinchi argument har doim dastur nomi (dasturning to'liq yo'li bilan dastur nomi).

argv parametri satrlarga ko'rsatgichlar massiviga ko'rsatgichdir. Ushbu massivda har bir element keyingi buyruq qatori argumentiga ishora qiladi. Bo'sh kvadrat qavslar massivning noaniq uzunlikka ega ekanligini ko'rsatadi. Siz argv massivini indekslash orqali individual argumentlarga kirishingiz mumkin. Masalan, argv birinchi belgilar qatoriga ishora qiladi, bu har doim dastur nomi; argv birinchi argumentga ishora qiladi va hokazo. Argumentlar ro'yxati NULL bilan cheklangan, ya'ni. argv == NULL.

Buyruqlar qatori argumentlaridan birining individual belgisiga kirish uchun argv-dagi ikkinchi indeksdan foydalanishingiz kerak. Ya'ni, argv birinchi indeksi satrga kirishni, ikkinchi indeks esa uning individual belgilariga kirishni ta'minlaydi.

Barcha buyruq qatori argumentlari satrlardir, shuning uchun raqamli parametrlarni kerakli formatga o'tkazish dasturda ishlab chiqilganda ta'minlanishi kerak.

Ramziy formatdagi raqamlarni butun va haqiqiy sonlarga aylantirishning turli usullariga ega dasturga misol:

#o'z ichiga oladi

#o'z ichiga oladi

// ishga tushirishda biz, masalan, quyidagi argumentlarni o'rnatamiz: 100 2.7

void main(int a, char *b) (

k = strtol(b, &ptr, 10); // ptr = satrdagi xato manzili

f = strtod(b, &ptr);

sscanf(b, "%d", &k);

sscanf(b, "%lf", &f);

argc va argv nomlari an'anaviy, lekin shart emas. main() funksiyasidagi bu ikki parametrni xohlaganingizcha chaqirish mumkin.

Buyruqlar qatori argumentlaridan foydalanishning oddiy misoli:

int main(int argc, char *argv) (

agar (argc != 4) (

printf("Dasturni ishga tushirish parametrlari noto'g'ri!\n");

k = atoi(argv); // raqam parametrini konvertatsiya qilish

printf("Assalomu alaykum, %d yildagi %s guruhidan %s",

Agar dasturning nomi vazifa bo'lsa va sizning ismingiz "Vasya" bo'lsa, birinchi yildan boshlab "PM-11" guruhi bo'lsa, dasturni ishga tushirish uchun buyruq satriga kirishingiz kerak:

Vasya PM-11 1 topshirig'i

Dasturni bajarish natijasida ekranda quyidagi xabar paydo bo'ladi: "Salom, Vasya 1-kurs PM-11 guruhidan."

E'tibor bering, agar barcha buyruq qatori argumentlari berilmasa, xato xabari ko'rsatiladi. Buyruqlar qatori argumentlarini oladigan dasturlar ko'pincha quyidagilarni bajaradi: Foydalanuvchi ushbu dasturlarni kerakli ma'lumotlarni kiritmasdan ishga tushirganda, ular argumentlarni qanday to'g'ri ko'rsatish bo'yicha ko'rsatmalarni ko'rsatadi.

Buyruqlar qatori argumentlari bo'sh joy bilan ajratilishi kerak. Agar argumentning o'zida bo'shliqlar mavjud bo'lsa, unda bir nechta argumentlar keltirishiga yo'l qo'ymaslik uchun bu argument qo'sh tirnoq ichiga olinishi kerak. Natijada, keltirilgan butun qator bitta argument hisoblanadi. Masalan, dasturni quyidagicha ishga tushirish mumkin: topshiriq "Vasya va Petya" PM-21 2. Dasturni bajarish natijasida ekranda xabar paydo bo'ladi: "Salom, Vasya va Petya 2-kursdan PM- 21 guruh."

char *argv nima? Bu elementlari ko'rsatgich bo'lgan massiv, ya'ni ko'rsatkichlar massivi. Bu shuni anglatadiki, parametrlarni main() ga o'tkazishda uni quyidagicha aniqlash mumkin:

void main(int argc, char **argv) (

Vazifa. Barcha buyruq qatori argumentlarini ko'rsatish (dastur nomini ko'rsatish shart emas).

#o'z ichiga oladi

void main(int argc, char *argv)(

uchun (i = 1; i< argc; i++)

printf("%s\n", argv[i]);

Ikkinchi variant ================

#o'z ichiga oladi

void main(int argc, char **argv)(

while((p=*argv) != NULL) (

printf("%s\n", p);

Odatda, buyruq qatori argumentlari dasturni ishga tushirishda kerak bo'ladigan dastlabki ma'lumotlar bilan ta'minlash uchun ishlatiladi (masalan, buyruq qatori argumentlari ko'pincha fayl nomi yoki dasturni ishga tushirish parametrlari kabi ma'lumotlarni uzatadi).

Agar dastur buyruq qatori parametrlarini talab qilmasa, main() funksiyasi parametrlar roʻyxatidagi void kalit soʻzidan foydalanadi (yoki shunchaki hech narsani koʻrsatmaydi).

Qanday nosozliklarni tuzatish kerak Miloddan avvalgi buyruq qatori argumentlarini talab qiladigan dasturlar. Run→Arguments... menyusiga buyruq qatori argumentlarini kiritish kerak. Dastur nomini ko'rsatishning hojati yo'q. Keyin odatdagidek dasturni ishlab chiqish muhitida ishga tushirishingiz va disk raskadrovka qilishingiz mumkin.

Iltimos, ushbu saytda AdBlock-ni to'xtatib turing.

Xo'sh, nima uchun bizga maxsus funktsiyalar kerak? Dasturchilarga dastur yozishni osonlashtirish uchun foydalanuvchi tomonidan belgilangan funksiyalar kerak.

Esingizda bo'lsin, biz dasturlash paradigmalari, aniqrog'i tuzilgan dasturlash haqida gapirgan edik. U erda asosiy g'oya shundan iborat ediki, har qanday dastur faqat uchta asosiy konstruktsiyalar yordamida yozilishi mumkin: kuzatish, shart va tsikl. Endi biz ushbu tuzilmalarga yana birini qo'shamiz - "kichik dasturlar" va yangi paradigmaga ega bo'lamiz protsessual dasturlash".

Yagona farq shundaki, biz asosiy dasturimizning alohida qismlarini (xususan, takrorlanuvchilarini) alohida funktsiyalar (pastki dasturlar, protseduralar) shaklida yozamiz va kerak bo'lganda ularni chaqiramiz. Aslida, dastur endi turli funktsiyalarning o'zaro ta'sirini tasvirlaydi.

Shunday qilib, ushbu o'quv qo'llanmada biz ichki funktsiyalar qanday qurilganligini batafsil muhokama qilamiz. Shuningdek, biz o'z shaxsiy funksiyalarimizni qanday yaratishni o'rganamiz.

Funktsiyalar qanday ishlaydi

Keling, birinchi darsdagi ma'lumotlarni eslaylik. Barcha funktsiyalar, shu jumladan foydalanuvchi tomonidan yozilgan funktsiyalar ham xuddi shunday tartibga solingan. Ular ikkita asosiy qismdan iborat: funktsiya sarlavhasi va funktsiya tanasi.

Ro'yxat 1.

Int main(void)( // funktsiya sarlavhasi // funktsiya tanasi jingalak qavs ichida yozilgan)

Funktsiyaning tanasi bilan hamma narsa aniq: u funksiya uchun algoritmni tavsiflaydi. Keling, sarlavhani ko'rib chiqaylik. U uchta majburiy qismdan iborat:

  • qaytish turi;
  • funktsiya nomi;
  • funktsiya argumentlari.

Birinchidan, qaytish turi yoziladi, masalan, int , asosiy funktsiyadagi kabi. Agar funktsiya dasturga hech qanday qiymat qaytarmasa, u holda bu joyda void kalit so'zi yoziladi. Ko'rinishidan, funktsiya hech narsa qaytarmagani uchun hech narsa yozishning hojati yo'q. Ilgari, aytmoqchi, bu C tilida qilingan, ammo keyin uni bir xillik uchun qo'shgan. Hozirgi vaqtda zamonaviy kompilyatorlar, agar siz qaytarish turini ko'rsatmasangiz, ogohlantirish/xatolar chiqaradi.
Ayrim dasturlash tillarida hech qanday qiymat qaytarmaydigan funksiyalar protseduralar deb ataladi (masalan, Paskal). Bundan tashqari, funktsiyalar va protseduralarni yaratish uchun turli xil sintaksislar mavjud. C tilida bunday kamsitish yo'q.

Funksiya nomi qaytish turidan keyin yoziladi. Xo'sh, nomdan keyin funktsiyaga uzatiladigan argumentlar turlari va soni ko'rsatilgan.

Keling, biz allaqachon tanish bo'lgan funktsiyalarning sarlavhalarini ko'rib chiqaylik.

Ro'yxat 2.

// butun sonni oladigan srand nomli funksiya hech narsani qaytarmaydi void srand(int) // haqiqiy floatni oladigan sqrt nomli funksiya float floatni qaytaradi sqrt(float) // rand nomli funktsiya argumentlarni qabul qilmaydi, butun sonni qaytaradi int rand(void) //pow nomli funktsiya double tipidagi ikkita argumentni oladi, double double pow(double, double) tipidagi haqiqiy sonni qaytaradi.

O'z funktsiyangizni qanday yaratishingiz mumkin

O'z funktsiyangizni yaratish uchun siz uni to'liq tavsiflashingiz kerak. Bu erda umumiy qoida qo'llaniladi: uni ishlatishdan oldin, qanday ishlashi kerakligini e'lon qiling va tavsiflang. Buni amalga oshirish uchun biz birinchi darsda bo'lgan C tilidagi dastur tuzilmasi sxemasiga qaytaylik. Unda funksiyalarni tavsiflash mumkin bo'lgan joylarni belgilaymiz.

1-rasm Dastur tuzilmasini aniqlashtirish. Funktsiyalar deklaratsiyasi.

Ko'rib turganingizdek, buni amalga oshirish mumkin bo'lgan ikkita joy mavjud.

Keling, maksimal ikkita raqamni hisoblash uchun maxsus funktsiyani yaratishni ko'rsatadigan misolni ko'rib chiqaylik.

Ro'yxat 3.

#o'z ichiga oladi // max_num nomli maxsus funksiyani e'lon qilish // kiritish: a va b nomli ikkita butun son parametrlari // chiqish: ikkita argumentning maksimali int max_num(int a, int b)( int max = b; agar (a > b) max = a; maks qaytish; ) //asosiy dastur int main(void) ( int x = 0, y = 0; int m = 0; scanf("%d %d", &x, &y); m = max_num( x ,y); printf("maks(%d,%d) = %d\n",x,y,m); 0 qaytarish; )

Keling, ushbu dastur qanday ishlashini batafsil tasvirlab beraman. Asosiy funktsiyaning tanasi bajariladi. X, y va m butun sonli o‘zgaruvchilar yaratiladi. X va y o'zgaruvchilar klaviaturadan o'qiladi. Aytaylik, biz 3 5 ni kiritdik, keyin x = 3, y = 5. Bularning barchasi sizga aniq bo'lishi kerak. Endi keyingi qator

Ro'yxat 4.

M = maksimal_son(x,y);

m o'zgaruvchisi = belgisining o'ng tomonidagi narsaga tayinlanishi kerak. U erda biz o'zimiz yaratgan funktsiyaning nomiga egamiz. Kompyuter ushbu funktsiyaning deklaratsiyasi va tavsifini qidiradi. U yuqorida joylashgan. Ushbu deklaratsiyaga ko'ra, bu funktsiya ikkita butun qiymatni qabul qilishi kerak. Bizning holatlarimizda bular x va y o'zgaruvchilarda yozilgan qiymatlardir. Bular. 3 va 5 raqamlari. E'tibor bering, funktsiyaga x va y o'zgaruvchilari emas, balki ularda saqlanadigan qiymatlar (ikkita raqam) o'tadi. Funksiya dasturda chaqirilganda unga haqiqatda uzatiladigan narsa funksiyaning haqiqiy parametrlari deyiladi.

Endi max_num funksiyasi bajarila boshlaydi. Birinchi qadam funktsiya sarlavhasida tasvirlangan har bir parametr uchun alohida vaqtinchalik o'zgaruvchini yaratishdir. Bizning holatlarimizda a va b nomli ikkita butun o'zgaruvchi yaratiladi. Ushbu o'zgaruvchilarga haqiqiy parametrlarning qiymatlari beriladi. Funktsiya sarlavhasida tasvirlangan parametrlarning o'zi rasmiy parametrlar deb ataladi. Shunday qilib, a va b rasmiy parametrlariga mos ravishda 3 va 5 haqiqiy parametrlarning qiymatlari beriladi. Endi a = 3, b = 5. Bundan tashqari, funktsiya ichida biz bu o'zgaruvchilar bilan oddiy o'zgaruvchilar kabi ishlashimiz mumkin.

max nomli butun sonli o‘zgaruvchi yaratiladi va unga b qiymati beriladi. Keyin a > b sharti tekshiriladi. Agar bu rost bo'lsa, maksimal o'zgaruvchidagi qiymat bilan almashtirilishi kerak.

Keyin qaytish bayonoti keladi, u chaqiruvchi dasturga (asosiy funktsiya) max o'zgaruvchida yozilgan qiymatni qaytaradi, ya'ni. 5 . Shundan so'ng a, b va max o'zgaruvchilari xotiradan o'chiriladi. Va biz chiziqqa qaytamiz

Ro'yxat 5.

M = maksimal_son(x,y);

max_num funksiyasi 5 qiymatini qaytardi, ya'ni endi = belgisining o'ng tomonida 5 yozilgan. Bu qiymat m o'zgaruvchisiga yoziladi. Keyin ekranda chiziq ko'rsatiladi va dastur tugaydi.

Dastur qanday ishlashini to'liq tushunish uchun oxirgi 4 paragrafni diqqat bilan o'qing.

Ayni paytda men sizga nima uchun funksiya tavsiflarining pastki bloki kerakligini aytaman. Tasavvur qiling-a, siz o'zingizning dasturingizda 20 ta kichik funktsiyani yozgansiz. Va ularning barchasi asosiy funktsiyadan oldin tasvirlangan. Uzoq vaqt davomida asosiy dasturga kirish juda qulay emas. Ushbu muammoni hal qilish uchun funktsiyalarni pastki blokda tasvirlash mumkin.

Ammo u erda butun funktsiya kodini shunchaki o'tkazish mumkin bo'lmaydi, chunki keyin qoida buziladi: biror narsani ishlatishdan oldin uni e'lon qilish kerak. Ushbu muammoning oldini olish uchun siz funktsiya prototipidan foydalanishingiz kerak.

Funktsiya prototipi funksiya sarlavhasini to'liq takrorlaydi, undan keyin ; . Yuqori blokda prototipni ko'rsatib, pastki qismida biz funktsiyani to'liq tavsiflashimiz mumkin. Yuqoridagi misol uchun u quyidagicha ko'rinishi mumkin:

Ro'yxat 6.

#o'z ichiga oladi int max_num(int, int); int main(void) ( int x =0, y = 0; int m = 0; scanf("%d %d", &x, &y); m = max_num(x,y); printf("max(%d) ,%d) = %d\n",x,y,m);qaytish 0; ) int max_num(int a, int b)( int max = b; agar (a > b) max = a; qaytish maks; )

Hammasi juda oddiy. E'tibor bering, funktsiya prototipi rasmiy parametrlarning nomlarini ko'rsatishi shart emas, shunchaki ularning turlarini ko'rsatish kifoya. Yuqoridagi misolda men aynan shunday qildim.