1 00:00:00,000 --> 00:00:02,480 [SKAN MŪZIKA] 2 00:00:06,460 --> 00:00:09,350 DAGS LOIDS: Labi, tagad parunāsim par komandrindas argumentiem. 3 00:00:09,350 --> 00:00:12,855 Tātad, līdz šim kursa laikā gandrīz visas jūsu programmas, iespējams, 4 00:00:12,855 --> 00:00:16,360 ir sākušās šādi — int main void. 5 00:00:16,360 --> 00:00:18,570 Mēs esam apkopojuši lietotāju ievades datus, ja mums tas ir 6 00:00:18,570 --> 00:00:20,780 nepieciešams mūsu programmās, piemēram, programmā Mario, izmantojot 7 00:00:20,780 --> 00:00:22,990 programmā ietvertas uzvednes. 8 00:00:22,990 --> 00:00:26,837 Mums nebija jāmaina main prototips, jo tā vietā main funkcijā mēs 9 00:00:26,837 --> 00:00:30,684 vienkārši sakām, ka varat to izsaukt, lai iegūtu int. 10 00:00:30,684 --> 00:00:32,350 Cik lielu piramīdu jūs vēlaties? 11 00:00:32,350 --> 00:00:34,375 Vai arī varat to izsaukt, lai iegūtu float — cik lielas izmaiņas man 12 00:00:34,375 --> 00:00:36,400 vajadzētu izvadīt lietotājam? 13 00:00:36,400 --> 00:00:39,330 Tomēr ir vēl viens veids, un, ja mēs vēlamies, lai lietotāji varētu 14 00:00:39,330 --> 00:00:42,260 sniegt datus mūsu programmai izpildlaikā, nevis programmas darbības 15 00:00:42,260 --> 00:00:45,190 laikā – šī ir smalka atšķirība, bet dažreiz ļoti noderīga – mums ir 16 00:00:45,190 --> 00:00:48,120 nepieciešams jauns main funkcijas deklarēšanas veids. 17 00:00:48,120 --> 00:00:51,260 Mēs nevaram izmantot int main void,, kad lietotājs palaiž programmu, 18 00:00:51,260 --> 00:00:54,400 ja vēlamies komandrindā savākt citus datus, tātad komandrindas 19 00:00:54,400 --> 00:00:57,540 argumentus. 20 00:00:57,540 --> 00:01:01,322 Lai savāktu šos komandrindas argumentus no lietotāja, mainiet main 21 00:01:01,322 --> 00:01:05,105 prototipu, lai tas izskatītos šādi: int main, atvērt apaļās iekavas, 22 00:01:05,105 --> 00:01:08,887 int argc, komats, virkne argv, kvadrātiekavas un pēc tam atvērt 23 00:01:08,887 --> 00:01:12,670 figūriekavas. 24 00:01:12,670 --> 00:01:14,415 Tātad, ko tas jau nozīmē? 25 00:01:14,415 --> 00:01:16,912 Nu, mēs nododam divus parametrus vai argumentus, vai ievades main 26 00:01:16,912 --> 00:01:19,410 funkcijai. 27 00:01:19,410 --> 00:01:23,800 Viens, vesels skaitlis ar nosaukumu argc, un otrs ir kas? 28 00:01:26,430 --> 00:01:29,640 Tas ir virkņu masīvs, vai ne? 29 00:01:29,640 --> 00:01:31,140 Mēs redzam šo kvadrātiekavas apzīmējumu. 30 00:01:31,140 --> 00:01:32,181 Tas ir virkņu masīvs. 31 00:01:32,181 --> 00:01:35,110 Tā nav atsevišķa virkne, tas ir virkņu masīvs. 32 00:01:35,110 --> 00:01:38,113 Un šie divi argumenti, argc un argv, ļauj uzzināt, kādus datus 33 00:01:38,113 --> 00:01:41,116 lietotājs ir norādījis komandrindā un cik daudz informācijas viņš ir 34 00:01:41,116 --> 00:01:44,120 sniedzis komandrindā. 35 00:01:44,120 --> 00:01:46,570 Diezgan noderīgas lietas, ar kurām strādāt. 36 00:01:46,570 --> 00:01:49,585 Argc apzīmē argumentu skaitu, un, starp citu, jums vajadzētu zināt, 37 00:01:49,585 --> 00:01:52,600 ka jūs varat saukt argc, kā vien vēlaties. 38 00:01:52,600 --> 00:01:54,710 Jūs varējat saukt argv, kā vien vēlējāties. 39 00:01:54,710 --> 00:01:57,808 Šie ir tikai tradicionāli nosaukumi, ko mēs lietojam — argumentu 40 00:01:57,808 --> 00:02:00,907 skaits, un, kā mēs redzēsim otrajā – argumentu vektors, argv. 41 00:02:00,907 --> 00:02:03,238 Bet jums tie nav jāsauc par argc un argv, ja jūs to nevēlaties, bet 42 00:02:03,238 --> 00:02:05,570 parasti mēs to darām. 43 00:02:05,570 --> 00:02:07,500 Jebkurā gadījumā, argc – argumentu skaits. 44 00:02:07,500 --> 00:02:10,264 Tas ir vesela skaitļa tipa mainīgais, un tāpēc, kā jūs varētu 45 00:02:10,264 --> 00:02:13,029 sagaidīt, ja mums ir divas lietas, kuras mēs gribētu noskaidrot – kas 46 00:02:13,029 --> 00:02:15,794 ir ievadīts un cik daudz datu lietotājs ir ievadījis – argc mums 47 00:02:15,794 --> 00:02:18,559 pateiks, cik daudz informācijas lietotājs ierakstīja. 48 00:02:18,559 --> 00:02:20,514 Tādējādi tas sniedz komandrindas argumentu skaitu, ko lietotājs 49 00:02:20,514 --> 00:02:22,470 ievadīja programmas izpildes laikā. 50 00:02:22,470 --> 00:02:27,630 Tātad, ja jūsu programma ir palaista ar punkts slīpsvītra greedy, un 51 00:02:27,630 --> 00:02:32,790 jūsu greedy programmāmain funkcijai ir prototips int main int argc, 52 00:02:32,790 --> 00:02:37,950 virkne argv kvadrātiekavas, tad argc šajā gadījumā ir viens. 53 00:02:37,950 --> 00:02:40,270 Tagad ievērojiet, ka mēs neskaitām, cik daudz informācijas lietotājs 54 00:02:40,270 --> 00:02:42,590 ierakstīja pēc programmas nosaukuma. 55 00:02:42,590 --> 00:02:46,710 Pats programmas nosaukums tiek uzskatīts par komandrindas argumentu. 56 00:02:46,710 --> 00:02:51,770 Tātad punkts slīpsvītra greedy, tādā gadījumā argc ir viens. 57 00:02:51,770 --> 00:02:55,645 Ja lietotājs komandrindā ierakstīja slīpsvītra greedy 1024 CS50, argc 58 00:02:55,645 --> 00:02:59,520 šajā gadījumā būtu trīs. 59 00:02:59,520 --> 00:03:03,875 Un mēs to zinām, jo veids, kā tiek noteikts sadalījums starp virknēm, 60 00:03:03,875 --> 00:03:08,230 ir – vai starp tām ir atstarpe, tabulēšana vai kaut kas līdzīgs. 61 00:03:08,230 --> 00:03:11,975 Tātad jebkurš, tā saukto, atstarpju daudzums starp komandrindas 62 00:03:11,975 --> 00:03:15,720 vērtībām norāda, cik to ir. 63 00:03:15,720 --> 00:03:19,880 Tātad punkts slīpsvītra greedy atstarpe 1024 atstarpe CS50, argc, 64 00:03:19,880 --> 00:03:24,040 tādā gadījumā, ir trīs. 65 00:03:24,040 --> 00:03:26,600 Argv ir argumentu vektors. 66 00:03:26,600 --> 00:03:29,055 Vektors, starp citu, ir tikai vēl viens vārds masīvam, un tas ir 67 00:03:29,055 --> 00:03:31,510 masīvs, kurā tiek saglabātas virknes. 68 00:03:31,510 --> 00:03:35,370 Viena virkne katram elementam, kas ir virknes, kuras lietotājs 69 00:03:35,370 --> 00:03:39,230 faktiski ierakstīja komandrindā, kad programma tika izpildīta. 70 00:03:39,230 --> 00:03:42,536 Tagad, tāpat kā jebkura masīva gadījumā, ja atceraties mūsu diskusiju 71 00:03:42,536 --> 00:03:45,843 par masīviem, pirmais argv elements vienmēr tiks atrasts argv nulle 72 00:03:45,843 --> 00:03:49,150 kvadrātiekavās. 73 00:03:49,150 --> 00:03:51,800 Tas ir pirmais argv masīva indekss. 74 00:03:51,800 --> 00:03:55,765 Tātad tas — un patiesībā tas vienmēr būs programmas nosaukums – 75 00:03:55,765 --> 00:03:59,730 vienmēr atradīsies argv nulle kvadrātiekavās. 76 00:03:59,730 --> 00:04:04,160 Pēdējais argv elements vienmēr ir atrodams argv kvadrātiekavās argc 77 00:04:04,160 --> 00:04:08,590 mīnus viens. 78 00:04:08,590 --> 00:04:10,300 Vai redzat, kāpēc? 79 00:04:10,300 --> 00:04:14,180 Atcerieties, cik daudz elementu ir šajā masīvā. 80 00:04:14,180 --> 00:04:16,660 Nu, mēs to zinām - tas ir argc elementu skaits. 81 00:04:16,660 --> 00:04:21,279 Ja lietotājs komandrindā ierakstīja trīs lietas, argc ir trīs. 82 00:04:21,279 --> 00:04:25,734 Bet tāpēc, ka c valodā, kad mēs strādājam ar masīviem, katrs masīva 83 00:04:25,734 --> 00:04:30,190 elements vai drīzāk masīva indeksi sākas ar nulli. 84 00:04:30,190 --> 00:04:34,060 Ja mūsu masīvā ir trīs elementi, mums ir elements argv nulle, 85 00:04:34,060 --> 00:04:37,930 elements argv viens un elements argv divi. 86 00:04:37,930 --> 00:04:41,700 Elementa argv trīs nav un navmasīva ar garumu trīs. 87 00:04:41,700 --> 00:04:45,605 Tāpēc argv pēdējo elementu vienmēr var atrast argv kvadrātiekavās 88 00:04:45,605 --> 00:04:49,510 argc mīnus viens. 89 00:04:49,510 --> 00:04:52,418 Tātad pieņemsim, ka lietotājs palaiž greedy programmu šādi — ja viņš 90 00:04:52,418 --> 00:04:55,326 komandrindā ieraksta – punkts slīpsvītra greedy atstarpe 1024 91 00:04:55,326 --> 00:04:58,234 atstarpe CS50, un kaut kāda iemesla dēļ mēs jau esam sagatavojuši 92 00:04:58,234 --> 00:05:01,142 savu greedy programmu, lai tā zinātu un strādātu ar šīm komandrindas 93 00:05:01,142 --> 00:05:04,050 argumentiem. 94 00:05:04,050 --> 00:05:06,526 Mēs to nedarījām iepriekš, kad strādājām ar greedy problēmu, taču 95 00:05:06,526 --> 00:05:09,003 pieņemsim, ka tagad esam to modificējuši tā, lai mēs kaut kādā veidā 96 00:05:09,003 --> 00:05:11,480 apstrādātu komandrindas argumentus. 97 00:05:11,480 --> 00:05:15,720 Šajā gadījumā – argv nulle ir punkts slīpsvītra greedy. 98 00:05:15,720 --> 00:05:17,042 Kas ir argv viens? 99 00:05:17,042 --> 00:05:19,030 Nu, tas ir 1024, vai ne? 100 00:05:19,030 --> 00:05:22,720 Tas ir 1024, bet šeit ir patiešām svarīga atšķirība — vai atceraties 101 00:05:22,720 --> 00:05:26,410 argv datu veidu? 102 00:05:26,410 --> 00:05:31,020 Tas glabā virknes, vai ne? 103 00:05:31,020 --> 00:05:34,140 Bet izskatās, ka 1024 ir vesels skaitlis. 104 00:05:34,140 --> 00:05:37,170 Šī ir patiešām svarīga atšķirība, ar ko jūs faktiski varētu 105 00:05:37,170 --> 00:05:40,200 saskarties vēlākās problēmās. 106 00:05:40,200 --> 00:05:43,770 Viss argv tiek saglabāts kā virkne. 107 00:05:43,770 --> 00:05:47,022 Tātad argv viens saturs ir virkne viens, nulle, divi, četri, kas 108 00:05:47,022 --> 00:05:50,275 sastāv no šīm četrām rakstzīmēm. 109 00:05:50,275 --> 00:05:53,477 Tas ir tā, it kā lietotājs būtu ierakstījis viens, nulle, divi, četri 110 00:05:53,477 --> 00:05:56,680 kā atsevišķus burtus vai rakstzīmes. 111 00:05:56,680 --> 00:06:01,646 Tas nav vesels skaitlis 1024, un tāpēc jūs nevarat strādāt ar to pa 112 00:06:01,646 --> 00:06:06,613 tiešo, sakot int 1000 , bet drīzāk int x ir vienāds ar argv viens 113 00:06:06,613 --> 00:06:11,580 mīnus 24. 114 00:06:11,580 --> 00:06:14,750 Intuitīvi jūs varētu domāt par to šādi – Labi, tas ir 1024 mīnus 24, 115 00:06:14,750 --> 00:06:17,920 tātad x ir vienāds ar 1000. 116 00:06:17,920 --> 00:06:22,020 Bet patiesībā tas tā nav, jo argv viens ir virkne. 117 00:06:22,020 --> 00:06:23,940 Virkne 1024. 118 00:06:23,940 --> 00:06:26,339 Tagad ir funkcija, ko var izmantot, lai pārvērstu virknes veselos 119 00:06:26,339 --> 00:06:28,739 skaitļos. 120 00:06:28,739 --> 00:06:31,559 Es jums tagad nestāstīšu vairāk, taču esmu pārliecināts, ka Zamila ar 121 00:06:31,559 --> 00:06:34,380 prieku pastāstīs par to turpmākās problēmas aprakstos. 122 00:06:34,380 --> 00:06:37,526 Bet jūs varat arī atrast tādas problēmas kā — atvainojiet, funkcijas, 123 00:06:37,526 --> 00:06:40,673 kas to darītu 50. atsaucē, ja dodaties uz atsauču rokasgrāmatu, jūs 124 00:06:40,673 --> 00:06:43,820 varat atrast funkciju, kas veiktu šo konvertēšanu jūsu vietā. 125 00:06:43,820 --> 00:06:48,550 Taču arī turpmākās problēmas izklāstā Zamila ar prieku pastāstīs, 126 00:06:48,550 --> 00:06:53,280 kura funkcija pārveidos virkni 1024 par veselu skaitli 1024. 127 00:06:53,280 --> 00:06:54,560 Labi, tātad uz priekšu. 128 00:06:54,560 --> 00:06:56,726 Mēs esam aptvēruši savu argv nulle, mēs esam aptvēruši argv viens. 129 00:06:56,726 --> 00:06:58,000 Kas ir argv divi? 130 00:06:58,000 --> 00:07:01,350 Tas, iespējams, ir diezgan pašsaprotami. 131 00:07:01,350 --> 00:07:02,950 Kas ir argv trīs? 132 00:07:02,950 --> 00:07:04,970 Nu atkal mēs īsti nezinām, vai ne? 133 00:07:04,970 --> 00:07:08,200 Mums ir masīvs ar garumu trīs,tik daudz elementu lietotājs ierakstīja 134 00:07:08,200 --> 00:07:11,430 komandrindā, tāpēc, ja mēs pārejam uz argv trīs, mēs tagad pārkāpjam 135 00:07:11,430 --> 00:07:14,660 mūsu masīva robežas. 136 00:07:14,660 --> 00:07:18,775 Kompilators ļaus mums to izdarīt, ar to nav nekādu intuitīvu 137 00:07:18,775 --> 00:07:22,890 problēmu, taču mēs nezinām, kas patiesībā notiks. 138 00:07:22,890 --> 00:07:28,060 Tas ir atkarīgs no tā, kas atrodas atmiņā, kur varētu būt argv trīs. 139 00:07:28,060 --> 00:07:30,716 Un tāpēc mēs varētu izkļūt nesodīti. 140 00:07:30,716 --> 00:07:33,364 Visticamāk, jo īpaši, ja strādājat ar argv, nevis ar jebkuru citu 141 00:07:33,364 --> 00:07:36,012 masīvu, kas ir mūsu programmā, iespējams, radīsies segmentācijas 142 00:07:36,012 --> 00:07:38,660 kļūme. 143 00:07:35,548 --> 00:07:41,359 Tāpēc vēlreiz noteikti nepārkāpjiet masīvu, īpaši argv, robežas, 144 00:07:41,359 --> 00:07:47,170 ņemot vērā to lielo nozīmi jūsu programmās. 145 00:07:47,170 --> 00:07:48,100 Es esmu Dags Loids. 146 00:07:48,100 --> 00:07:50,170 Šis ir CS50.