[SKAN MŪZIKA]
DAGS LOIDS: Labi, tagad parunāsim par komandrindas argumentiem.
Tātad, līdz šim kursa laikā gandrīz visas jūsu programmas, iespējams,
ir sākušās šādi — int main void.
Mēs esam apkopojuši lietotāju ievades datus, ja mums tas ir
nepieciešams mūsu programmās, piemēram, programmā Mario, izmantojot
programmā ietvertas uzvednes.
Mums nebija jāmaina main prototips, jo tā vietā main funkcijā mēs
vienkārši sakām, ka varat to izsaukt, lai iegūtu int.
Cik lielu piramīdu jūs vēlaties?
Vai arī varat to izsaukt, lai iegūtu float — cik lielas izmaiņas man
vajadzētu izvadīt lietotājam?
Tomēr ir vēl viens veids, un, ja mēs vēlamies, lai lietotāji varētu
sniegt datus mūsu programmai izpildlaikā, nevis programmas darbības
laikā – šī ir smalka atšķirība, bet dažreiz ļoti noderīga – mums ir
nepieciešams jauns main funkcijas deklarēšanas veids.
Mēs nevaram izmantot int main void,, kad lietotājs palaiž programmu,
ja vēlamies komandrindā savākt citus datus, tātad komandrindas
argumentus.
Lai savāktu šos komandrindas argumentus no lietotāja, mainiet main
prototipu, lai tas izskatītos šādi: int main, atvērt apaļās iekavas,
int argc, komats, virkne argv, kvadrātiekavas un pēc tam atvērt
figūriekavas.
Tātad, ko tas jau nozīmē?
Nu, mēs nododam divus parametrus vai argumentus, vai ievades main
funkcijai.
Viens, vesels skaitlis ar nosaukumu argc, un otrs ir kas?
Tas ir virkņu masīvs, vai ne?
Mēs redzam šo kvadrātiekavas apzīmējumu.
Tas ir virkņu masīvs.
Tā nav atsevišķa virkne, tas ir virkņu masīvs.
Un šie divi argumenti, argc un argv, ļauj uzzināt, kādus datus
lietotājs ir norādījis komandrindā un cik daudz informācijas viņš ir
sniedzis komandrindā.
Diezgan noderīgas lietas, ar kurām strādāt.
Argc apzīmē argumentu skaitu, un, starp citu, jums vajadzētu zināt,
ka jūs varat saukt argc, kā vien vēlaties.
Jūs varējat saukt argv, kā vien vēlējāties.
Šie ir tikai tradicionāli nosaukumi, ko mēs lietojam — argumentu
skaits, un, kā mēs redzēsim otrajā – argumentu vektors, argv.
Bet jums tie nav jāsauc par argc un argv, ja jūs to nevēlaties, bet
parasti mēs to darām.
Jebkurā gadījumā, argc – argumentu skaits.
Tas ir vesela skaitļa tipa mainīgais, un tāpēc, kā jūs varētu
sagaidīt, ja mums ir divas lietas, kuras mēs gribētu noskaidrot – kas
ir ievadīts un cik daudz datu lietotājs ir ievadījis – argc mums
pateiks, cik daudz informācijas lietotājs ierakstīja.
Tādējādi tas sniedz komandrindas argumentu skaitu, ko lietotājs
ievadīja programmas izpildes laikā.
Tātad, ja jūsu programma ir palaista ar punkts slīpsvītra greedy, un
jūsu greedy programmāmain funkcijai ir prototips int main int argc,
virkne argv kvadrātiekavas, tad argc šajā gadījumā ir viens.
Tagad ievērojiet, ka mēs neskaitām, cik daudz informācijas lietotājs
ierakstīja pēc programmas nosaukuma.
Pats programmas nosaukums tiek uzskatīts par komandrindas argumentu.
Tātad punkts slīpsvītra greedy, tādā gadījumā argc ir viens.
Ja lietotājs komandrindā ierakstīja slīpsvītra greedy 1024 CS50, argc
šajā gadījumā būtu trīs.
Un mēs to zinām, jo veids, kā tiek noteikts sadalījums starp virknēm,
ir – vai starp tām ir atstarpe, tabulēšana vai kaut kas līdzīgs.
Tātad jebkurš, tā saukto, atstarpju daudzums starp komandrindas
vērtībām norāda, cik to ir.
Tātad punkts slīpsvītra greedy atstarpe 1024 atstarpe CS50, argc,
tādā gadījumā, ir trīs.
Argv ir argumentu vektors.
Vektors, starp citu, ir tikai vēl viens vārds masīvam, un tas ir
masīvs, kurā tiek saglabātas virknes.
Viena virkne katram elementam, kas ir virknes, kuras lietotājs
faktiski ierakstīja komandrindā, kad programma tika izpildīta.
Tagad, tāpat kā jebkura masīva gadījumā, ja atceraties mūsu diskusiju
par masīviem, pirmais argv elements vienmēr tiks atrasts argv nulle
kvadrātiekavās.
Tas ir pirmais argv masīva indekss.
Tātad tas — un patiesībā tas vienmēr būs programmas nosaukums –
vienmēr atradīsies argv nulle kvadrātiekavās.
Pēdējais argv elements vienmēr ir atrodams argv kvadrātiekavās argc
mīnus viens.
Vai redzat, kāpēc?
Atcerieties, cik daudz elementu ir šajā masīvā.
Nu, mēs to zinām - tas ir argc elementu skaits.
Ja lietotājs komandrindā ierakstīja trīs lietas, argc ir trīs.
Bet tāpēc, ka c valodā, kad mēs strādājam ar masīviem, katrs masīva
elements vai drīzāk masīva indeksi sākas ar nulli.
Ja mūsu masīvā ir trīs elementi, mums ir elements argv nulle,
elements argv viens un elements argv divi.
Elementa argv trīs nav un navmasīva ar garumu trīs.
Tāpēc argv pēdējo elementu vienmēr var atrast argv kvadrātiekavās
argc mīnus viens.
Tātad pieņemsim, ka lietotājs palaiž greedy programmu šādi — ja viņš
komandrindā ieraksta – punkts slīpsvītra greedy atstarpe 1024
atstarpe CS50, un kaut kāda iemesla dēļ mēs jau esam sagatavojuši
savu greedy programmu, lai tā zinātu un strādātu ar šīm komandrindas
argumentiem.
Mēs to nedarījām iepriekš, kad strādājām ar greedy problēmu, taču
pieņemsim, ka tagad esam to modificējuši tā, lai mēs kaut kādā veidā
apstrādātu komandrindas argumentus.
Šajā gadījumā – argv nulle ir punkts slīpsvītra greedy.
Kas ir argv viens?
Nu, tas ir 1024, vai ne?
Tas ir 1024, bet šeit ir patiešām svarīga atšķirība — vai atceraties
argv datu veidu?
Tas glabā virknes, vai ne?
Bet izskatās, ka 1024 ir vesels skaitlis.
Šī ir patiešām svarīga atšķirība, ar ko jūs faktiski varētu
saskarties vēlākās problēmās.
Viss argv tiek saglabāts kā virkne.
Tātad argv viens saturs ir virkne viens, nulle, divi, četri, kas
sastāv no šīm četrām rakstzīmēm.
Tas ir tā, it kā lietotājs būtu ierakstījis viens, nulle, divi, četri
kā atsevišķus burtus vai rakstzīmes.
Tas nav vesels skaitlis 1024, un tāpēc jūs nevarat strādāt ar to pa
tiešo, sakot int 1000 , bet drīzāk int x ir vienāds ar argv viens
mīnus 24.
Intuitīvi jūs varētu domāt par to šādi – Labi, tas ir 1024 mīnus 24,
tātad x ir vienāds ar 1000.
Bet patiesībā tas tā nav, jo argv viens ir virkne.
Virkne 1024.
Tagad ir funkcija, ko var izmantot, lai pārvērstu virknes veselos
skaitļos.
Es jums tagad nestāstīšu vairāk, taču esmu pārliecināts, ka Zamila ar
prieku pastāstīs par to turpmākās problēmas aprakstos.
Bet jūs varat arī atrast tādas problēmas kā — atvainojiet, funkcijas,
kas to darītu 50. atsaucē, ja dodaties uz atsauču rokasgrāmatu, jūs
varat atrast funkciju, kas veiktu šo konvertēšanu jūsu vietā.
Taču arī turpmākās problēmas izklāstā Zamila ar prieku pastāstīs,
kura funkcija pārveidos virkni 1024 par veselu skaitli 1024.
Labi, tātad uz priekšu.
Mēs esam aptvēruši savu argv nulle, mēs esam aptvēruši argv viens.
Kas ir argv divi?
Tas, iespējams, ir diezgan pašsaprotami.
Kas ir argv trīs?
Nu atkal mēs īsti nezinām, vai ne?
Mums ir masīvs ar garumu trīs,tik daudz elementu lietotājs ierakstīja
komandrindā, tāpēc, ja mēs pārejam uz argv trīs, mēs tagad pārkāpjam
mūsu masīva robežas.
Kompilators ļaus mums to izdarīt, ar to nav nekādu intuitīvu
problēmu, taču mēs nezinām, kas patiesībā notiks.
Tas ir atkarīgs no tā, kas atrodas atmiņā, kur varētu būt argv trīs.
Un tāpēc mēs varētu izkļūt nesodīti.
Visticamāk, jo īpaši, ja strādājat ar argv, nevis ar jebkuru citu
masīvu, kas ir mūsu programmā, iespējams, radīsies segmentācijas
kļūme.
Tāpēc vēlreiz noteikti nepārkāpjiet masīvu, īpaši argv, robežas,
ņemot vērā to lielo nozīmi jūsu programmās.
Es esmu Dags Loids.
Šis ir CS50.