>> DAVID Malan: Bone, bonvenigas dorso.
Ĉi tiu estas CS50.
Ĉi tiu estas la komenco de semajno sep.
Do jam pasis iom da tempo, do mi pensis ke ni preni trombo tour de kie ni
cxesis kaj kie ni nun iras.
>> Do tiun aferon ĉi tie povus havi kaŭzis iujn angoro en komenco.
Sed mi esperas, ke vi komencas alklimatigi al kio tio signifas tie -
stelo reprezentas pointer, kiu estas nur kio, en pli lego la terminoj?
Do ĝi estas adreso.
>> Do estas la adreso de io en la memoro.
Kaj ni komencis senŝeligi reen la manteloj paro de semajnoj, aĵoj ŝati
GetString kaj aliaj tiaj funkcioj tiu tuta tempo ili reveni
adresoj de aferoj en la memoro, kiel la adreso de la unua signo en
iu vico.
>> Do ni ankaŭ enkondukis valgrind, kiu vi komencos uzi por ĉi tiu problemo
aro, aparte por la venonta problemo starigis kiel bone.
Kaj valgrind faras kion por ni?
Ĝi kontrolas por memoro fugoj, kaj ĝi Ankaŭ kontrolas por misuzo de memoro.
>> Ĝi povas, kun iu probablo, detekti se via kodo tuj tuŝi memoro
ke simple ne devus.
Do ne nepre liko, sed se vi iri preter la limojn de iuj
tabelo, kaj vi efektive kuri valgrind kaj instigi ke la konduto dum
valgrind kuras en via programo estas kurante ene de ĝi, vi ricevos
mesaĝoj kiel tiu - "malvalida skribi de grandeco 4 ", kiu, memoru paro de
semajnoj signifis ke mi havis hazarde kiel sur unu int tro malproksime
trans la limoj de tabelo.
Kaj tiel grandeco 4 signifas tie la grandeco de tiu aparta int.
>> Do prenu konsilojn en la fakto ke valgrind eligo, la formato de ĝi,
estas nur abomena.
Estas vere malfacile vidi tra la salaton por la interesa informo.
Do kion ni faris ĉi tie estas nur ekstrakto kelkaj el la paro de pli
interesaj linioj.
Sed rimarkas ke 80% de valgrind la eligo tuj estos iom de
distro.
>> Nur serĉi tekson tiuj - nevalida pravas, nevalida legis, 40 bitokoj
kaj iu numero de blokoj estas definitive perdita, ŝlosilvortoj tiel.
Kaj kion vi espereble vidos estas iuj ia spuro de kio funkcii la
eraro estas fakte in
En tiu kazo ĉi tie, en kio linio de mia kodo estis la eraro ŝajne?
>> 26 en dosiero nomata memory.c, kiu estis la ekzemplo ni ludis kun
en tiu momento.
Do ĝi estas probable ne en malloc.
Ĝi estis probable en mia kodo anstataŭe.
Do ni vidos ĉi denove kaj denove post nelonge.
>> Do scanf, ĉi tiu venis en paro de formoj tiom.
Ni vidis sscanf mallonge.
Estis iu numero de vi plonĝis en en via
preparoj por la kvizo.
Kaj scanf estas fakte kion la CS50 biblioteko estas estinta uzante sub la
kapuĉo por sufiĉe tempo por akiri eniron de la uzanto.
>> Ekzemple, se mi movas super la CS50 aparato tie, permesu al mi malfermi la
Ekzemple hodiaŭ ke nomiĝas scanf-0.c Kaj ĝi estas super simpla.
Estas nur malmultaj linioj de kodo.
Sed ĝi pruvas vere kiel getInt estis laborante ĉio ĉi tempo.
>> En ĉi tiu programo ĉi tie, en linio 16 , Avizo kiu deklaras la Int.
Do ne montriloj, nenio magia tie, nur int.
Tiam en linio 17, mi instigas la uzanton por nombro, bonvolu.
Tiam fine 18, mi uzas scanf tie.
Kaj mi specifita, ia kiel printf, ke mi atendis citaĵo
unquote procento i.
>> Do procento i, kompreneble, signas la int.
Sed rimarki kion la dua argumento por scanf estas.
Kiel vi priskribus la dua argumento post la komo?
Kio estas tio?
>> Ĝi estas la adreso de x.
Do tiu estas utila ĉar per provizi scanf kun la adreso de x, kion faras
ke plifortigi tiun funkcion por fari?
Ne nur iri tien, sed ankaŭ fari kion?
>> Fari ŝanĝon al ĝi.
Ĉar vi povas iri tien, estas speco de kiel mapon al loko en la memoro.
Kaj tiel longe kiel vi provizis scanf, aŭ iu funkcio kun tia mapo, ke
funkcio povas iri tie, kaj ne nur rigardi la valoro, sed ĝi povas ankaŭ
ŝanĝi tiun valoron, kiu estas utila se la celo en la vivo de scanf estas
skani enigon el la uzanto, specife de la klavaro.
Kaj la f signifas formatan, samkiel printf, la f signifas formatan
kordo, kiun vi volas presi.
>> Do, en mallonga, tiu linio 18 simple diras, provu legi int de la uzanto
klavaro kaj stoki ĝin ene de x, ĉe kion ajn adreso x okazas vivi ĉe.
Kaj poste persiste, linio 19 simple diras, dankon pro la int, en tiu kazo.
>> Do lasu min antaŭeniri kaj realigi ĉi.
Do fari scanf 0.
Lasu min antaŭeniri kaj zomi in
Mi iros kaj kuri ĉi kun dots slash scanf 0.
Nombro, mi petas?
50.
Dankon por la 50.
Do estas sufiĉe simpla.
>> Nun kio ĝi ne faras?
Tio ne faras tutan faskon de eraro checking.
Ekzemple, se mi ne kunlaboras, kaj mi ne tajpas en nombro, sed
anstataŭe mi skribas ion kiel "saluton", tio estas nur ia stranga.
Kaj tial unu el la aĵoj la CS50 biblioteko estis farante por ni por kelkaj
tempo estas ke reprompting kaj reprompting.
>> La reprovi frazo revokon estis en cs50.c, kaj tio estas la kialo ke getInt en
la CS50 biblioteko estas fakte ĉiu faskon da linioj longaj, ĉar ni estas
kontrolanta por stultaj aĵoj kiel ĉi tio.
Ĉu la uzanto ne donos ni, fakte, int?
Ĉu li aŭ ŝi donu al ni ion kiel alfabeta litero?
Se jes, ni volas detekti tio kaj krii al ili.
>> Sed tion akiri pli interesa en la sekva ekzemplo.
Se mi iras al scanf-1.c, kio estas la kiu estas fundamente ŝanĝis en
ĉi sekva ekzemplo?
Mi uzas char *, kompreneble, anstataŭ int.
>> Do tiu estas interesa, ĉar char *, memori, estas vere nur la
sama afero kiel kordo.
Do li sentas kiel eble tiu estas super simpla apliko de GetString.
Sed mi senŝeligis reen la mantelo de la CS50 biblioteko, do mi estas
nomante tiun char * nun.
Do ni vidu kie, se ie, Ni iras malbone.
>> Linio 17 -
Mi denove diras, bonvolu doni al mi ion, en ĉi tiu kazo, kordoj.
Kaj poste en la sekva linio, mi vokas scanf, denove, donante al ĝi formato kodo,
sed tiu tempo procento s.
Kaj tiam tiu tempo, mi estas donante buffer.
>> Nun rimarkos, mi ne uzas la kaj-signo.
Sed kial estas tiu probable OK tie?
Ĉar kio estas buffer jam?
Estas jam puntero.
Estas jam adreso.
>> Kaj let estas tio vorto "konfuzi," lasu min nur nomas ĝin j, ekzemple, por
simpleco.
Sed mi nomis ĝin buffer ĉar en Ĝenerale, en programado, se vi havas
eron de memoro, kiun kordoj vere nur estas, eble vi nomas ĝin buffer.
Ĝi estas loko por stoki informo.
>> Similaj al aĵoj kiel YouTube, kiam ili estas buffering, por tiel diri, ke
nur signifas ĝi estas elŝutanta bitoj de la interreto kaj stoki ilin en
lokaj tabelo, loka eron de memoro por ke vi povas rigardi ĝin poste sen
ĝin saltante aŭ pendis sur vi dum reprodukti.
>> Do tie estas problemo ĉi tie, tamen, ĉar mi diras scanf, atendi
kordoj de la uzanto.
Jen la adreso de eron de memoro.
Meti ke kordo tie.
Kial estas ke bara doni ni afliktigxas, kvankam?
>> Kio estas tio?
Ĉu mi rajtas aliri al tiu parto de memoro?
Vi scias, mi ne scias.
Pro tio bufro estis inicializado al nenio?
Ne vere.
Kaj tial estas kion ni estis nomante de rubo valoro, kiu
ne estas formala vorto.
Ĝi simple signifas ke ni ne havas ideon kion bitoj estas ene de la kvar bajtojn ke
Mi destinis kiel bufro.
>> Mi ne nomas malloc.
Mi certe ne nomas GetString.
Do kiu scias, kio estas fakte ene de buffer?
Kaj tamen dirante scanf blinde, iru tie kaj metis ajn la uzanto tajpas.
>> Do kio estas verŝajna kaŭzi en nia kodo se ni ruli ĝin?
Probable segfault.
Eble ne, sed probable segfault.
Kaj mi diras eble ne ĉar kelkfoje vi faras, kelkfoje
vi ne ricevas segfault.
Kelkfoje vi ĵus ricevas sorton, sed ĝi estas tamen tuj estos
cimon en nia programo.
>> Do lasu min antaŭeniri kaj kompili ĉi.
Mi tuj faros la malnova lernejo vojo.
Do clang haltostreko 0, scanf-1, scanf-1.c, Enter.
Oops, tro malnova lernejo.
Ni vidu.
Kien mi eniru?
Ho, char * buffer.
Ho, dankon -
Konservi, OK -
tre malnova lernejo.
Bone, jam pasis iom da tempo.
>> Do mi ĵus savis la dosieron post farante ke temporal
ŝanĝi antaŭ momento.
Kaj nun mi kompilis ĝin permane kun Clang.
Kaj nun mi tuj iros antaŭen kaj kuri scanf-1, Enter.
String bv.
Mi tajpas en "saluton."
>> Kaj nun, jen kie, sincere, printf povas estas iom ĝena.
Ĝi fakte ne tuj segfault en ĉi tiu kazo.
Printf estas iom speciala ĉar estas tiel super komune uzis tiun
esence printf faras ni favoron kaj realigante,
tio ne estas valida puntero.
Lasu min preni tion sur min al ĝuste presi el en krampoj nula, eĉ
kvankam tio ne nepre kion ni mem atendis.
>> Do ni ne povas vere facile indukti segfault kun ĉi tio, sed klare tiu
ne estas la konduto mi volis.
Do kio estas la simpla solvo?
Nu, en scanf-2, lasu min proponas ke anstataŭ fakte ĝuste atribui al
char *, lasu min esti iom pli inteligenta pri ĉi tio, kaj lasu min atribui buffer
kiel vico de 16 signoj.
>> Do mi povas tion fari en kelkaj manieroj.
Mi povus uzi absolute malloc.
Sed mi povas reiri al semajno du kiam Mi nur bezonis tutan faskon da
gravuloj.
Tio estas nur tabelo.
Do mi anstataŭ redifini buffer esti tabelo de 16 signoj.
>> Kaj nun, kiam mi pasas bufro en -
kaj tio estas io, kion ni ne raporti en semajno du -
sed vi povas trakti tabelo kiel kvankam ĝi estas adreso.
Teknike, kiel ni jam vidis, ili estas iomete malsamaj.
Sed scanf ne gravas se vi pasas ĝin la nomo de tabelo, ĉar kion
Clang faros por ni estas esence trakti la nomon de tiu tabelo kiel la
adreso de la bloko de 16 bajtoj.
>> Do tiu estas preferinda.
Tio signifas, ke nun mi povos espereble faru la sekvajn.
Lasu min malzomi dum momento kaj farata scanf-2, kompilita OK.
Nun mi ne havas oblikvo scanf-2.
String bv. "Saluton." Kaj ŝajnis funkcii ĉi tiu tempo.
>> Sed povas iu proponas scenaro en kiun ĝi eble ne estas ankoraŭ funkcias?
Jes?
Io pli longa ol 16 signoj.
Kaj efektive, ni povas esti iom pli precizan.
Io plu tiam 15 karakteroj, ĉar vere ni bezonas havi en menso
ke ni bezonas ke backslash nulo implice fine de la kordo,
kiu estas flanken scanf volo tipe prizorgi por ni.
>> Do mi faru ion kiel -
kelkfoje ni povas nur lasi gxin tiel.
Bone, do ni nun induktita nia segmentación kulpo.
Kial?
Ĉar mi tajpis al pli ol 15 karakterojn, kaj tiel ni vere
tusxis memoron, ke mi efektive ne devus havi.
>> Do kio estas vere la solvo ĉi tie?
Nu, kio se ni bezonas pli longan ĉenon?
Nu, ni eble faros 32 bajtoj.
Nu, se tio ne sufiĉe longe?
Kion pri 64 bitokoj?
Kio se tio ne sufiĉe longe?
Kiel ĉirkaŭ 128 aŭ 200 bitokoj?
Kio vere estas la solvo ĉi tie en la ĝenerala kazo, se ni ne scias
antaŭi kion la uzanto tuj tajpi?
>> Estas nur speco de granda doloro en la azeno, por esti honesta, tial la
CS50 biblioteko havas kelkdek linioj de kodo kiu kolektive implemento
GetString kordo en maniero, ke ni ne devas scii anticipe, kion la
uzanto tuj tajpi.
En aparta, se vi retrorigardas al cs50.c de du semajnoj, vi vidos
ke GetString fakte faras Ne uzu scanf en tiamaniere.
Pli ĝuste, ĝi legas unu signo samtempe.
>> Pro la agrabla afero pri legante unu signo estas ni povas
garantii nin al ĉiam havi almenaŭ unu char.
Mi povas nur deklari char, kaj poste prenu tiuj vere bebo paŝojn por ĝuste
legi unu signo en ĉe fojo de la klavaro.
Kaj tiam, kion vi vidos GetString faras estas ĉiufoje ĝi kuras el,
diri, 16 bajtoj de memoro, ĝi uzas malloc, aŭ kuzo gxiajn al
atribui pli da memoro, kopiante la malnova memoro en la nova, kaj poste rampis
kune, atingi unu signo samtempe, kaj kiam ĝi kuras el tiu
eron de memoro, ĵetas ĝin for, kroĉas pli grandan eron de memoro, kopias malnovan
en novajn, kaj ripetas.
Kaj estas vere doloron al reale apliki io ​​tiel simpla kiel
ricevas enigon el la uzanto.
>> Do vi povas uzi scanf.
Vi povas uzi aliajn similajn funkciojn.
Kaj multe da lernolibroj kaj rete ekzemploj faru, sed ili ĉiuj estas
vundebla al problemoj kiel ĉi tio.
Kaj fine, getting a segfault estas ia ĝena.
Ĝi ne estas bona por la uzanto.
>> Sed en la plej malbona kazo, kion faras ĝi fundamente meti vian
kodo riskas?
Ia atako, potenciale.
Ni parolis pri unu tia atako - superfluas la stako.
Sed ĝenerale, se vi permesas troplenigxis buffer, kiel ni faris
kelkaj semajnoj, kun nur skribi pli ol "saluton" en la pilo, vi
povas ja transpreni, potenciale, oni komputilo, aŭ almenaŭ atingi datumojn kiuj
ne apartenas al vi.
>> Do, en mallonga, tio estas kial ni havas tiuj trejnado radoj.
Sed nun, ni komencas preni ilin, kiel niaj programoj ne plu bezonas,
nepre, enigo de la uzanto.
Sed en la kazo de problemo starigis ses, via enigo venos de grandega
vortaro-dosiero kun 150 iom nepara mil vortoj.
>> Do vi ne devos maltrankviligi la uzanto arbitrajn enigo.
Ni donos al vi kelkajn supozojn pri tiu dosiero.
Ajna demandojn sur montriloj aŭ scanf aŭ uzanto enigo ĝenerale?
>> Bone, do rapida rigardo tiam je unu trenante temon de du semajnoj.
Kaj tio estis jena nocio de struct.
Ne tio, - tiu nocio de struct, kio estis kion?
Kion struct faru por ni?
>> Difini -
sorry?
Difini variablon tipo.
Do ordigi de.
Ni efektive kombini du temojn.
Do kun typedef, memoru, ke ni povas deklari tipo de nia propra, kiel
sinonimo, kiel ĉenon por char *.
Sed uzante typedef kaj struct, ni povas krei vere nia propra datumstrukturoj.
>> Ekzemple, se mi reirus en gedit ĉi tie dum nur momento, kaj mi iras antaŭen
kaj faru ion kiel, lasu min konservi ĉi tiel, diru, structs.c
provizore, mi nur irante iri antaŭen kaj inkluzivas
standardio.h, int ĉefa malplena.
Kaj tiam en tie, supozu, ke mi volas verki programon kiu stokas
multnombraj studentoj de multnombraj domoj, ekzemple.
Tiel estas kiel registrarial datumbazo de iu varo.
>> Do se mi bezonas la nomon unu studento, mi povus fari ion kiel char * nomon,
kaj Mi faros ion kiel -
fakte, ni uzas la CS50 biblioteko por nur momenton por fari ĉi tion
iom pli simpla, do ni povas prunti tiujn dekojn da linioj de kodo.
Kaj ni simple teni ĝin simpla.
Ni tenu gxin ĉenon, kaj nun GetString.
>> Do mi asertas nun ke mi stokis la nomo de iu studento, kaj la domo de
iu studento, simple uzante variabloj kiel ni faris en la semajno unu.
Sed supozas ke mi nun volas subteni multnombraj studentoj.
Bone, do mia instinktoj devas fari kordo name2, ricevas GetString, kordo
house2 gets GetString.
Kaj tiam nia tria studento, ni faru name3 GetString.
>> Bone, do ĉi tiu estas espereble okulfrapa vi kiel speco de stulta,
ĉar ĉi tiu procezo estas vere neniam tuj finos, kaj ĝi estas nur tuj
fari mian kodo aspektas malbone kaj pli granda malbono.
Sed ni solvis ĉi tro en semajno du.
Kio estis nia relative pura solvo kiam ni havis plurajn variablojn de la
sama datumtipo estas ĉiuj rilataj, sed ni ne volas ke tiu terura katastrofo
de simile, variabloj?
Kion ni faru anstataŭ?
>> Do mi kredas ke mi aŭdis kelkajn lokojn.
Ni havis tabelo.
Se vi volas multnombraj kazoj de io, kial ni ne purigas tiun tutan
supren kaj ĝuste diri, donu al mi tabelo nomis nomojn?
>> Kaj por nun, ni forte kodo 3.
Kaj tiam donu al mi alian tabelo vokis domoj, kaj lasu min por
nun forte kodo 3.
Kaj mi amase purigis la salaton, ke mi ĵus kreis.
Nun, mi ankoraŭ malfacile koditaj 3, sed eĉ la 3 povus dinamike venas de la
uzanto, aŭ argv, aŭ simila.
Do tiu estas jam pli pura.
>> Sed kio estas pri tiu ĝena estas ke nun, eĉ se nomo estas iel
fundamente ligita al studento domo -
ĝi estas studento, ke mi vere volas reprezenti -
Mi nun havas du tabeloj kiuj estas paralela en la senco ke ili estas la
sama amplekso, kaj nomoj krampo 0 supozeble mapojn al domoj krampo 0,
kaj nomoj krampo 1 mapoj al domoj krampo 1.
En aliaj vortoj, kiuj studento loĝas en tiun domon, kaj tiu alia studento
loĝas en tiu alia domo.
Sed verŝajne ĉi tiu povus esti faris eĉ pli pure.
>> Nu, ĝi povas, fakte.
Kaj lasu min antaŭeniri kaj malfermi supren structs.h, kaj vi instruos vin
vidu tiun ideon tie.
Rimarku, ke mi uzis typedef, kiel vi aludas antaŭ momento deklari nian
propra datumtipo.
Sed mi ankaŭ uzas tiun ĉi alia ŝlosilvorto vokis struct kiu donas al mi novan
datumstrukturo.
>> Kaj ĉi tiu datumstrukturo mi asertas tuj havi du aferoj ene de
it - ĉenon nomis nomon, kaj ĉeno nomata domo.
Kaj la nomo Mi tuj donos al tiu datumstrukturo tuj
esti nomita studento.
Mi povus nomi ion mi volas, sed ĉi semantike fari
senti min en mia menso.
>> Do nun, se mi malfermos pli bona versio de la programo mi komencis skribi
tie, lasu min rulumi al la supro.
Kaj kelkaj pliaj linioj de kodo ĉi tie, sed permesu al mi koncentri por
Nuntempe sur unu.
Mi jam deklaris konstanta nomita studentoj kaj hard coded 3 por nun.
Sed nun, rimarki kiom puraj mia kodo komencas akiri.
>> En linio 22, mi deklaras tabelo de studentoj.
Kaj rimarki ke lernanto estas ŝajne nun datumtipo.
Ĉar ĉe la supro de ĉi tiu dosiero, rimarki Mi komprenis ke header dosieron
ke mi tiris supren nur antaŭ momento.
Kaj tio header dosieron tutsimple havis tiu difino de studento.
>> Do nun, mi kreis mian propran datumoj tipo, ke la aŭtoroj de C jaroj
antaŭe ne pensis antaŭe.
Sed neniu problemo.
Mi povas fari tion mem.
Do tiu estas tabelo nomata studentoj, ĉiu el kies membroj
estas studento strukturo.
Kaj mi volas tri el tiuj en la tabelo.
>> Kaj nun, kion faras la reston de tiu programo faras?
Mi bezonis iu iom arbitra.
Tuj kiam de linio 24 pluen, Mi persisti de 0 al 3.
Mi tiam demandas al la uzanto por la studenta nomo.
Kaj tiam mi uzas GetString kiel antaŭe.
Do mi petos la studenta domo, kaj mi uzas GetString kiel antaŭe.
>> Sed avizo - iomete nova peco de sintakso -
Mi povas ankoraŭ indekso al la i-a studento, sed kiel Mi alvenas ĉe la specifa datumoj
kampo ene de la struct?
Nu, kio estas ŝajne la nova peco de sintakso?
Estas nur la skalara operatoro.
>> Ni ne vere vidis tiun antaŭe.
Vi jam vidis gxin en pset kvin se vi havas eniĝis en la jam kun bitmap dosierojn.
Sed la skalara nur signifas ene de ĉi struct aŭ multnombraj kampoj, donu dot
nomo, aŭ doni al mi dot domo.
Tio signifas iras ene de la struct kaj akiri tiujn apartajn kampojn.
>> Kion faras la reston de tiu programo faras?
Ne ĉiuj kiuj sexy.
Rimarku, ke mi persisti de 0 al 3 denove, kaj mi simple krei la angla
frazo kiel tia kaj tia estas en tiaj kaj tia domo, pasante en dot nomon de
la i-a lernanto kaj lia domo tiel.
>> Kaj poste persiste, nun ni komencu akiri anal pri tio, nun ke ni estas
familiara kun kio malloc kaj aliaj funkcioj estis
faras ĉiu ĉi tempo.
Kial mi devas liberiĝi ambaŭ nomo kaj domo, kvankam mi
ne nomis malloc?
>> GetString faris.
Kaj tiu estis la malpura malgranda sekreto por kelkaj semajnoj, sed GetString havas
iris filtrante memoro tra la tuta meti ĉiuj semestro tiom.
Kaj valgrand volo fine malkaŝi tion al ni.
>> Sed tio ne estas granda interkonsento, ĉar mi scias, ke mi povas simple liberigi la nomo
kaj la domo, kvankam teknike, al estu super, super sekuraj, mi devus esti
faras iun eraron kontrolinte tie.
Kio estas via instinktoj diras al vi?
Kion mi povas kontroli por antaŭ ol mi liberigi kio estas
kordo, aka kiu char *?
>> Mi devus vere esti kontrolanta se studentoj krampo i dot nomo ne
egala nula.
Tiam estos bone por antaŭeniri kaj libera ke pointer, kaj sama aŭ alian
tiu siavice.
Se lernantoj krampo i dot domo ne estas egala al nula, tiu nun protektos
kontraŭ la angulo kazo en kiu GetString revenas iun kiel nula.
Kaj ni vidis antaŭ momento, printf volo protekti nin ĉi tien ĝuste dirante
nula, kiu tuj serĉos stranga.
Sed almenaŭ ĝi ne segfault, kiel ni jam vidis.
>> Nu, lasu min fari unu alia afero ĉi tie. structs-0 estas speco de stulta programo
ĉar mi eniras tiun tutan datumojn, kaj poste ĝi estas perdita fojo la programo finiĝas.
Sed lasu min antaŭeniri kaj fari ĉi tion.
Lasu min fari la fina fenestro iom pli granda.
Lasu min fari structs-1, kiu estas nova versio de ĉi.
>> Mi zomi iomete.
Kaj nun mi kuros dot slash structs-1.
Studenta nomo -
Davido Mather, ni faru Rob Kirkland, ni faru Lauren Leverett.
Kio estas interesa nun estas avizo -
kaj mi nur scias tion, ĉar Mi skribis la programon -
ekzistas dosiero nun en mia aktuala dosierujon nomita students.csv.
Iuj el vi eble vidis tiuj en la reala mondo.
>> Kio estas CSV-dosiero?
Komo-disigita valoroj.
Estas iel kiel malriĉa homo, versio de Excel dosiero.
Ĝi estas tablo de vicoj kaj kolumnoj, ke vi povas malfermi en programo kiel Excel,
aŭ Nombroj sur Mac.
>> Kaj se mi malfermas tiun dosieron ĉi tie sur gedit, avizo - kaj la numeroj ne estas tie.
Tio nur gedit diri mi linio nombroj.
Rimarku en la unua linio de tiu dosiero estas David kaj Mather.
La sekva linio estas Rob komo Kirkland.
Kaj la tria linio estas Lauren komo Leverett.
>> Do kion mi kreis?
Mi nun skribas C programon kiu efektive povas generi ŝtono
kiu povas esti malfermita en programon kiel Excel.
Ne ĉiuj kiuj konvinka datumoj aro, sed se vi havas multe pli grandaj pecoj de
datumoj, ke vi efektive volas manipuli kaj fari grafikaĵoj de kaj la
kiel, ĉi tiu estas eble unu maniero krei tiun datumoj.
Cetere, CSVs estas fakte super komuna nur por stoki simpla datumo -
Yahoo Financoj, ekzemple, se vi ricevas stock quotes tra iliaj tn
API, la libera servo kiu permesas akiri aktualan supren-al-la-dato stoko
citaĵojn por entreprenoj, ili doni la datumojn tie en la
super simpla CSV formato.
>> Do kiel ni faros tion?
Nu rimarki, la plejparto de ĉi tiu programo preskaŭ la sama.
Sed rimarkos cxi tie, anstataŭ presi la studentoj ekstere, sur linio 35
antaŭen, mi asertas ke mi ŝparas la lernantoj al disko, do ŝpari dosieron.
>> Do rimarki min deklari DOSIERO * -
Nun, ĉi tiu estas speco de anomalio en C. Ial ajn DOSIERO estas ĉiuj kaskedoj,
kiu ne estas kiel plej parto de aliaj datumtipoj en C. Sed ĉi tiu estas integrita
datumtipo, DOSIERO *.
Kaj mi deklari puntero al dosiero, Estas kiel vi povas pensi pri tio.
>> fopen signifas malferma dosiero.
Kio dosieron vi volas malfermi?
Mi volas malfermi dosieron kiun mi volas arbitre nomas students.csv.
Mi povus nomi kiun ajn mi volas.
>> Kaj poste preni konjekton.
Kion faras la dua argumento al fopen probable signifas?
Ĝuste, w por skribi, ĉu esti r por legado.
Tie estas por append se vi volas aldoni vicoj kaj ne
anstataŭigi la tuta afero.
>> Sed mi nur volas krei tiun dosieron fojon, do mi uzos citaĵo unquote w.
Kaj mi scias, ke nur de esti legitaj la dokumentadon, aŭ la homo paĝo.
Se dosiero estas ne nulaj - alivorte, se nenio misokazis tie -
lasu min persisti pri la studentoj de 0 al 3.
>> Kaj nun rimarkas ke estas io iam tiel iomete malsamajn
pri linio 41 ĉi tie.
Ĝi ne estas printf.
Estas fprintf por dosiero printf.
Do tuj skribi al dosiero.
Kiun dosieron?
La unu kies puntero vi specifas kiel la unua argumento.
>> Tiam ni specifi formato kordo.
Tiam ni precizigi kion string ni volas plug in por la unua procento s, kaj
tiam alia variablo aŭ la dua procento s.
Tiam ni fermas la dosieron kun fclose.
Ol mi liberigi la memoron kiel antaŭe, kvankam Mi devas iri reen en kaj aldoni
iuj ĉekojn por nula.
>> Kaj tio estas ĝi.
fopen, fprintf, fclose donas al mi la kapablo krei tekstaj dosieroj.
Nun, vi vidos en problemo aro kvin, kiu engaĝas bildoj, vi uzos
duumajn dosierojn anstataŭe.
Sed fundamente, la ideo estas la sama, eĉ se la funkcioj vi instruos vin
vidas estas iomete malsamaj.
>> Do trombo tour, sed vi akiros tro familiara kun dosieron I/O--
enigo kaj eligo - kun pset kvin.
Kaj demandojn pri la komenca fundamentojn tie?
Jes?
>> Kio se vi provas liberigi nulan valoron?
Mi kredas, krom libera alvenis al iom pli uzantamika, vi povas
potenciale segfault.
Pasante ĝin nula estas malbone ĉar mi ne kredu libera tedas por kontroli vin,
ĉar estus potenciale esti restaĵoj de tempo por ĝin fari sin por
ĉiuj en la mondo.
Bona demando, kvankam.
>> Bone, do ĉi tiu speco de gets nin al interesa temo.
La temo de problemo aro kvin estas forensics.
Almenaŭ tio estas parto de la problemo aro.
Forensics ĝenerale rilatas al la reakiro de informo kiu povas aŭ
povas ne esti forigita intence.
Kaj do mi pensis mi volus doni al vi rapidan gusto de kio vere okazas ĉiu
tiu tempo sub la kapuĉo de via komputilo.
>> Ekzemple, se vi havas ene de via portebla aŭ via labortablo komputilo
malmola disko, estas ĉu mekanika aparato kiu fakte ŝpinas -
tie estas cirkla aĵoj nomata pladoj kiuj aspektas sufiĉe ŝatas kion mi
nur havis sur la ekrano tie, kvankam ĉi tiu estas pli malnova lernejo.
Tio estas tri-kaj-al-duono coloj malmola disko.
Kaj tri kaj duona coloj raportas de kun de la afero kiam vi instalu ĝin
en komputilo.
>> Multaj el vi infanoj en viaj komputiloj nun havas solida stato diskoj, aŭ unuecoj SSD,
kiuj ne movi partojn.
Ili estas pli kiel RAM kaj malpli kiel tiuj mekanikaj aparatoj.
Sed la ideoj daŭre estas la sama, certe kiel ili rilatas
al problemo starigis kvin.
>> Kaj se vi pensas nun malmola disko reprezentas esti rondo, kiu
Mi desegnas kiel ĉi tie.
Kiam vi kreas dosieron en via komputilo, ĉu ĝi estas SSD, aŭ en
tiu kazo, plej granda lernejo malmola disko, tiu dosiero komprenas multnombraj bitoj.
Diru ke temas pri tiu ĉi 0 kaj 1, tutan faskon de _0s_ kaj 1s.
Do ĉi tiu estas mia tuta malmola disko.
Tio estas ŝajne sufiĉe granda dosiero.
Kaj oni uzas ĉe la _0s_ kaj 1s en tiu parton de la fizika plado.
>> Nu, kio estas fizika parto?
Nu, tio rezultas ke la malmola disko, almenaŭ de tiu tipo, ne estas
tiuj etaj iom magnetaj eroj.
Kaj ili esence havas nordo kaj suda polusoj al ili, tiel ke se vi
turni unu el tiuj magnetaj eroj tiu formo, vi povus diri ke ĝi estas
reprezentante 1.
Kaj se ĝi estas renversita suden al nordo, vi povus diri ke ĝi estas
reprezentante 0.
>> Do, en la reala fizika mondo, jen kiel vi povis reprezenti ion
duuma stato de la 0 kaj 1.
Do jen ĉio dosiero estas.
Ekzistas tuta amaso de magneta eroj kiuj estas iliaj tiu maniero aŭ
tiamaniere, kreante ŝablonoj de _0s_ kaj 1s.
>> Sed ĝi rezultas kiam vi konservos dosieron, iuj informoj estas savita aparte.
Do tiu estas malgranda tablo, dosierujo, por tiel diri.
Kaj Mi vokos tiu kolumno nomo, kaj Mi nomas tiun kolumnon loko.
>> Kaj mi tuj diros, supozi ĉi tiu estas mia vivresumo.
Mia resume.doc estas stokita en situo, diru 123.
Mi ĉiam iras por tiu numero.
Sed sufiĉas diri, ke nur ŝatis en RAM, vi povas preni malmolan diskon
tio estas gigabajto aŭ 200 gigabajtoj aŭ terabajto, kaj vi povas
numeron ĉiuj bajtoj.
Vi povas kalkuli ĉiujn pecojn el 8 bitoj.
>> Do ni diru ke tiu Estas situo 123.
Do tiu ĉi dosierujo ene de mia mastruma Sistemo memoras, ke mia
vivresumo estas je situo 123.
Sed metas interesa kiam vi forviŝi dosieron.
>> Do ekzemple -
kaj dankeme, la plejparto de la mondo havas kaptita sur tio - kio okazas kiam
vi treni dosieron al via Mac OS Trash aŭ via Windows Reutiliga Bin?
Kio estas la celo de fari tion?
Estas evidente por forigi la dosieron, sed kion faras la akto de trenante kaj
delasante en viajn Trash aŭ vian Reutiliga Bin fari per komputilo?
>> Absolute nenio, vere.
Estas nur kiel dosierujo.
Ĝi estas speciala dosierujo, certe.
Sed tio ĝi efektive forigi la dosieron?
>> Nu, ne, ĉar kelkaj el vi verŝajne estis kiel, oh damn, vi ne
intencas fari tion.
Do vi duoble klaku la Trash aŭ Reutiliga Bin.
Vi poked ĉirkaŭe kaj vi reakiris la dosieron nur trenante ĝin
el tie.
Do klare, ne nepre viŝi ĝin.
>> OK, vi estas pli inteligenta ol tio.
Vi scias, ke ĝuste trenante ĝin en la Trash aŭ Reutiliga Bin ne signifas
vi malplenigi la rubujon.
Do vi iru al la menuo, kaj vi diras Malplena Trash aŭ Malplena Reutiliga Bin.
Tiam kio okazas?
>> Jes, do ĝi estas forigita pli.
Sed cxio, kio okazas estas tiu.
La komputilo forgesas kie resume.doc estis.
>> Sed kio ne ŝanĝis ŝajne en la bildo?
La bitoj, la _0s_ kaj 1s ke mi asertas estas en la loko de iu fizika aspekto de
la aparataro.
Ili estas ankoraŭ tie.
Estas nur la komputilo havas forgesis, kio ili estas.
>> Do ĝi estas esence liberigis la dosiero bitojn por ke ili povas reuzi.
Sed ne ĝis vi krei pli dosierojn, kaj pli dosierojn, kaj pli dosierojn volo
probabilísticamente, tiuj _0s_ kaj 1s, tiuj magnetaj eroj, get reuzi,
upside aŭ dekstra flanko, cxar aliaj dosieroj, _0s_ kaj 1s.
>> Do vi havas ĉi fenestro de tempo.
Kaj ne de antaŭvideblaj longitudo, vere.
Ĝi dependas de la grandeco de via malmola drive kaj kiom da dosieroj vi havas kaj
kiel rapide vi faru novajn.
Sed estas ĉi fenestro de tempo dum kiu tiu dosiero estas ankoraŭ perfekte
recuperable.
>> Do, se vi iam uzi programojn kiel McAfee aŭ Norton por provi reakiri
datumoj, ĉiuj ili faras provas reakiri ĉi tn dosierujo
eltrovi kie estas via dosiero estis.
Kaj kelkfoje Norton kaj diros: dosiero 93% recuperable.
Nu, kion tio signifas?
Tio nur signifas, ke iu alia dosiero hazarde finis uzante, ekzemple,
tiuj bitoj el via originala dosiero.
>> Do kio estas reale implikita en reakiri datumoj?
Nu, se vi ne havas ion kiel Norton antaŭ-instalita sur via komputilo,
la plej bona vi povas iam fari estas rigardi en la tuta malmola disko serĉi
mastroj de bitoj.
Kaj unu el la temoj de problemo aro kvin estas ke vi sercxos la
ekvivalento de malmola disko, kun jura bildo de kompakta flash karto de
cifereca fotilo, serĉante la _0s_ kaj 1s kiu tipe, kun altaj
probablo, ili reprezentas la komenci de JPEG-bildon.
>> Kaj vi infanoj povas reakiri tiujn bildojn de supozante, se mi vidas tiun bildon de
bitoj en la jura bildo, kun alta probablo, kiu markas
la komenco de JPEG.
Kaj se mi vidas la saman desegnon denove, ke probable markas la komencon de
alia JPEG, kaj alia JPEG, kaj alia JPEG.
Kaj jen estas tipe kiel datumoj reakiro funkcios.
Kio estas agrable pri JPEG-oj estas kvankam la formato de dosiero mem estas iom
kompleksa, la komenco de ĉiu tia dosiero estas fakte sufiĉe identigebla
kaj simpla, kiel vi vidos, se vi havas ne jam.
>> Do ni prenu pli proksiman rigardon sube la kapuĉo pri ekzakte kio estis
oni iris kaj kion tiuj _0s_ kaj 1s estas, por doni al vi iom pli ol
kunteksto por tiu aparta defio.
>> [VIDEO reprodukto]
>> -Kie via PC stokas plej el lia permanenta datumoj.
Por fari tion, la datumoj vojaĝas de RAM kune kun la programaro signalojn kiuj rakontas
la malmola disko kiel memori ke la datumoj.
La malmola disko cirkvitoj traduki tiujn signalojn en tensio
fluktuoj.
Tio, siavice, kontroli la malmola disko de movi partojn, iuj el la malmultaj
movi partojn restigis en la moderna komputilo.
>> Kelkaj el la signaloj kontroli motoro kiuj ŝpinas metalo-kovrita pladoj.
Viaj datumoj estas vere stokita sur ĉi tiuj pladoj.
Aliaj signaloj movi la legado / skribo kapoj por legi aŭ
skribi datumojn sur la pladoj.
Ĉi maŝinaro tiel preciza ke homa hararo eĉ ne povis pasi inter la
kapojn kaj ŝpini pladoj.
Tamen, ĉio laboras en terura rapidoj.
>> [FINO reprodukto de vídeo]
>> DAVID Malan: Zoom en iom profunda nun kio estas
fakte en tiuj pladoj.
>> [VIDEO reprodukto]
>> -Ni rigardu kion ni ĵus vidis en malrapida movado.
Kiam mallonga premas de elektro estas sendita al la legado / skribi kapo, se klakas
sur eta elektromagneta por frakcio de sekundo.
La magneto kreas kampo, kiu ŝanĝas la polarity de eta, eta
parton de la metalo eroj kiuj coat ĉiu plado surfaco.
>> Al ŝablono serio de tiuj etaj, akuzita-supren areoj sur la disko
reprezentas unuopa bito de datumojn en la duuma nombro
sistemo uzita de komputiloj.
Nun, se la nuna estas sendita unu vojo tra la legado / skribo kapo, la areo
estas polarizita en unu direkto.
Se la nuna estas sendita en la kontraŭa direkto, la
polarizo estas inversa.
>> Kiel vi akiras datumoj sur la fiksa disko?
Nur inversigi la procezo.
Do estas la eroj en la disko kiu alvenas la fluo en la
legi / skribi kapo moviĝas.
Kunmetis milionojn da tiuj imantado segmentoj, kaj
vi havas dosieron.
>> Nun, la pecoj de sola dosiero eble disigxos ĉie unueco de
pladoj, speco de kiel la katastrofo de paperoj sur via skribotablo.
Do speciala ekstra dosieron sekvadon de kie ĉiu.
Ĉu vi ne deziras, ke vi havis io simila?
>> [FINO reprodukto de vídeo]
>> DAVID Malan: Bone, verŝajne ne.
Do kiel multaj el vi infanoj kreskis kun tiuj?
Bone, do ĝi estas malpli kaj malpli manoj ĉiu jaro.
Sed mi ĝojas ke vi estas almenaŭ familiara kun ili, ĉar ĉi tiu kaj nia propra
libro demo, malfeliĉe, mortas tre malrapida morto tie de familiareco.
>> Sed ĉi tiu estas kion mi, almenaŭ, tie en alta lernejo, uzis uzon por kopioj.
Kaj estis mirinda, ĉar vi povus stoki 1.4 megabajtoj sur
tiu aparta disko.
Kaj tio estis la alta denseco versio, kiel indikitaj de la HD, kiu havas
signifas antaŭ la hodiaŭa HD filmetoj.
>> Norma denseso 800 kilobajtoj.
Kaj antaŭ tio, estis 400-kilobajto diskoj.
Kaj antaŭ tio, estis 5 kaj 1/4 colo diskojn, kio estis vere disketon,
kaj iom pli larĝa kaj pli altkreska ol tiuj aĵoj ĉi tie.
Sed vi povas fakte vidi la tn disketon aspekto de tiuj diskoj.
>> Kaj funkcie, ili estas efektive sufiĉe simila al malmolaj diskoj de ĉe
Almenaŭ tiu tipo.
Denove, unuecoj SSD en pli novaj komputiloj labori iom malsame.
Sed se vi movas ke iom metalo langeto, vi povas fakte vidi iom kuketo,
aŭ plado.
>> Ne estas metalo kiel ĉi tiu.
Ĉi tiu fakte iuj malkaraj mola materialo.
Kaj vi povas ia movi ĝin.
Kaj vi trully ĵus forviŝis de sur kelkaj nombro de bitoj aŭ magneta eroj
el tiu ĉi disko.
>> Do dankeme, estas nenio en ĝi.
Se tio afero estas en la maniero - kaj kovru viaj okuloj kaj tiuj de via proksimulo -
vi povas nur ia tiri tiun tuta ingon ekstere tiel.
Sed estas iom printempo, do estu konscias pri tio kun viaj okuloj.
Do nun vi havas vere disketo.
>> Kaj kio estas rimarkinda pri tiu estas ke en tiom kiom tio estas
malgrandskala reprezento de pli granda malmola disko, tiuj aferoj estas super,
super simpla.
Se vi pinĉi la fundo de tio, nun ke ke metalo afero estas for, kaj senŝeligi
ilin malfermi, la tuta estas estas du pecojn de sentis kaj la tn disketo
kun peco de metalo sur la enen.
>> Kaj iras duono de mia disko la enhavo.
Tie iras alia duono de ili.
Sed tio estas cxio, kion ŝpinis ene de via komputilo en la pasintaj tempoj.
>> Kaj denove, por meti ĉi tion en perspektivon, kiom granda estas la plimulto de via
malmola pelas tiuj tagoj?
500 gigabajtoj, oni terabajto, eble en labortabla komputilo, 2 terabytes, 3
terabytes, 4 terabytes, ĉu ne?
Tiu estas unu megabajto, donos nek prenos, kio povas eĉ persvadis tipa MP3
plu tiujn tagojn, aŭ iu simila muziko dosiero.
>> Do iom memoraĵo por vi hodiaŭ, kaj ankaŭ por helpi contextualizar kio
ni prenos por sentado nun en problemo starigis kvin.
Tuj kiam tiuj estas via gardi.
Do mi transiro al kie estos elspezante la sekvanta pset tiel.
Do ni nun povas tion paĝon por - oh, kelkaj anoncoj rapide.
>> Ĉi tiu vendredo, se vi ŝatus aliĝi CS50 por tagmanĝi, iru al la kutima loko,
cs50.net/rsvp.
Kaj fina projekto -
tiel por la Syllabus, ni eldonis la fina projekto specifo jam.
Konscii, ke tio ne signifas ĝi estas pro aparte frue.
Ĝi estas eldonita, vere, nur por akiri you guys pensante pri ĝi.
Kaj efektive, la super signifa procento de vi estos pritrakti
fina projektojn en materialo, ke ni eĉ ne alvenis al la klaso,
sed volo kiel frua kiel venontan semajnon.
>> Rimarku, tamen, ke la spec vokas kelkaj diversaj komponantoj de la
fina projekto.
La unua, en kelkaj semajnoj, estas antaŭ-propono, bela hazarda retpoŝton al
via TF por diri al li, kaj kion vi estas pensi pri via projekto, kun
neniu devontigo.
Propono estos via aparta devontigo, dirante, tie, tio estas kio
Mi ŝatus fari por mia projekto.
Kion vi opinias?
Tro granda?
Tro malgranda?
Ĉu regebla?
Kaj vi vidos la spec por pli da detaloj.
>> Paro de semajnoj post tio estas la statuso raporto, kiu estas simile
hazardaj retmesaĝon al via TF diri kiom malproksime malantaŭ vi estas en via fina
projekto efektivigo, sekvate de la CS50 Hackathon al kiu ĉiuj
estas invitita, kiu estos evento de 8:00 PM sur unu vesperon ĝis 7:00
AM la sekva mateno.
Pico, kiel mi menciis en la semajno nulo, wil utili je 9:00 PM,
Ĉina manĝo je 1:00 AM.
Kaj se vi estas ankoraŭ viglaj je 5:00 AM, ni prenos vin al IHOP por matenmanĝo.
>> Do la Hackathon estas unu el la plej memorindaj travivaĵoj en la klaso.
Tiam la efektivigo estas pro, kaj tiam la klimataj CS50 Foiro.
Pliaj detaloj sur ĉiuj de ĉi tiuj en la semajnoj venonta.
>> Sed ni reiru al io malnova lernejo -
denove, tabelo.
Do tabelo estis bela, ĉar ĝi solvas problemoj kiel ni vidis nur
antaŭ momento kun studento strukturoj ricevas iom ekstere de kontrolo, se ni
volas havi studento unu, studento du, studento tri, studento dot dot dot,
iuj arbitraj nombro de studentoj.
>> Do arrays, kelkajn semajnojn, abrupte malsuprenflugis en kaj solvitaj ĉiuj niaj problemoj de ne
sciante anticipe kiom da aferoj de iu tipo ni volas.
Kaj ni vidis ke structs povas helpi nin plu organizi niajn kodo kaj teni
koncepte simila variabloj, kiel nomo kaj domo, kune, tiel, ke ni
povas trakti ilin kiel unu enton, ene de kiuj estas pli malgrandaj pecoj.
>> Sed arrays havas iujn malfacilaĵojn.
Kio estas kelkaj el la malavantaĝoj ni renkontis
kun arrays tiel multe?
Kio estas tio?
Fiksa grandeco - do eĉ kvankam vi povus povos rezervi memoron por
tabelo, unufoje vi scias, kiel multaj studentoj vi havas, kiom da signoj vi havas
de la uzanto, unufoje vi jam asignitaj la tabelo, vi ia pentrita
vin en angulon.
>> Ĉar vi ne povas enmeti novajn elementojn en la mezo de tabelo.
Vi ne povas enigi pli elementoj fine de tabelo.
Vere, vi devas veni al kreante tute nova tabelo, kiel ni diskutis,
kopiante la malnova al la nova.
Kaj denove, tio estas la kapdoloro, ke GetString traktas por vi.
>> Sed denove, vi ne povas eĉ enmeti io en la mezo de la tabelo
se la ritmo ne tute plenigis.
Ekzemple, se ĉi tiu tabelo tie de grandeco ses nur havas kvin aĵojn en ĝi,
bone, vi povus simple Tack io sur la fino.
Sed kion se vi volas enmeti ion en la mezo de la
tabelo, kvankam tio povus havi kvin el ses aferoj en ĝi?
>> Nu, kion ni faros kiam ni havis ĉiujn de nia homa volontuloj scenejo en
semajnoj estinteco?
Se ni volis meti iun ĉi tie, ĉu tiuj homoj kiel movi ĉi
vojo, aŭ tiuj homoj kiel movi ĉi maniero, kaj tio fariĝis multekosta.
La movo de homoj ene de tabelo finis adicianta supren kaj kostante
ni tempon, do multaj el niaj n kvadratoj kurante tempoj kiel inserción varon, por
Ekzemple, en la plej malbona kazo.
Do arrays estas grandaj, sed devas scii anticipe kiel granda vi volas ilin.
>> Do okej, jen solvo.
Se mi ne scias anticipe kiom da lernantoj mi havu, kaj mi scias unufoje
Mi decidas, kvankam, mi ne scias kie trovi kun tiu multaj lernantoj, kial mi ne ĝuste ĉiam
destini duoble da spaco kiel mi povis pensi mi bezonas?
Ĉu tio ne estas racia solvo?
>> Realisme, mi ne pensas ke ni estas tuj bezonos pli ol 50 fendoj
en tabelo por meza grandeco klaso, do ni nur rondigi supren.
Mi faros 100 fendoj en mia tabelo, nur tiel ke ni povos definitive akiri la
nombro de studentoj mi anticipas esti en iu meza grandeco klaso.
Do kial ne simple rondigi supren kaj destini pli memoro, tipe, por tabelo
ol vi kredas ke vi povus eĉ bezonas?
Kio estas tio simpla pushback al tiu ideo?
>> Vi simple malŝparas memoro.
Laŭvorte ĉiu programo skribas tiam Estas eble uzi duoble da memoro kiel
vi fakte bezonas.
Kaj tio simple ne sentas min kiel aparte eleganta solvo.
Cetere, nur malpliigas la probablo de problemo.
Se vi hazarde havas popularan kurson unu semestro kaj vi havas 101
studentoj, via programo estas ankoraŭ fundamente alfrontante la saman temon.
>> Do dankeme, estas solvo por ĉi tiun anoncon ĉiuj niaj problemoj en la formo
de datumstrukturoj, kiuj estas pli kompleksaj ol tiuj,
ni vidis tiom.
Tio, mi asertas, estas lerta kunligita.
Jen listo de nombroj -
9, 17, 22, 26, kaj 34 -
kiuj estis kunligitaj per vojo de kio mi desegnita kiel sagoj.
>> En aliaj vortoj, se mi volis reprezenti tabelo, mi povis fari
iu kiel ĉi tio.
Kaj Mi metos tion en la superkape en nur momento.
Mi povus fari -
saluton, tute certe.
Stand by.
Nova komputilo tie, klara -
tute certe.
>> Do, se mi havas ĉi tiujn numerojn en tabelo -
9, 17, 22, 26, 24 -
ne nepre por grimpi.
Bone, do jen mia tabelo -
oh my god.
Bone, do jen mia tabelo.
Ho, mia dio.
>> [Ridado]
>> DAVID Malan: ŝajnigi.
Ĝi estas tro multa peno reiri kaj fiksi ke, tial tie -
26.
Do ni havas ĉi tiun tabelo de 9, 17, 22, 26, kaj 34.
Por tiuj el vi povas vidi la hontinda eraro mi ĵus faris,
tie ĝi estas.
>> Do mi asertas ke ĉi tiu estas tre efika solvo.
Mi destinis kiel multaj ints kiel Mi bezonas - unu, du, tri,
kvar, kvin, ses aŭ -
kaj mi tiam stokitaj la numeroj ene de ĉi tabelo.
Sed supozu, do, mi volas enmeti valoro kiel la numero 8?
Nu, kie ĝi iras?
Supozu mi volas enmeti nombro kiel 20.
Nu, kie ĝi iras?
Ie tie, en la mezo, aŭ la nombro 35 havas iri
ie ĉe la fino.
Sed mi estas ĉiu el la spaco.
>> Kaj tiel tio estas fundamenta defio de arrays tio estas la solvo.
Mi asertis antaŭ momento, GetString solvas tiun problemon.
Se vi volas enmeti sesa nombro en ĉi tiu tabelo, kio estas almenaŭ unu
solvo povas refalis sur sekura, same kiel ni faras kun GetString?
Kio estas tio?
>> Nu, fari ĝin pli granda estas facile dirite ol farite.
Ni ne povas nepre fari la tabelo pli grandaj, sed kion ni povas fari?
Faru nova tabelo kiu estas pli granda, de grandeco 6, aŭ eble grandeco 10, se ni volas
eliri antaŭeniras de aferoj, kaj poste kopii la malnova tabelo en la nova, kaj poste
liberigi la malnova tabelo.
>> Sed kio estas la rula tempo nun de tiu procezo?
Estas granda O de n, ĉar la kopio tuj kostos al vi kelkajn ekzemplerojn de
, do ne tiel ideala se ni devas destini nova tabelo, kiu tuj
konsumi duoble pli memoro provizore.
Kopiu malnova en novajn -
Mi volas diri, estas nur kapdoloron, kiu estas, denove, kial ni skribis
GetString por vi.
>> Do kio povus ni faru anstataŭ?
Nu, se nia datumstrukturo reale havas truojn en ĝi?
Supozu, ke mi malstreĉiĝi mia celo de havi apudaj pecoj de memoro, kie 9
Estas tuj apud 17, kiu estas dekstra flanko de 22, kaj tiel plu.
>> Kaj supozu, ke 9 povas esti super tie en RAM, kaj 17 povas esti super tie en RAM,
kaj 22 povas esti super tie en RAM.
Alivorte, mi ne bezonas ilin eĉ kun malantaŭo al malantaŭo plu.
Mi nur devas iel enhebrar kudrilo tra ĉiu el tiuj numeroj, aŭ ĉiu
de ĉi tiuj nodoj, kiel ni nomas la ortanguloj kiel mi desegnis ilin,
memori pri kiel atingi la lastan tiaj nodo de la unua.
>> Do kio estas la programado konstrui ni vidis sufiĉe ĵus kun kiu mi
povas apliki tiu fadeno, aŭ desegnita tie, kun kiu mi povas
apliki tiujn sagoj?
Do montriloj, ĉu ne?
Se mi malŝparas ne nur int, sed nodo - kaj por
nodo, mi simple signifas ujo.
Kaj vide, mi volas diri rektangulo.
Do nodo ŝajne bezonas enhavi du valoroj -
la int mem, kaj tiam, kiel implicita de la fundo de la duono de la ortangulo,
sufiĉa spaco por int.
>> Do nur pensante antaŭen tie, kiom granda estas ĉi tiu nodo, tiu
ujo en demando?
Kiom da bajtoj por la int?
Supozeble 4, se estas la sama kiel kutima.
Kaj tiam, kiom da bitokoj por la puntero?
4.
Do ĉi ujo, aŭ ĉi tiu nodo, estas tuj estos 8-bajto strukturo.
Ho, kaj tio estas feliĉa hazardo ke ni simple enkondukis tiun nocion de
oni struct, aŭ C strukturo.
>> Do mi asertas ke mi volas doni paŝon kun tiu pli kompleksa
efektivigo de listo de nombroj, oni ligitaj listo de nombroj, mi bezonas fari
iom pli pensado ĉe fronto kaj deklari ne nur int, sed struct
ke mi vokos, konvencie ĉi tie, nodo.
Ni povus nomi ion ni volas, sed nodo tuj estos temáticas en amaso
de la aĵoj ni komencas rigardi nun.
>> Ene de tiu nodo estas int n.
Kaj tiam tiu sintakso, iom weird unuavide -
struct nodo * proksimaj.
Nu pictóricamente, kio estas tio?
Tio estas la malsupera duono de la ortangulo, kiun ni vidis
nur antaŭ momento.
>> Sed kial mi diras struct nodo * kontraste al nur nodo *?
Ĉar se tiu puntero notas en alia nodo, estas nur la
adreso de nodo.
Tio estas konsekvenca kun kion ni diskutis pri montriloj tiom.
Sed kial, se mi pretendas tiu strukturo estas vokis nodo, mi devas diri struct
nodo ene tie?
>> Ekzakte.
Estas iel stulta realaĵo de C. La typedef, por tiel diri, ne havas
okazis ankoraŭ.
C Super laŭvorta.
Ĝi legas vian kodon supre fundo, maldekstre dekstren.
Kaj ĝis batas ke punktokomo en la funda linio, divenu kion ne
ekzisti kiel datumtipon?
Nodo, citaĵo unquote nodo.
>> Sed pro la pli abundajn deklaro mi faris sur la unua linio -
typedef struct nodo -
ĉar tio venis unue, antaŭ ol la krispa krampoj, jen speco de kiel
antaŭ-eduki Clang ke, vi scias kion, donu al mi struct
vokis struct nodo.
Sincere, mi ne ŝatas nomi aĵojn struct nodo, struct nodo ĉiuj
laŭlonge de mia kodo.
Sed mi nur uzos ĝin unu fojon, nur ene, por ke mi povas efike
krei specon de cirkla referenco, ne puntero al mi mem per, sed
puntero al alia de identa tipo.
>> Do rezultas ke sur datumstrukturo kiel tiu, ke estas kelkaj
operacioj kiuj povus esti de intereso al ni.
Ni eble volas enmeti en lerta kiel ĉi tio.
Ni eble volas forviŝi el listo ŝatas tion.
Ni eble volas sercxi la listo por valoro, aŭ pli ĝenerale, través.
Kaj través estas nur ornama metodo de dirante komencas je la maldekstra kaj movi ĉiujn
la vojon al la dekstra.
>> Kaj rimarki, eĉ kun tiu iomete pli kompleksa datumstrukturo, lasu
mi proponas ke ni povas prunti iom da la ideoj de la lastaj du semajnoj kaj
apliki funkcio nomata serĉi ŝatas tion.
Ĝi tuj revenos vera aŭ falsa, indikante, jes aŭ
ne, n estas en la listo.
Lia dua argumento estas puntero al la listo mem, tial
puntero al nodo.
>> Ĉiuj mi tuj poste fari estas deklari portempan variablo.
Ni nomas ĝin ptr per konvencio, por puntero.
Kaj mi atribui ĝin egala al la komencante de la listo.
>> Kaj nun rimarkas dum buklo.
Tiel longe kiel puntero ne estas egala al nula, mi tuj kontroli.
Ĉu puntero sago n egala al la n kiu pasis en?
Kaj atendi minuton - nova peco de sintakso.
Kio estas sago subite?
Jes?
>> Ekzakte.
Do dum kelkaj minutoj, oni uzas la skalara skribmaniero por aliri ion
ene de la struct, se la variablo Vi ne estas la struct
mem, sed puntero al struct, dankeme, peco de sintakso ke
fine faras intuicia senco.
La sago signifas sekvi la puntero, kiel niaj sagoj tipe signifas
pictóricamente kaj iru ĉe datumoj kampo ene.
Do sago estas la sama afero kiel punkto, sed vi uzas ĝin kiam vi havas puntero.
>> Do nur por recap tiam, se la n kampo ene de la struct nomata puntero
egalas egalas n, revenu vera.
Alie, tiu linio tie - puntero egalas puntero proksimaj.
Do kio estas tiu faras, avizo, estas se mi mi nuntempe fingromontrante la struct
enhavanta 9, kaj 9 ne estas la numero Mi serĉas - supozi Mi serĉas
por n egalas 50 -
Mi tuj ĝisdatigi mian temporal puntero por ne atentigi en ĉi tiu nodo
plu, sed puntero sago sekva, kiu tuj metis min tie.
>> Nun, mi rimarkis estas ventego enkonduko.
Merkrede, ni vere faras ĉi kun kelkaj homoj kaj kun iu pli
kodo en malrapida ritmo.
Sed realigi, ni nun faras niaj datumoj strukturoj pli kompleksaj por ke nia
algoritmoj povas akiri pli efika, kiu tuj estos bezonata por
pset ses, kiam ni montru in, denove, tiuj 150.000 vortojn, sed bezonas fari tiel
kompetente, kaj ideale, krei programo kiu kuras por niaj uzantoj ne en
lineara, ne en n kvadrataj, sed en konstanta tempo, en la idealo.
>> Ni vidos vin merkredon.
>> Parolanto: Je la sekvanta CS50, Davido forgesas sian bazon kazo.
>> DAVID Malan: Kaj tio estas kiel vi sendos teksto mesaĝojn kun C. Kion la -
>> [DIVERSAJ TEKSTO MESAĜO Sciigo SOUNDS]