[Powered by Google Translate] Gadewch i ni siarad am araeau. Felly byddai pam ein bod erioed wedi eisiau defnyddio araeau? Wel gadewch i ni ddweud eich bod yn cael rhaglen sydd angen i storio 5 IDs myfyrwyr. Gallai ymddangos yn rhesymol i gael 5 newidyn ar wahân. Am resymau byddwn yn gweld mewn ychydig, byddwn yn dechrau cyfrif o 0. Bydd y newidynnau bydd gennym fod id0 int, ID1 int, ac yn y blaen. Bydd unrhyw rhesymeg rydym am i berfformio ar ID bydd angen i'r myfyriwr eu copïo a gludo gyfer pob un o'r IDs myfyrwyr. Os ydym am wirio pa fyfyrwyr fydd yn digwydd i fod yn CS50, bydd angen inni yn gyntaf i wirio os id0 yn cynrychioli y myfyriwr yn y cwrs. Yna i wneud yr un peth ar gyfer y myfyriwr nesaf, bydd angen i gopïo a gludo y cod ar gyfer id0 ac amnewid pob digwyddiad o id0 gyda ID1 ac ati ar gyfer ID2, 3, a 4. Cyn gynted ag y byddwch yn clywed bod angen i gopïo a gludo, dylech ddechrau meddwl bod ateb gwell. Nawr beth os ydych yn sylweddoli nad oes angen 5 IDs myfyrwyr ond yn hytrach 7? Mae angen i chi fynd yn ôl i mewn i'ch cod ffynhonnell ac ychwanegu mewn id5, yn id6, a adysgrifia a bastio y rhesymeg i wirio a yw'r IDs yn perthyn i'r dosbarth ar gyfer y 2 IDs newydd. Nid oes dim sy'n cysylltu pob un o'r IDs gyda'i gilydd, ac felly nid oes unrhyw ffordd o ofyn y rhaglen i wneud hyn ar gyfer IDs 0 drwy 6. Wel nawr eich bod yn sylweddoli eich bod wedi 100 IDs myfyrwyr. Mae'n dechrau ymddangos yn llai na delfrydol i angen ar wahân ddatgan pob un o'r IDs, a chopïo a gludo unrhyw resymeg ar gyfer y rhai IDs newydd. Ond efallai rydym yn benderfynol, ac rydym yn ei wneud ar gyfer pob 100 o fyfyrwyr. Ond beth os nad ydych yn gwybod faint o fyfyrwyr yno mewn gwirionedd? Mae yna dim ond rhai myfyrwyr n a'ch rhaglen ofyn i'r defnyddiwr beth yw'r n yn. Uh oh. Nid yw hyn yn mynd i weithio'n dda iawn. Eich rhaglen ond yn gweithio am ryw nifer cyson o fyfyrwyr. Datrys yr holl broblemau hyn yw harddwch arrays. Felly beth yw amrywiaeth? Mewn rhai ieithoedd rhaglennu gallai fath amrywiaeth yn gallu gwneud ychydig yn fwy, ond yma byddwn yn canolbwyntio ar y strwythur amrywiaeth data sylfaenol yn union fel y byddwch yn ei weld yn C. Mae amrywiaeth yn unig yw bloc mawr o gof. Dyna ni. Pan rydym yn dweud, mae gennym gasgliad o 10 cyfanrifau, yn golygu mai dim ond mae gennym rai bloc o gof sydd yn ddigon mawr i ddal 10 gyfanrifau ar wahân. Gan dybio bod cyfanrif yw 4 bytes, mae hyn yn golygu bod amrywiaeth o 10 o gyfanrifau yn floc di-dor o 40 bytes mewn cof. Hyd yn oed pan fyddwch yn defnyddio araeau aml-ddimensiwn, ac ni fyddwn yn mynd i mewn i fan hyn, mae'n dal i fod dim ond bloc mawr o gof. Mae'r nodiant aml-ddimensiwn yn unig yw hwylustod. Os oes gennych 3 o 3 amrywiaeth aml-ddimensiwn o gyfanrifau, yna bydd eich rhaglen mewn gwirionedd dim ond yn trin hyn fel bloc mawr o 36 bytes. Mae cyfanswm o gyfanrifau yw 3 gwaith 3, ac mae pob cyfanrif yn cymryd fyny 4 bytes. Gadewch i ni edrych ar enghraifft sylfaenol. Gallwn weld yma 2 ffyrdd gwahanol o araeau datgan. Bydd rhaid i roi sylwadau 1 ohonynt allan ar gyfer y rhaglen i lunio ers i ni ddatgan x ddwywaith. Byddwn yn edrych ar rai o'r gwahaniaethau rhwng y 2 fath o ddatganiadau mewn ychydig. Mae'r ddau o'r llinellau hyn yn datgan amrywiaeth o N maint, lle rydym wedi diffinio # N yn 10. Gallem yr un mor hawdd fod wedi gofyn i'r defnyddiwr am gyfanrif positif a defnyddio y cyfanrif fel nifer o elfennau yn ein casgliad. Fel ein myfyrwyr enghraifft ID o'r blaen, mae hyn yn fath o fel datgan 10 yn gyfan gwbl ar wahân newidynnau dychmygol; x0, x1, x2, ac yn y blaen hyd at XN-1. Anwybyddu'r llinellau lle rydym yn datgan y casgliad, sylwch ar y cromfachau sgwâr yn gyfan gyfer y tu mewn i'r dolenni. Pan fyddwn yn ysgrifennu rhywbeth fel x [3], a 'n annhymerus' jyst darllen fel x braced 3, y gallwch chi feddwl am y peth hoffi gofyn am x3 dychmygol y. Hysbysiad nag gydag amrywiaeth o faint, N mae hyn yn golygu mai nifer y tu mewn cromfachau, y byddwn yn galw y mynegai, gall fod yn unrhyw beth o 0 i N-1, sef cyfanswm o fynegeion N. I feddwl am sut mae hyn yn gweithio mewn gwirionedd cofio bod y casgliad yn floc mawr o gof. Gan dybio bod cyfanrif yw 4 bytes, mae'r x casgliad cyfan yn floc 40 beit o gof. Felly x0 yn cyfeirio at y 4 cyntaf bytes y bloc. X [1] yn cyfeirio at y 4 bytes ac yn y blaen. Mae hyn yn golygu bod y dechrau x yw'r holl raglen erioed mae angen i gadw golwg ar. Os ydych am ddefnyddio x [400], yna mae'r rhaglen yn gwybod bod hyn yn cyfateb i ddim ond 1,600 bytes ar ôl dechrau'r x. Where'd rydym yn cael 1600 bytes o? Dim ond 400 o weithiau 4 bytes y cyfanrif. Cyn symud ymlaen, mae'n bwysig iawn i sylweddoli bod yn C nad oes gorfodaeth o'r mynegai yr ydym yn eu defnyddio yn y rhesi. Mae ein bloc mawr yw dim ond 10 cyfanrif hir, ond fydd dim yn gweiddi arnon ni os byddwn yn ysgrifennu x [20] neu hyd yn oed x [-5]. Nid yw'r mynegai yw hyd yn oed yn rhaid i fod yn rhif. Gall fod yn unrhyw fynegiant mympwyol. Yn y rhaglen rydym yn defnyddio'r i amrywiol o'r er dolen i mynegai i'r casgliad. Mae hwn yn batrwm cyffredin iawn, dolennu o i = 0 i hyd y rhesi, ac yna defnyddio'r i fel y mynegai ar gyfer y rhesi. Yn y ffordd yr ydych yn effeithiol ddolen dros y cyfan amrywiaeth, a gallwch naill ai aseinio i bob man yn yr amrywiaeth neu ei ddefnyddio ar gyfer rhai cyfrifiad. Yn y cyntaf ar gyfer ddolen, i ddechrau ar 0, ac felly bydd yn rhoi i'r fan a'r lle 0 yn y array, y gwerth 0 gwaith 2. Yna i cynyddrannau, ac rydym yn aseinio y fan a'r lle cyntaf yn y casgliad y gwerth 1 waith 2. Yna, unwaith eto i ychwanegiadau ac yn y blaen hyd nes i ni neilltuo i osod N-1 yn yr amrywiaeth y gwerth N-1 amser 2. Felly, rydym wedi creu amrywiaeth gyda'r 10 rhif cyntaf hyd yn oed. Efallai y byddai eilrifau wedi bod yn enw ychydig yn well ar gyfer y newidyn na x, ond a fyddai wedi rhoi pethau i ffwrdd. Yr ail ar gyfer ddolen yna dim ond argraffu'r gwerthoedd yr ydym wedi ei storio eisoes tu mewn y rhesi. Gadewch i ni geisio rhedeg y rhaglen gyda'r ddau fath o ddatganiadau amrywiaeth ac yn cymryd golwg ar allbwn y rhaglen. Cyn belled ag y gallwn weld, mae'r rhaglen yn ymddwyn yr un ffordd ar gyfer y ddau fath o ddatganiadau. Gadewch i ni hefyd edrych ar yr hyn fydd yn digwydd os byddwn yn newid y ddolen gyntaf i beidio aros yn N ond yn hytrach yn dweud 10,000. Ffordd y tu hwnt i ddiwedd y rhesi. Wps. Efallai eich bod wedi gweld hyn o'r blaen. Mae wall yn golygu bod eich rhaglen wedi chwalu. Byddwch yn dechrau gweld y rhain pan fyddwch yn cyffwrdd ardaloedd o gof na ddylech fod yn cyffwrdd. Yma rydym yn cyffwrdd 10,000 o leoedd y tu hwnt i ddechrau x, sy'n amlwg yn lle mewn cof na ddylem fod yn cyffwrdd. Felly, mae'r rhan fwyaf ohonom ni fyddai yn ôl pob tebyg yn ddamweiniol yn rhoi 10,000 yn hytrach na N, ond beth os ydym yn gwneud rhywbeth mwy cynnil fel dweud ysgrifennu yn llai na neu'n hafal i N yn y cyflwr ddolen ar gyfer yn hytrach na llai na N. Cofiwch bod amrywiaeth yn unig y mae mynegeion o 0 i N-1, sy'n golygu bod N mynegai y tu hwnt i ddiwedd y rhesi. Efallai na fydd y rhaglen damwain yn yr achos hwn, ond mae'n dal i fod yn gamgymeriad. Mewn gwirionedd, mae hyn gwall mor gyffredin ei fod wedi ei enw ei hun, oddi ar o 1 gwall. Dyna ni am y pethau sylfaenol. Felly, beth yw'r prif wahaniaethau rhwng y 2 fath o ddatganiadau amrywiaeth? Un gwahaniaeth yw lle y mae'r bloc mawr o gof yn mynd. Yn y datganiad cyntaf, a byddaf yn galw'r math braced-array, er bod hyn nid yw enw confensiynol, bydd yn mynd ar y pentwr. Tra yn yr ail, y byddaf yn galw'r math pwyntydd-array, bydd yn mynd ar y domen. Mae hyn yn golygu pan fydd y ffurflenni swyddogaeth, bydd yr amrywiaeth braced yn awtomatig yn cael ei deallocated, tra fel y mae'n rhaid i chi explicitily ffoniwch am ddim ar y casgliad pwyntydd neu fel arall gennych ollyngiad cof. Yn ogystal, nid yw'r amrywiaeth braced mewn gwirionedd yn newidyn. Mae hyn yn bwysig. Mae'n dim ond symbol. Gallwch chi feddwl am y peth fel gyson bod y casglwr yn dewis ar eich cyfer chi. Mae hyn yn golygu na allwn wneud rhywbeth fel x + + yn ôl y math braced, er bod hyn yn hollol ddilys â'r math pwyntydd. Mae'r math pwyntydd yn newidyn. Ar gyfer y math pwyntydd, mae gennym 2 bloc ar wahân o gof. Mae'r newidyn x ei hun yn cael ei storio yn y pentwr, ac yn unig yw pwyntydd sengl, ond mae'r bloc mawr o gof yn cael ei storio ar y domen. Mae'r x amrywiol ar y simnai yn unig yn storio'r cyfeiriad y bloc mawr o gof ar y domen. Un o oblygiadau'r hyn yw gyda maint y gweithredwr. Os byddwch yn gofyn am y maint y rhesi braced, bydd yn rhoi maint y bloc mawr y cof, rhywbeth fel 40 bytes, ond os byddwch yn gofyn am faint y math pwyntydd o amrywiaeth, bydd yn rhoi maint y newidyn x ei hun, sydd ar yr offer yn debygol o dim ond 4 bytes. Gan ddefnyddio'r math pwyntydd-array, mae'n amhosibl uniongyrchol ofyn am maint y bloc mawr o gof. Nid yw hyn fel arfer yn llawer o gyfyngiad ers i ni anaml iawn am gael y maint y bloc mawr y cof, a gallwn fel arfer yn cyfrifo os ydym ei angen. Yn olaf, yr amrywiaeth braced yn digwydd i roi i ni gyda shortcut i ymgychwyn arae. Gadewch i ni weld sut y gallem ysgrifennu'r 10 cyntaf cyfanrifau hyd yn oed ddefnyddio y initilization shortcut. Gyda'r amrywiaeth pwyntydd, nid oes ffordd o wneud llwybr byr fel hyn. Mae hyn yn unig cyflwyniad i'r hyn y gallwch ei wneud gyda arrays. Maent yn arddangos i fyny yn bron pob rhaglen a ysgrifennwch. Gobeithio y gallwch yn awr weld ffordd well o wneud y myfyriwr IDs enghraifft o ddechrau'r y fideo. Fy enw i yw Rob Bowden, ac mae hyn yn CS50.