[Powered by Google Translate] [Kafli 6] [öruggari]
[Rob Bowden] [Harvard University]
[Þetta er CS50.] [CS50.TV]
>> Við getum höfuð kafla okkar spurningum.
Ég sendi slóðina á rúm áður.
Upphaf hluta spurninga segja-
greinilega er ég ekki alveg heilbrigðra-er mjög auðvelt spurning
um bara hvað er valgrind?
Hvað gerir valgrind gera?
Einhver vilja til að segja hvað valgrind gerir?
[Nemandi] Eftirlit minni leka.
Já, valgrind er almennt minni afgreiðslumaður.
Það, að lokum, segir þér ef þú ert með minni lekur,
sem er að mestu leyti það sem við erum að nota það fyrir því ef þú vilt að
gera vel í vandamál setja eða ef þú vilt
fá á stóru borð, þú þarft að hafa ekkert minni lekur alls,
og ef þú ert með minni leka sem þú getur ekki fundið,
einnig að hafa í huga að þegar þú opnar skrá
og ef þú loka það ekki, það er minni leka.
>> A einhver fjöldi af fólk ert útlit fyrir sumir hnút sem þeir eru ekki frjáls
þegar í raun, gerðu þeir ekki loka orðabók í fyrsta skrefi.
Hún segir þér einnig ef þú hefur einhverjar ógild les eða skrifar,
sem þýðir að ef þú reynir og setja inn gildi
það er út í lok hrúga og það gerist ekki að seg kenna
en valgrind veiðir það, eins og þú ættir í raun ekki að vera að skrifa þar,
og svo þú örugglega ætti ekki að hafa neitt af þeim heldur.
Hvernig notar þú valgrind?
>> Það er almenn spurning um
konar keyra hana og líta á the framleiðsla.
The framleiðsla er yfirþyrmandi mikið af sinnum.
Það er líka gaman villur þar ef þið hafið einhverjar hræðilega rangur hlutur
gerast í lykkju, þá mun það að lokum segja: "Allt of margar villur.
Ég ætla að hætta að telja núna. "
Það er í grundvallaratriðum texta framleiðsla sem þú þarft að flokka.
Á endanum, það mun segja þér hvaða minni leka sem þú hefur,
hversu margar blokkir sem getur verið gagnlegt vegna
ef það er ein blokk unfreed, þá er það yfirleitt auðveldara að finna
en 1.000 blokkir unfreed.
1.000 blokkir unfreed þýðir líklega að þú ert ekki frjáls
tengd listum viðeigandi eða eitthvað.
Það er valgrind.
>> Nú höfum við okkar hluti af spurningum,
sem þú þarft ekki að sækja.
Þú getur smellt á nafnið mitt og draga þá upp í rúm.
Nú smellur á mig.
Útgáfa 1 verður stakkur, sem við erum að gera fyrst.
Revision 2 verður biðröð og Revision 3 verður eintengdum lista.
Byrjun burt með stafla okkar.
Eins og segir hér, stafla er einn af the undirstöðu,
grundvallaratriði gögn uppbygging af tölvunarfræði.
Mjög dæmigerðu dæmi er
stafla af stæði í matsal.
Það er í grundvallaratriðum þegar þú ert að kynna að stafla,
einhver er að fara að segja, "Ó, eins og stafla af stæði."
Þú stafla stæði upp.
Svo þegar þú ferð að draga bakkanum,
fyrsta bakki sem er að fá dreginn er sá síðasti sem var sett á mánudaginn.
Stafla líka-eins og það segir hér-
við höfum hluti af minni kallast stafla.
Og hvers vegna er það kallað að stafla?
>> Því eins og gögn stafla uppbyggingu,
það ýtir og birtist stakkur ramma á mánudaginn,
þar stafla rammar eru eins og tiltekið kalli virka.
Og eins og stakkur, þú verður alltaf að snúa aftur
frá virka símtalinu áður en þú getur fengið niður í lægri stafla ramma aftur.
Þú getur ekki hafa helstu kalla foo kalla bar og bar aftur til helstu beint.
Það er alltaf got að fylgja rétta stafla ýta og pabbi.
Þessar tvær aðgerðir, eins og ég sagði, eru ýta og pop.
Þeir eru algild hugtök.
Þú ættir að vita ýta og skjóta á hvað stafla sama hvað.
Við munum sjá biðraðir eru konar öðruvísi.
Það skiptir í raun ekki hafa alhliða tíma, en ýta og pop eru alhliða fyrir stöflum.
Push er bara sett á stafla.
Pop er að taka af stafla.
Og við sjáum hér höfum typedef strúktúr stafla okkar,
þannig að við höfum bleikju ** strengi.
Ekki fá ekki hrædd við allir. **
Þetta er að fara að enda að vera fylki af strengjum
eða fylki af ábendingum til stafi, þar sem
ábendingum til stafi hafa tilhneigingu til að vera strengir.
Það þarf ekki að vera strengir, en hér, þeir eru að fara að vera strengir.
>> Við höfum fjölda strengi.
Við höfum stærð, sem sýnir hversu margir þættir eru nú á mánudaginn,
og svo við höfum getu, sem er hversu margir þættir geta verið á mánudaginn.
Getu ætti að byrja á sem eitthvað meira en 1,
en stærð er að fara að byrja á eins og 0.
Nú, það eru í grundvallaratriðum þrjár mismunandi leiðir sem þú getur hugsa um stafla.
Jæja, það eru sennilega fleiri, en tveir helstu leiðir eru
þú getur innleiða það með því að nota array, eða þú getur innleiða það með tengda listanum.
Tengdir listar eru konar léttvæg til að stafla frá.
Það er mjög auðvelt að gera stafla með tengd listum,
svo hér erum við að fara að gera stafla með fylki,
og nota fylki, það er líka tvær leiðir til að hugsa um það.
Áður, þegar ég sagði að við höfum getu til að stafla,
svo við getum að passa þáttur á mánudaginn.
>> Eina leiðin sem það gæti gerst er eins fljótt og þú högg 10 þætti, þá þú ert að gera.
Þú gætir vita að það er efri mörk 10 hlutum í heiminum
að þú munt aldrei hafa fleiri en 10 hluti á stafla þinn,
en í því tilviki er hægt að hafa efri bundið á stærð stafla þinn.
Eða þú gætir hafa stafla þín takmarkalaus,
en ef þú ert að gera óákveðinn greinir í ensku fylking, sem þýðir að í hvert einasta skipti sem þú högg 10 þætti,
þá þú ert að fara að þurfa að vaxa til 20 þætti, og þegar þú högg 20 þætti,
þú ert að fara að vaxa array til 30 þætti eða 40 atriði.
Þú ert að fara að þurfa að auka getu, sem er það sem við erum að fara að gera hér.
Hvert einasta skipti sem við ná hámarks stærð stafla okkar,
þegar við ýta eitthvað annað á, við erum að fara að þurfa að auka getu.
Hér höfum við ýta lýst sem bool ýta (char * STR).
Char * STR er band sem við erum að þrýsta á mánudaginn,
og bool segir bara hvort við tekist eða ekki.
>> Hvernig getum við ekki?
Hvað er eina aðstæður sem hægt er að hugsa um
þar sem við þyrftum að skila falskur?
Já.
[Nemandi] Ef það er fullt og við erum með takmarkað framkvæmd.
Já, hvernig skilgreina-hann við svarað
Ef það er fullt og við erum með takmarkað framkvæmd.
Þá munum við örugglega aftur rangar.
Um leið og við högg 10 hluti í fylking, getum við ekki passa 11, svo við aftur rangt.
Hvað ef það er takmarkalaus? Já.
Ef þú getur ekki auka úrval fyrir sumir ástæða.
Já, þannig að minni er takmörkuð auðlind,
og að lokum, ef við halda að ýta hlutum á mánudaginn aftur og aftur,
við erum að fara að reyna að úthluta stærri array til að passa
stærri getu og malloc eða hvað við erum að nota er að fara að skila falskur.
Jæja, malloc aftur null.
>> Mundu, hvert einasta skipti sem þú hringir alltaf malloc, ættir þú að athuga að sjá hvort það
skilar null eða annað það er réttmæti frádráttar.
Þar sem við viljum hafa takmarkalaus stafla,
eina málið sem við erum að fara að vera aftur rangt er ef við reynum að
auka getu og malloc eða hvað skilar falskur.
Þá tekur pop engin rök,
og það skilar streng sem er efst á mánudaginn.
Hvað var síðast ýtt á mánudaginn er það pop er aftur,
og það fjarlægir einnig það úr stafla.
Og eftir að það skilar null ef það er ekkert á mánudaginn.
Það er alltaf hægt að stafla er tóm.
Í Java, ef þú ert að nota til að, eða öðrum tungumálum,
reyna að skjóta úr tóma stakkur gæti valdið undanþágu eða eitthvað.
>> En C, null er góður af a einhver fjöldi af þeim tilvikum hvernig við tökum á þessum vandamálum.
Reglulegur null er hvernig við ætlum að signify að stafla var tóm.
Við höfum veitt kóða sem vilja prófa virkni stafla þíns,
framkvæma ýta og skjóta.
Þetta mun ekki vera mikið af kóða.
Ég mun-raun, en við gerum það, vísbending, vísbending-
Ef þú hefur ekki séð það, malloc er ekki eina virka
sem úthlutar minni í hrúga fyrir þig.
Það eru fjölskyldu virka alloc.
Í fyrsta lagi er malloc, sem þú átt að venjast.
Þá er það calloc, sem gerir það sama og malloc,
en það verður núll allt út fyrir þig.
Ef þú hefur einhvern tíma langað til að setja allt að null eftir mallocing eitthvað
þú ættir að hafa bara notað calloc í fyrsta sæti í stað þess að skrifa
a for lykkju til núll út alla blokk minni.
>> Realloc er eins malloc og hefur a einhver fjöldi af sérstökum tilvikum,
en í grundvallaratriðum hvað realloc gerir er
það tekur músina sem hafði þegar verið úthlutað.
Realloc er aðgerð sem þú vilt að borga eftirtekt til hér.
Það tekur bendi sem hafði þegar verið skilað frá malloc.
Segjum að þú krafið malloc bendi á 10 bæti.
Þá síðar þér grein fyrir að þú vildir 20 bæti,
svo þú kalla realloc á þessi músina með 20 bæti,
og realloc sjálfkrafa afrita yfir allt fyrir þig.
Ef þú heitir bara malloc aftur, eins og ég hef blokk af 10 bæti.
Nú þarf ég að loka á 20 bæti,
þannig að ef ég malloc 20 bæti, þá hef ég til með höndunum afrita yfir 10 bæti úr fyrsta sem
í seinni hlutur og síðan frjáls það fyrsta.
Realloc mun annast það fyrir þig.
>> Tilkynning undirskrift er að fara að vera ógilt *,
sem er bara að skila bendi á blokkinni minni,
þá ógilt * PTR.
Þú getur held * void sem almenna músina.
Almennt, ert þú aldrei með * ógilt,
en malloc er skila void *, og þá er það bara notað eins og
þetta er í raun að fara að vera char *.
Fyrri ógilt * sem hafði verið skilað með malloc
er nú að fara til að fara framhjá til realloc, og þá stærð
er nýr fjöldi bæti þú vilt úthluta, svo nýja getu þína.
Ég skal gefa þér nokkrar mínútur, og gera það í rúm okkar.
Byrjaðu revision 1.
Ég stoppa þig eftir vonandi um nægan tíma til að framkvæma ýta,
og þá ég gefa þér annað brot að gera popp.
En það er í raun ekki það mikið kóða yfirleitt.
The merkjamál er líklega vaxandi efni, auka getu.
Jæja, enginn þrýstingur til að vera fullkomlega lokið,
en svo lengi sem þér finnst eins og þú ert á réttri leið, það er gott.
>> Hefur einhver hafa allir kóða þeir líða vel með mig draga upp?
Já, mun ég, en er einhver hafa allir kóðann ég get draga upp?
Jæja, þú getur byrjað, vista það, hvað sem það er?
Ég gleymi alltaf að stíga.
Jæja, horfa á ýta,
viltu útskýra kóðann þinn?
[Nemandi] Fyrst af öllu, aukin ég stærð.
Ég held kannski að ég ætti að hafa að-engu að síður, aukið ég stærð,
og ég sé ef það er minna en getu.
Og ef það er minna en getu, bæti ég við fjölda sem við höfum nú þegar.
Og ef það er ekki að margfalda ég getu um 2,
og ég reallocate strengi array við eitthvað með stærri getu stærð núna.
Og svo ef það tekst ekki, ég segi notanda og aftur rangt,
og ef það er allt í lagi, svo ég setti band í nýja staðnum.
>> [Rob B.] Einnig eftir að við notuðum góðan Bita rekstraraðila hér
að margfalda með 2.
Mundu vinstri vakt er alltaf að fara að margfalda með 2.
Hægri vakt er deilt með 2 svo lengi sem þú manst að það þýðir
deila með 2 eins og í heiltölu deilt með 2.
Það gæti HÃ a 1 hér eða þar.
En vakt vinstri við 1 er alltaf að fara að margfalda með 2,
nema þú flæða mörk tölunnar, og þá mun það ekki vera.
A hlið ummæli.
Ég vil gera-þetta er ekki að fara að breyta kóðun hvaða hátt sem er,
en ég eins og til að gera eitthvað eins og this.
Það raunverulega er að fara að gera það lengur heldur.
Kannski er þetta ekki hið fullkomna mál að sýna þetta,
en ég eins og til hluti það í þessar blokkir-
allt í lagi, ef þetta ef gerist, svo ég ætla að gera eitthvað,
og þá aðgerð er lokið.
Ég þarf ekki að þá fletta augunum alla leið niður virka
til að sjá hvað gerist eftir annað.
Það er ef þetta ef gerist, þá er ég aftur bara.
Það hefur einnig ágætur bætt hag af öllu umfram það
er nú færst til vinstri þegar.
Ég þarf ekki lengur að, ef þú nær alltaf hlægilegur langur línur,
þá þessir 4 bytes geta hjálpað, og einnig er meira til vinstri eitthvað,
minna óvart þér líða ef eins-lagi, ég þarf að muna
Ég er nú í while lykkju innan um annað inni í for lykkju.
Einhvers staðar er hægt að gera þetta aftur strax, ég svona eins.
Það er algerlega valfrjáls og ekki gert ráð fyrir á neinn hátt.
>> [Nemandi] Verði stærð - í Mistakast ástandi?
The mistakast ástand hér er að við ekki að realloc, svo já.
Takið eftir hvernig í mistakast ástandi, væntanlega,
nema við frjáls efni síðar, við erum alltaf að fara að mistakast
sama hversu oft við að reyna að ýta eitthvað.
Ef við höldum að ýta, halda við incrementing stærð,
jafnvel þótt við séum ekki að setja neitt inn á mánudaginn.
Venjulega við hækka ekki stærð fyrr
eftir að við höfum sett tekist það á mánudaginn.
Við viljum gera það, segja, hvort hér og hér.
Og þá í stað þess að segja s.size ≤ getu, það er minna en getu,
aðeins vegna þess að við fluttum þar sem allt var.
>> Og munið, að eini staðurinn sem við gátum hugsanlega aftur falskur
er hér, þar sem realloc aftur null,
og ef þú skyldir til að muna staðalvillu,
kannski þú might íhuga þetta mál þar sem þú vilt prenta staðall villa,
svo fprintf stderr staðinn af réttlátur prenta beint til staðlaða út.
Aftur, það er ekki von, en ef það er villa,
tegund printf, þá þú might vilja til að gera það að prenta út staðlað villu úttak stað venjulegu út.
>> Einhver hafa neitt annað til að hafa í huga? Já.
[Nemandi] er hægt að fara yfir [inaudible]?
[Rob B.] Já, í raun binariness um það eða bara hvað það er?
[Nemandi] Svo þú margfalda það með 2?
[Rob B.] Já, í grundvallaratriðum.
Í tvöfaldur landi, höfum við alltaf sett okkar af tölustöfum.
Bragðvísi þessa vinstri eftir 1 grundvallaratriðum setur það hér á hægri hlið.
Aftur að þessu, bara að muna að allt í tvöfaldur
er máttur af 2, þannig að þetta táknar 2 til 0,
þetta 2 til 1, þetta 2 til 2.
Með því að setja 0 á hægri hlið nú, breyting við bara allt yfir.
Hvað er notað til að vera 2 til 0 er nú 2 til 1, er 2 til 2.
Hægri hlið sem við bætist
er víst að fara að vera 0,
sem vit.
Ef þú margfaldar alltaf tala um 2, það er ekki að fara að enda skrýtið,
þannig að 2 til 0 stað ætti að vera 0,
og þetta er það sem ég varaði helmingur um áður er ef þú skyldir skipta
út fjölda bita í heiltölu,
þá er þetta 1 er að fara að enda að fara burt.
Það er aðeins hafa áhyggjur ef þú skyldir til að takast á við mjög stór getu.
En á þeim tímapunkti, þá þú ert að takast á við fjölda milljarða af hlutum,
sem gætu ekki passa inn í minni samt.
>> Nú getum við fengið að skjóta, sem er jafnvel auðveldara.
Þú getur gert það eins og ef þú skyldir til að skjóta a heild búnt,
og nú þú ert á hálfar aftur.
Þú getur realloc að minnka magn af minni sem þú hefur,
en þú þarft ekki að hafa áhyggjur af því, svo eina realloc málið sé að fara að
vaxandi minni, aldrei minnkandi minni,
sem er að fara að gera popp frábær auðvelt.
Nú biðraðir, sem eru að fara að vera eins og stafla,
en til þess að taka það út er snúið.
Dæmigerðu dæmi um biðröð er lína,
svo ég giska á ef þú værir ensku, hefði ég sagt
a dæmigerðu dæmi um biðröð er biðröð.
Svo eins og línu, ef þú ert fyrsta manneskjan í línu,
þú búist við að vera fyrsta manneskjan úr línu.
Ef þú ert síðasta manneskja í línu, þú ert að fara að vera síðasta manneskja þjónustaðar.
Við köllum það FIFO mynstur, en stafla var LIFO mynstur.
Þessi orð eru mjög alhliða.
>> Eins stafla og ólíkt fylki, biðraðir yfirleitt leyfa ekki aðgang að þáttum í miðjunni.
Hér stafla, höfum við ýta og POP.
Hér gerast við að hafa kallað þá e, og dequeue.
Ég hef líka heyrt þá kallað vakt og unshift.
Ég hef heyrt fólk segja að ýta og skjóta til að gilda einnig um biðraðir.
Ég hef heyrt setja, eyða,
svo ýta og skjóta, ef þú ert að tala um stafla, þú ert að þrýsta og pabbi.
Ef þú ert að tala um biðraðir, þú gætir valið orð sem þú vilt nota
fyrir ísetningu og flutningur, og það er engin samstaða um hvað það ætti að kallast.
En hér höfum við e, og dequeue.
Nú er struct lítur nánast eins og stafla strúktúr.
En við verðum að halda utan um höfuð.
Ég held að það segir hérna, en afhverju þurfum við höfuðið?
Frummyndirnar eru í grundvallaratriðum eins og ýta og skjóta.
Þú getur hugsað um það sem ýta og popp.
Eini munurinn er pop er aftur-stað síðast, það er aftur fyrsta.
2, 1, 3, 4, eða eitthvað.
Og hér er að byrja.
Biðröð okkar er alveg fullt, þannig að það er fjórir þættir í henni.
Endalok biðröð okkar er nú 2,
og nú erum við að fara að setja eitthvað annað.
>> Þegar við viljum setja það eitthvað annað, það sem við gerðum að stafla útgáfa
er við langan blokk okkar minni.
Hvað er vandamálið við þetta?
[Nemandi] Þú færa 2.
Það sem ég sagði áður um lok biðröð,
þetta er ekki skynsamleg að við byrja á 1,
þá viljum við dequeue 1, þá dequeue 3, þá dequeue 4,
þá dequeue 2, þá dequeue þessa.
Við getum ekki notað realloc nú,
eða minnsta kosti, þú þarft að nota realloc á annan hátt.
En þú líklega ætti ekki bara að nota realloc.
Þú ert að fara að þurfa að höndunum afrita minni.
>> Það eru tvær aðgerðir til að afrita minni.
Það er memcopy og memmove.
Ég er nú að lesa maður síður að sjá hver þú ert að fara til að vilja nota.
Jæja, memcopy, munurinn er
að memcopy og memmove, einn sér um málið rétt
þar sem þú ert að copying í svæðinu sem gerist að skarast á svæðinu
þú ert Afrita frá.
Memcopy ekki höndla það. Memmove gerir.
Þú getur hugsa um vandamál sem-
við skulum segja að ég vil að afrita þennan mann,
Þessir fjórir að þetta strákur yfir.
Að lokum, hvað array ætti að líta út
eftir að afrit er 2, 1, 2, 1, 3, 4, og svo smá dót í lok.
En þetta er háð þeirri röð sem við afrita í raun,
því ef við gerum telja ekki þá staðreynd að svæðið sem við erum að copying í
skörun sá sem við erum Afrita frá,
þá við gætum gert eins og að byrja hér, afrita 2 í stað við viljum fara,
þá færa ábendingum okkar áfram.
>> Nú ætlum við að vera hér og hér, og nú viljum við að afrita
þessi strákur yfir þennan mann og færa ábendingum okkar áfram.
Það sem við erum að fara að enda að fá er 2, 1, 2, 1, 2, 1
stað viðeigandi 2, 1, 2, 1, 3, 4 vegna þess
2, 1 overrode upprunalega 3, 4.
Memmove annast það rétt.
Í þessu tilviki, í grundvallaratriðum bara alltaf nota memmove
vegna þess að það sér það á réttan hátt.
Það yfirleitt ekki framkvæma allir verri.
Hugmyndin er í stað þess að byrja frá byrjun og afrita þessa leið
eins og við gerðum hérna, byrjar það frá enda og eintök í,
og í því tilviki getur þú aldrei átt í vandræðum.
Það er enginn árangur glataður.
Alltaf nota memmove. Aldrei hafa áhyggjur óður memcopy.
Og það er þar sem þú ert að fara að þurfa að sérstaklega memmove
á umbúðir-um hluta af biðröð þinn.
Engar áhyggjur ef ekki alveg gert.
Þetta er erfiðara en stafla, ýta, og popp.
>> Einhver hafa allir kóða við gætum vinna með?
Jafnvel þótt alveg ófullnægjandi?
[Nemandi] Já, það er alveg ófullnægjandi, þó.
Alveg ófullnægjandi er fínn svo lengi sem við-er hægt að vista endurskoðun?
Ég gleymi því hvert einasta skipti.
Jæja, hunsa hvað gerist þegar við þurfum að búa það.
Alveg hunsa Resize.
Útskýrðu þennan kóða.
Ég er að athuga fyrst af öllu, ef stærð er minna en eintak Fyrst af öllu
og þá á eftir að setja-ég að taka höfuðið + stærð,
og ég tryggja það hula um getu fylkisins,
og ég set inn nýja strenginn á þá stöðu.
Og ég stækka og aftur satt.
>> [Rob B.] Þetta er örugglega einn af þeim tilvikum þar sem þú ert að fara að vilja að vera með unga fólkið.
Hvers konar tilfelli þar sem þú hefur umbúðir í kring, ef þú heldur að umbúðir í kring,
strax hugsun ætti að vera unga fólkið.
Eins og a fljótur hagræðingu / gera númerið þitt einn lína styttri,
þú tekur eftir að línan strax eftir þetta eina
er bara stærð + +, svo þú fellir að í þessari línu, stærð + +.
Nú hérna, höfum við málið
þar sem við höfum ekki nóg minni,
þannig að við erum að auka við 2.
Ég giska á að þú gætir hafa sama vandamál hér, en við getum hundsað það núna,
þar sem ef þú tókst ekki að auka getu þína,
þá þú ert að fara að vilja til að minnka getu með 2 aftur.
Annar stutt huga er bara eins og þú getur gert + =,
þú getur líka gert << =.
Næstum allt er hægt að fara áður en jafningjar, + =, | =, & =, << =.
Char * nýtt er ný blokk okkar minni.
Ó, hérna.
>> Hvað finnst fólki um gerð nýrra blokk okkar af minni?
[Nemandi] Það ætti að vera bleikju **.
Hugsun aftur til strúktúr okkar upp hér,
strengir er það sem við erum að reallocating.
Við erum að gera allt nýja dynamic geymslu fyrir þætti í biðröð.
Það sem við erum að fara að framselja á strengi er það sem við erum að mallocing núna,
og svo nýtt er að fara að vera bleikju **.
Það er að fara að vera fylki af strengjum.
Þá er það mál þar sem við erum að fara að skila falskur?
[Nemandi] Ættum við að gera char *?
[Rob B.] Já, gott símtal.
[Nemandi] Hvað var það?
[Rob B.] Okkur langaði til að gera stærð char * vegna þess að við erum ekki lengur-
þetta væri í raun verið mjög stór vandamál vegna sizeof (char) væri 1.
Sizeof char * er að fara að vera 4,
svo a einhver fjöldi af sinnum þegar þú ert að takast á við ints,
þú hættir að komast upp með það vegna þess að stærð int og stærð int *
á 32-bita kerfi eru að fara til vera the sami hlutur.
En hér, sizeof (char) og sizeof (char *) eru nú að fara að vera það sama.
>> Hvað er aðstæður þar sem við aftur rangar?
[Nemandi] Ný er null.
Já, ef nýr er núll, aftur við rangar,
og ég ætla að henda hérna-
[Nemandi] [inaudible]
[Rob B.] Já, þetta er fínt.
Þú getur annað hvort gert 2 sinnum getu eða getu Shift 1 og þá bara sett það niður hér eða hvað.
Við munum gera það sem við áttum það.
Stærð >> = 1.
Og þú ert aldrei að fara að hafa áhyggjur af að tapa setja 1 er
vegna þess að þú vinstri færst um 1, svo er setja 1 er endilega 0,
svo rétt að færa um 1, þú ert enn að fara að vera fínn.
[Nemandi] Ert þú þarft að gera það áður en aftur?
[Rob B.] Já, þetta gerir alls ekkert vit.
>> Nú tekur við ætlum að enda aftur rétt til enda.
Leiðin sem við erum að fara að gera þessar memmoves,
við þurfum að fara varlega með það hvernig við gerum þá.
Hefur einhver hefur einhverjar uppástungur um hvernig við gerum þá?
Hér er byrjun okkar.
Óhjákvæmilega, við viljum byrja á byrjun aftur
og afrita hluti á þaðan, 1, 3, 4, 2.
Hvernig gerir þú það?
Fyrst verð ég að líta á manninn síðu til memmove aftur.
Memmove, röð rökum er alltaf mikilvægt.
Við viljum áfangastað okkar fyrst, uppspretta annað, stærð þriðja.
There ert a einhver fjöldi af aðgerðum sem snúast uppspretta og áfangastað.
Áfangastað, uppspretta tilhneigingu til að vera í samræmi nokkuð.
Færa, hvað er það aftur?
Það skilar bendi á áfangastað, hver sem ástæðan er að þú vilt kannski að.
Ég get mynd lesið það, en við viljum að flytja inn áfangastað okkar.
>> Hvað er áfangastaður okkar að fara að vera?
[Nemandi] New.
[Rob B.] Já, og hvar erum við Afrita frá?
The fyrstur hlutur sem við erum að afritun er þetta 1, 3, 4.
Hvað er-þetta 1, 3, 4.
Hvað er heimilisfang þessarar 1?
Hvað er heimilisfang að 1?
[Nemandi] [inaudible]
[Rob B.] Head + heimilisfang fyrstu frumefni.
Hvernig fáum við fyrsta þáttur í fylki?
[Nemandi] biðröð.
[Rob B.] Já, q.strings.
Mundu hér, yfirmaður okkar er 1.
Darn það. Ég held bara að það er dularfullur-
Hér, yfirmaður okkar er 1. Ég ætla að breyta lit mitt líka.
Og hér er strengir.
Þetta getum við annaðhvort skrifa það eins og við gerðum hérna
með höfuð + q.strings.
A einhver fjöldi af fólk líka skrifa það & q.strings [höfuð].
Þetta er í raun ekki allir minna duglegur.
Þú might hugsa um það sem þú ert að dereferencing það og þá fá heimilisfang,
en þýðandinn er að fara að þýða það að það sem við höfðum áður en engu að síður, q.strings + höfuð.
Hvort heldur sem þú vilt að hugsa um það.
>> Og hversu mörg bæti viljum afrita?
[Námsmaður] Stærð - höfuð.
Stærð - höfuð.
Og þá gætir þú alltaf skrifa út dæmi
að reikna út ef það er rétt.
[Nemandi] Það þarf að skipta um 2 þá.
Já, svo ég held að við gætum notað stærð.
Við höfum enn stærð being-
með stærð, við höfum stærð jafngildir 4.
Stærð okkar er 4. Höfuð okkar er 1.
Við viljum að afrita þessar 3 einingar.
Það er andleg heilbrigði stöðva þessi stærð - höfuð er rétt 3.
Og koma aftur hingað, eins og ég sagði áður,
Ef við notuðum getu, þá við myndum þurfa að skipta um 2
vegna þess að við höfum nú þegar vaxið getu okkar, svo í staðinn, við erum að fara að nota stærð.
Sem eintök sem hluta.
Nú þurfum við að afrita aðra hluti, sá hluti sem er vinstra megin við byrjun.
>> Það er að fara að memmove í hvaða stöðu?
[Nemandi] Plus stærð - höfuð.
Já, þannig að við höfum nú þegar afritað í stærð - höfuð bæti,
og svo þar sem við viljum afrita sem eftir bæti er nýtt
og þá stærð mínus-vel, fjöldi bæti við höfum nú þegar afritað inn
Og þá hvar erum við Afrita frá?
[Nemandi] Q.strings [0].
[Rob B.] Já, q.strings.
Við gætum annað hvort gert & q.strings [0].
Þetta er talsvert sjaldgæfari en þetta.
Ef það er bara að fara að vera 0, þá munt þú hafa tilhneigingu til að sjá q.strings.
Það er þar sem við erum Afrita frá.
Hversu margir bytes Eigum við eftir að afrita? >> [Nemandi] 10.
Hægri.
[Nemandi] höfum við að margfalda 5-10 sinnum stærð bæti eða eitthvað?
Já, svo þetta er þar-hvað nákvæmlega erum við að afrita?
[Nemandi] [inaudible]
Hvað er tegund af hlutur sem við erum að afrita?
[Nemandi] [inaudible]
Já, þannig að char * s sem við erum að afrita, við vitum ekki hvar þeir koma frá.
Jæja, þar sem þeir eru að benda á, eins og strengi, enda við upp að þrýsta henni á biðröð
eða enqueuing á biðröð.
Ef þeir eru að koma frá, höfum við ekki hugmynd.
Við þurfum bara að halda utan um char * s sig.
Við viljum ekki að afrita stærð - höfuð bæti.
Við viljum að afrita stærð - höfuð char * s,
þannig að við erum að fara að margfalda þetta með sizeof (char *).
Sama hérna, höfuð * sizeof (char *).
>> [Nemandi] Hvað [inaudible]?
Þetta hér ekki satt?
[Nemandi] Nei, hér að stærð - höfuð.
[Rob B.] Þetta hérna?
Pointer tölur.
Hvernig bendillinn tölur er að fara að vinna er
það margfaldar sjálfkrafa af stærð letursins sem við erum að fást við.
Rétt eins og hérna, nýr + (stærð - höfuð)
er einmitt jafngild og nýja [size - Höfuð]
fyrr en við búumst við að vinna rétt,
síðan ef við erum að takast á við int array, þá erum við ekki vísitölu með int-
eða ef það er í stærð 5 og þú vilt 4. frumefni, þá erum við vísitölu inn í
int array [4].
Þú áttina-[4] * stærð int.
Sem annast það sjálfkrafa, og þetta mál
er bókstaflega jafngildir, svo krappi setningafræði
er bara að fara að vera breytt í þetta eins fljótt og þú safna.
Það er eitthvað sem þú þarft að vera varkár um það
þegar þú ert að bæta við stærð - höfuð
þú ert að bæta ekki einn bæti.
Þú ert að bæta einn char *, sem getur verið einn bæti eða hvað.
>> Aðrar spurningar?
Jæja, dequeue er að fara að vera auðveldara.
Ég skal gefa þér eina mínútu til að framkvæma.
Ó, og ég held að þetta sé sama staða þar
hvað e, mál, ef við erum að enqueuing null,
kannski viljum við höndla það, kannski ekki.
Við munum ekki gera það aftur hér, en eins og ef stafla okkar.
Ef við e, null, gætum við viljum að troða það.
Einhver hafa sumir merkjamál ég get draga upp?
[Nemandi] Ég hef bara dequeue.
Útgáfa 2 er að-lagi.
Þú vilt útskýra?
[Nemandi] Fyrst, þú gerir viss um að það er eitthvað í biðröð
og að stærð er að fara niður um 1.
Þú þarft að gera það, og þá aftur í höfuðið
og fara svo í höfuðið upp 1.
Jæja, svo er það horn ef við eigum að hafa í huga. Já.
[Nemandi] Ef höfuðið er í síðasta frumefni,
þá þú vilt ekki höfuð að benda utan fylkisins.
>> Já, svo smellir um leið og höfuð enda fylking okkar,
þegar við dequeue, að höfuð okkar er modded aftur til 0.
Því miður getum við ekki gert það í einu skrefi.
Ég held eins og ég myndi sennilega laga það
þetta er að fara til vera a char *, hvað við erum að koma aftur,
hvað breytu nafn þitt vill vera.
Þá viljum við að unga fólkið höfuð við getu okkar
og síðan aftur REt.
A einhver fjöldi af fólki hér að þeir gætu gert-
þetta er raunin af-you'll sjá fólk gera ef höfuðið
er meiri en getu, gera höfuð - getu.
Og það er bara að vinna í kringum það sem unga fólkið er.
Head unga fólkið = getu er miklu hreinni
á umbúðir um en ef meiri höfuð en höfuð getu - rúmtak.
>> Spurningar?
Allt í lagi, það síðasta sem við höfum skilið eftir tengist lista okkar.
Þú gætir verið notuð til að sumir af tengda lista hegðun ef þú gerðir
tengd listum í hash töflur, ef þú did a kjötkássa borð.
Ég mæli eindregið með að gera kjötkássa borð.
Þú gætir hafa þegar gert trie,
en arlega er erfiðara.
Fræðilega séð, þá eru þeir aðfellu betur.
En bara líta á the stór borð,
og reynir aldrei að gera betur, og þeir taka meira minni.
Allt reynir um endar að vera verra fyrir meiri vinnu.
Það er það sem lausn David Malan er alltaf er
Er hann innlegg alltaf trie Lausn hans, og við skulum sjá hvar hann er nú.
Hvað var hann undir, David J?
Hann er # 18, svo það er ekki hræðilega slæmt,
og það er að fara að vera einn af the bestur reynir þú að hugsa um
eða einn af the bestur reynir af trie.
Er það ekki enn upprunalega lausn hans?
Mér líður eins trie lausnir hafa tilhneigingu til að vera meira í þessu svið af RAM notkun.
>> Fara niður á the mjög toppur, og RAM notkun er í einum tölustafir.
Fara niður að botni, og þá getur þú byrjað að sjá reynir
þar sem þú færð algerlega gegnheill RAM notkun,
og reynir eru erfiðari.
Ekki alveg þess virði en mennta reynslu ef þú gerðir eitt.
Það síðasta er tengda listanum okkar,
og þessir þrír hlutir, stafla, biðraðir, og tengist listum,
hvaða framtíð sem þú gerir alltaf í tölvunarfræði
verður ráð fyrir að þú hefur þekkingu með þessum hlutum.
Þeir eru bara svo grundvallaratriði í öllu.
>> Tengd listum, og hér höfum við eintengdum lista er að fara að vera framkvæmd okkar.
Hvað þýðir eintengdum meina öfugt við tvöfalt tengd? Já.
[Nemandi] Það bendir bara á næsta músina frekar en við ábendingum,
eins og sá á undan henni og einn eftir það.
Já, svo í formi mynd, hvað gerði ég bara?
Ég hef tvennt. Ég hef mynd og mynd.
Í formi mynd, eintengdum okkar listum,
Óhjákvæmilega höfum við einhvers konar bendi á höfuð af listanum okkar,
og þá í lista okkar, höfum við bara ábendingar,
og kannski þetta atriði sem null.
Það er að fara að vera dæmigert teikning þinn eintengdum lista.
A tvöfalt tengist lista, getur þú farið aftur á bak.
Ef ég gefa þér einhverjar hnútur í listanum, þá getur þú endilega fá að
önnur hnút í listanum ef það er tvöfalt tengda listanum.
En ef ég fæ þér þriðja hnút á listanum og það er eintengdum lista,
engin leið að þú ert alltaf að fara að fá til fyrstu og annarri hnúður.
Og það er kostir og detriments og ein augljós einn
er að taka upp meiri stærð, og þú verður að halda utan um hvar þessir hlutir vísi nú.
En við umönnun aðeins um eintengdum.
>> Nokkur atriði sem við ætlum að hafa til að hrinda í framkvæmd.
Typedef struct hnút þín, int i: struct hnút * næsta, hnútur.
Það typedef skal brenna í huga þínum.
Quiz 1 ætti að vera eins og gefa typedef í tengda listanum hnút,
og þú ættir að vera fær um að strax Scribble að niður
án þess þó að hugsa um það.
Ætli nokkrar spurningar, hvers vegna þurfum við strúktúr hér?
Hvers vegna getur ekki við að segja hnút *?
[Nemandi] [inaudible]
Já.
Það eina sem skilgreinir hnút sem hlutur
er typedef sjálft.
En eins og á þessum tímapunkti, þegar við erum konar þáttun með þennan hnút strúktúrinn skilgreiningu,
við höfum ekki lokið typedef okkar enn, svo þar sem typedef hefur ekki lokið,
hnút er ekki til.
En struct hnút gerir, og þessi hnútur í hér,
þetta gæti líka verið kölluð neitt annað.
Þetta mætti ​​kalla n.
Það mætti ​​nefna tengda listanum hnút.
Það mætti ​​nefna neitt.
En þetta struct hnút þarf að vera kallaður það sama sem þessi strúktúrinn hnút.
Það sem þú kallar þetta hefur einnig að vera hér,
og svo svarar það líka annað lið í spurningu
sem er ástæðan fyrir-a einhver fjöldi af sinnum þegar þú sérð structs og typedefs af structs,
þú munt sjá nafnlaus structs þar sem þú munt bara sjá typedef strúktúr,
framkvæmd strúktúrinn, orðabók, eða hvað sem er.
>> Hvers vegna hér þurfum við að segja hnút?
Hvers vegna getur það ekki verið nafnlaus strúktúr?
Það er næstum því sama svar.
[Nemandi] Þú þarft að vísa til þess í strúktúr.
Já, innan struct, þú þarft að vísa til strúktúr sig.
Ef þú ekki gefa struct nafn, ef það er óákveðinn greinir í ensku nafnlaus strúktúr, er ekki hægt að vísa til þess.
Og síðast en ekki síst, þau ættu öll að vera nokkuð augljóst,
og þeir ættu að hjálpa þér grein fyrir ef þú ert að skrifa þetta niður
sem þú ert að gera eitthvað rangt ef þessi tegund af hlutur ekki gera skilningarvit.
Síðast en ekki síst, hvers vegna er þetta að vera struct hnút *?
Af hverju getur það ekki bara verið strúktúr hnút næst?
[Námsmaður] Pointer á næsta strúktúr.
Það er óhjákvæmilega það sem við viljum.
Af hverju gat það aldrei vera struct hnút næst?
Hvers vegna er það að vera struct hnút * næst? Já.
[Nemandi] Það er eins og óendanlega lykkju.
Já.
[Nemandi] Það myndi allt vera í einu.
Já, hugsa bara um það hvernig við myndum gera stærð eða eitthvað.
Stærð á strúktúr er í grundvallaratriðum + eða - nokkur mynstur hér eða þar.
Það er í grundvallaratriðum að fara að vera summa stærðir því í strúktúr.
Þessi hérna, án þess að breyta neitt, stærð er að fara að vera auðvelt.
Stærð hnút strúktúrinn er að fara að vera stærð i + stærð næst.
Stærð ég er að fara að vera 4. Stærð næst er að fara að vera 4.
Stærð hnút strúktúrinn er að fara að vera 8.
Ef við höfum ekki *, að hugsa um sizeof,
þá sizeof (i) er að fara að vera 4.
Stærð hnút strúktúrinn næsta er að fara að vera stærð i + stærð hnút strúktúrinn næsta
+ Stærð i + stærð hnút strúktúrinn næsta.
Það væri óendanlega endurkvæmni hnúta.
Þetta er ástæðan fyrir þessu er hvernig hlutirnir þurfa að vera.
>> Aftur, örugglega minnið að
eða að minnsta kosti skilja það nóg að þú getur verið fær um að
Ástæðan gegnum hvað það ætti að líta út.
Það sem við erum að fara til að vilja framkvæma.
Ef lengd lista-
þú gætir svindl og halda kringum
alþjóðlegt lengd eða eitthvað, en við erum ekki að fara að gera það.
Við ætlum að telja lengd listanum.
Við höfum inniheldur, svo það er í grundvallaratriðum eins og leit,
þannig að við höfum tengd lista yfir heilar að sjá hvort þetta heiltala er í tengda listanum.
Prepend er að fara að setja í upphafi listanum.
Setja er að fara að setja inn í lokin.
Insert_sorted er að fara að setja inn í raðaða stöðu á listanum.
Insert_sorted konar gert ráð fyrir að þú hefur aldrei notað prepend eða bæta í slæmum hætti.
>> Insert_sorted þegar þú ert að innleiða insert_sorted-
skulum segja að við höfum tengda listanum okkar.
Þetta er það sem það lítur nú út, 2, 4, 5.
Mig langar að setja inn 3, svo lengi sem listinn sjálfur er þegar raðað,
það er auðvelt að finna þar sem 3 tilheyrir.
Ég byrja á 2.
Jæja, 3 er meira en 2, svo ég vil halda áfram.
Ó, 4 er of stór, þannig að ég veit 3 ​​er að fara að fara á milli 2 og 4,
og ég þarf að laga ábendingum og öll þessi efni.
En ef við ekki stranglega nota insert_sorted,
eins og við skulum bara segja að ég prepend 6,
síðan tengd listinn minn er að fara að verða það.
Það gerir nú ekkert vit, þannig að insert_sorted, getur þú bara gera ráð fyrir
að listinn er raðað, jafnvel þótt aðgerðir til
sem getur valdið því að ekki að vera flokkaður, og það er það.
Finna gagnlegt Insert-þannig að þeir eru helstu hlutir sem þú ert að fara að framkvæma.
>> Fyrir nú, taka eina mínútu til að gera lengd og inniheldur,
og þá ætti að vera tiltölulega fljótur.
Nálgast lokun svo einhver hafa nokkuð fyrir lengd eða inniheldur?
Hann ætlar að vera næstum eins.
[Nemandi] Lengd.
Við skulum sjá, endurskoðun.
Allt í lagi.
Þú vilt útskýra?
[Nemandi] Ég skapa bara músina hnút og frumstilla hana fyrst, sem er alþjóðlegt breytu okkar,
og þá skal ég athuga hvort það er null þannig að ég fæ ekki að seg galli og aftur 0 ef það er málið.
Annars, ég lykkja í gegnum, halda utan um innan heiltölu
hversu oft ég hef farið inn á næsta þátt af listanum
og í sömu aukningu starfsemi einnig aðgang að raunverulegur þáttur,
og þá vil ég gera stöðugt að athuga hvort það er null,
og ef það er núll, þá aborts það og bara skilar fjölda staka sem ég hef aðgang að.
>> [Rob B.] Hefur einhver hefur einhverjar athugasemdir um neitt?
Þetta lítur fínt nákvæmni vitur.
[Nemandi] Ég held ekki að þú þarft að hnúturinn == null.
Já, þannig að ef hnút == null áreturn 0.
En ef hnút == null þá þetta-ó, það er réttmæti mál.
Það var bara að þú ert að koma aftur i, en það er ekki að umfangi núna.
Þú þarft bara int i, svo i = 0.
En ef hnútur er núll, þá er ég er enn að fara að vera 0,
og við erum að fara að skila 0, þannig að þetta mál er eins.
Annar sameiginlegur hlutur er að halda yfirlýsingu
Inside hnút í for lykkju.
Það má segja að-ó, nei.
Við skulum halda því sem þetta.
Ég myndi líklega setja int i = 0 hér,
þá hnútur * hnútur = fyrst hér.
Og þetta er líklega hvernig-losna við þetta núna.
Þetta er líklega hvernig ég hefði skrifað það.
Þú gætir líka-að horfa á hana svona.
Þetta fyrir uppbyggingu lykkju hérna
ætti að vera næstum eins eðlilegt að þú sem að int i = 0
i er minna en lengd fylkisins i + +.
Ef það er hvernig þú iterate yfir fjölda, þetta er hvernig þú iterate yfir tengda listanum.
>> Þetta ætti að vera annað eðlis á einhverjum tímapunkti.
Með það í huga, þetta er að fara að vera nánast það sama.
Þú ert að fara til að vilja iterate yfir tengda listanum.
Ef hnúturinn-Ég hef ekki hugmynd um hvaða gildi er kallað.
Hnútur i.
Ef gildið á þeim hnút = i aftur satt, og það er það.
Takið eftir því að eina leiðin sem við aftur alltaf falskur
er ef við iterate yfir öllu sem tengist listanum og aldrei aftur satt,
Svo það er það sem þetta gerir.
Eins og a hlið minnispunktur-við að öllum líkindum ekki fá að auka eða prepend.
>> Quick síðasta verkefni.
Ef þú sérð truflanir leitarorð, þannig að við skulum segja að truflanir int telja = 0,
þá gerum telja + +, þú getur í rauninni að hugsa um það sem alþjóðlegt breytu,
jafnvel þó að ég sagði bara þetta er ekki hvernig við ætlum að innleiða lengd.
Ég er að gera þetta hér, og þá telja + +.
Hvaða leið sem við getum inn hnút í tengda listanum okkar við erum incrementing telja okkar.
Aðalatriðið er það sem truflanir leitarorð þýðir.
Ef ég hefði bara int telja = 0 það væri venjulegur gamall alþjóðlegt breytu.
Hvað truflanir int telja þýðir er að það er alþjóðlegt breytu fyrir þessa skrá.
Það er ómögulegt fyrir einhverja aðra skrá,
eins hugsa um pset 5, ef þú hefur byrjað.
Þú hefur bæði speller.c, og þú hefur dictionary.c,
og ef þú lýsa bara hlutur heimsvísu, þá neitt í speller.c
er hægt að nálgast í dictionary.c og öfugt.
Global breytur eru aðgengileg öllum. C skrá,
en truflanir breytur eru aðeins aðgengileg innan skrá sig,
svo inni afgreiðslumaður stafa eða inni í dictionary.c,
þetta er góður af því hvernig ég myndi lýsa yfir breytu minn fyrir stærð fylkisins míns
eða stærð fjölda minn af orðum í orðabók.
Þar sem ég vil ekki að lýsa yfir alþjóðlegt breytu sem einhver hefur aðgang að,
Ég hugsa í raun aðeins um það til eigin nota minn.
>> The góður hlutur óður í this er líka allt nafnið árekstur efni.
Ef einhver annar skrá reynir að nota alþjóðlegt breytu sem heitir telja, fara hlutirnir mjög, mjög rangt,
svo heldur þetta fallega hluti örugg, og aðeins þú geta aðgangur það,
og enginn annar getur, og ef einhver annar segir alþjóðlegt breytu sem heitir telja,
þá mun það ekki trufla truflanir breytu sem heitir telja.
Það er það sem truflanir er. Það er skrá alþjóðlegt breytu.
>> Spurningar um neitt?
Allt sett. Bless.
[CS50.TV]