[Powered by Google Translate] [Oddelek 6] [Več Udobna]
[Rob Bowden] [Harvard University]
[To je CS50.] [CS50.TV]
>> Mi lahko odpravite do našega oddelka vprašanj.
Sem poslal URL za prostor poprej.
Začetek del vprašanj, pravijo,
Očitno nisem povsem unsick, je zelo enostavno vprašanje
za kaj se valgrind?
Kaj valgrind storiti?
Kdor bi rad povedal, kaj valgrind ne?
[Študent] Preveri spomin pušča.
Ja, valgrind je splošno spomin skladiščnik.
Prav na koncu, vam pove, če imate spomin razpoka,
kar je predvsem tisto, kar smo jo uporabi za, ker če hočeš
pa tudi v problemski sklop, ali če želite
priti na veliki ladji, morate imeti nobenih spomin razpoka sploh,
in v primeru, da imate pomnilnika, ki ga ni mogoče najti,
Prav tako ne pozabite, da vsakič, ko odprete datoteko
in če ga ne zaprejo, to je pomnilnika.
>> Veliko ljudi, ki iščejo nekaj vozlišče, da oni ne sprosti
če res, da ni zaprl slovar v prvi fazi.
Prav tako vam pove, ali imate veljaven bere ali piše,
kar pomeni, če ste poskušali določiti vrednost
To je po koncu kup in to ne zgodi, da SEG napake
ampak valgrind ga ujame, saj ne bi bilo treba dejansko obstaja pisni obliki,
in tako zagotovo ne bi imeli kaj od naštetega ne.
Kako uporabljati valgrind?
>> To je splošno vprašanje
vrsta prost in pogled na izhod.
Proizvodnja je zasenčil veliko časa.
Tam je tudi zanimivo napake, kjer, če imate nekaj hudo narobe stvar
dogaja v krogu, nato pa bo na koncu rekel: "To je zame veliko napak.
Jaz sem nehala šteti zdaj. "
To je v bistvu tekstovni izhod, da boste morali razčleniti.
Na koncu bo povedal vse spomin razpoka, ki jih imate,
koliko blokov, ki so lahko koristne, saj
če je en blok unfreed, potem je običajno lažje najti
kot 1.000 ulic unfreed.
1000 bloki unfreed verjetno pomeni, da ne boš sprostila
vaše povezani seznam ustrezno ali kaj.
To je valgrind.
>> Zdaj imamo del vprašanj,
ki vam ni treba prenesti.
Lahko kliknete na moje ime in jih potegnite navzgor v prostoru.
Sedaj kliknite na meni.
Revizija 1 bo sklad, ki smo 1. dela.
Revizija 2 bo čakalna vrsta in revizija 3 bodo posamič povezani seznam.
Speljevanje z našo dimnika.
Kot piše tukaj, sklad je eden od najbolj osnovne,
temeljne podatkovne strukture v računalništvu.
Zelo prototip primer
kup plošč v jedilnici.
To je v bistvu, ko ste se predstavili kup,
kdo bo rekel: "Oh, kot kup plošč."
Ti kup pladnje navzgor.
Potem ko greš za vleko pladenj
prvi pladenj, da je pridobivanje potegnil je zadnja, ki je bila dana na kupu.
Sveženj prav tako, kot da tukaj piše,
imamo segment pomnilnika se imenuje sklad.
In zakaj ga imenujejo dimnik?
>> Ker se kot kup strukture podatkov,
ga potisne in pops dimnih okvirjev na sklad,
če zložaja okvirji so kot poseben poziv funkcije.
In kot kup, boste vedno morali vrniti
od klic funkcije, preden lahko prideš v nižjih okvirjev dimnika znova.
Ne, ne moreš imajo glavno call foo bar in bar se vrnete v glavni neposredno.
Vedno moraš na pravi kup potiska in živahen.
Obe dejavnosti, kot sem rekel, je push in pop.
Tisti, ki so univerzalni pogoji.
Vedeti morate push in pop v smislu nizov ne glede na to, kaj.
Bomo videli, čakalne vrste so nekako drugačni.
To sploh nima univerzalnega izraza, ampak push in pop so univerzalni za skladih.
Push je pravkar dal na kup.
Pop je vzlet sklada.
In vidimo, tukaj imamo typedef struct stack,
tako da imamo char nizi **.
Ne bodi prestrašen z vsemi **.
To se bo končalo niz nizov
ali niz kazalcev na znake, kjer je to
kazalci na znake ponavadi strune.
Ni nujno, da so strune, ampak tukaj gredo za godala.
>> Imamo vrsto nizov.
Imamo velikosti, kar pomeni, koliko elementov je trenutno na sklad,
in potem imamo sposobnost, ki je, koliko elementov je lahko na kupu.
Kapaciteta naj bi začeli v nekaj več kot 1,
ampak velikost se dogaja, da začnete kot 0.
Zdaj pa so v bistvu tri različne načine si lahko zamislite dimnika.
No, verjetno obstaja več, vendar pa sta dva glavna načina
ga lahko izvaja z uporabo polja, ali pa jo izvaja z uporabo povezani seznam.
Povezani seznam je nekako nepomembno, da bi nizov iz.
To je zelo enostavno narediti kup uporabo povezani seznam,
tako da tukaj, bomo narediti kup z nizi,
in nato z uporabo polja, tam je tudi dva načina, kako lahko mislijo o tem.
Prej, ko sem rekel, da bomo imeli zmogljivosti za sklad,
tako da bomo lahko fit element na sklad.
>> Tisti, način, kako se lahko zgodi, je, kot ko ste zadeli 10 elementov, potem ste končali.
Morda veš, da je zgornja meja 10 stvari na svetu
Nikoli ne boste imeli več kot 10 stvari na kup,
v tem primeru lahko imajo zgornjo mejo na velikost vašega dimnika.
Ali pa imaš vaš dimnik mora brezmejna,
če pa delaš niz, kar pomeni, da vsak čas ste zadeli 10 elementov,
potem boste morali, da zraste do 20 elementov, in ko ste zadeli 20 elementov,
boste morali za rast vašega array 30 elementi ali 40 elementov.
Vi boste potrebovali za povečanje zmogljivosti, ki je tisto, kar bomo na tem mestu.
Vsakič smo dosegli največjo velikost našega dimnika,
ko smo potisnite nekaj drugega naprej, bomo morali povečati zmogljivosti.
Tukaj smo pritisk je deklariran kot bool pritiskom (char * str).
Char * str je niz, ki smo si prizadevajo na kupu,
bool in samo pravi, ali nam je uspelo ali ne.
>> Kako ne?
Kaj je edina okoliščina, ki jo lahko zamislite
, kjer bi se morali vrniti napačna?
Ja.
[Študent] Če je to polno in smo z uporabo omejujejo izvajanje.
Ja, kako opredeliti, je odgovoril:
če je poln in smo z uporabo omejene izvajanje.
Potem bomo zagotovo vrne false.
Takoj, ko bomo zadeli 10 stvari, v polju, ne moremo fit 11, zato se vrnemo false.
Kaj pa, če je brezmejna to? Ja.
Če ne morete razširiti paleto iz nekega razloga.
Ja, spomin je omejen vir,
in na koncu, če želimo ohraniti potiskajo stvari na kup, znova in znova,
bomo poskušali dodeliti večjo paleto, da se prilega
večja zmogljivost in malloc ali karkoli bomo s vrača false.
No, malloc vrne null.
>> Ne pozabite, vsak čas se kdaj poklicati malloc, morate biti preverjanje, da vidim, če je
vrne za nične, ali pa, da je pravilnost odbitka.
Ker želimo imeti neomejenem stack,
edini primer, da bomo vračali napačno je, če skušamo
povečanje zmogljivosti in malloc ali karkoli vrne false.
Potem pop prevzema nobene utemeljitve,
in vrne niz, ki je na vrhu dimnika.
Karkoli je bilo nazadnje potisnilo na stack je tisto, pop se vrača,
prav tako pa ga odstrani iz dimnika.
In opazil, da se vrne null, če ni nič na kupu.
Vedno je možno, da je sklad prazen.
V Java, če ste navajeni na to, ali drugih jezikov,
poskuša pop iz praznega dimnik lahko povzroči izjeme ali kaj podobnega.
>> Toda v C, null je nekako veliko primerov, kako ravnamo s temi težavami.
Vračanje nično je, kako bomo pomenilo, da je sklad prazen.
Pripravili smo kodo, ki bo preizkusil vaš dimnik funkcionalnost,
izvajanje push in pop.
To ne bo veliko kode.
Bom, pravzaprav, preden bomo to storili, namig, namig-
Če še niste videli, malloc ni edina funkcija
ki dodeljuje spomin na kup za vas.
Obstaja družina Pos funkcij.
Prvi je malloc, ki ste navajeni.
Potem je tu še calloc, ki počne isto stvar kot knjižnične funkcije malloc,
vendar bo nič, vse za vas.
Če ste si kdaj želeli nastaviti vse na null po nekaj mallocing
moral bi samo uporabljati calloc na prvem mestu, namesto pisanja
zanka za nič ven celoten blok pomnilnika.
>> Realloc je kot knjižnične funkcije malloc in ima veliko posebnih primerih,
ampak v bistvu tisto, kar počne, je realloc
je potrebno kazalec, ki je bila že dodeljena.
Realloc je funkcija želite biti pozoren tukaj.
Potrebno je kazalec, ki je že vrnil iz knjižnične funkcije malloc.
Recimo, da zahteva od knjižnične funkcije malloc kazalec na 10 bajtov.
Kasneje se zaveš, da je želel 20 bajtov,
tako praviš na to realloc kazalec s 20 bajtov,
in bo realloc samodejno kopiranje nad vsem, kar za vas.
Če ste pravkar poklical malloc spet, kot sem blok 10 bajtov.
Zdaj moram blok 20 bajtov,
Torej, če sem malloc 20 bajtov, potem pa sem moral ročno kopirati v 10 bajtov iz prve stvari
v drugo stvar in potem je prva stvar proste.
Realloc bo poskrbel za vas.
>> Obvestilo podpis se bo nična *
ki je pravkar vrnil kazalec na blok pomnilnika,
potem nična * ptr.
Si lahko zamislite * praznim kot generično kazalca.
Na splošno se nikoli ne ukvarjajo z * nična,
vendar malloc se vrača na void *, in potem je samo uporablja kot
to se dejansko dogaja, da je char *.
Prejšnji void *, ki se je vrnil z knjižnične funkcije malloc
Zdaj bo treba podati realloc, nato pa velikost
je novo število bajtov, ki jih želite razporediti, tako da bo nova zmogljivost.
Dal vam bom nekaj minut, in to v našem prostoru.
Začnite z revizije 1.
Jaz bom prenehati, ko upam, da o tem dovolj časa za izvajanje pritiska,
in potem ti dam še en odmor narediti pop.
Ampak to res ni veliko kode sploh.
Najbolj koda je verjetno širi stvari, ki se širi zmogljivosti.
Ok, ni pritiska, da je treba v celoti narejena,
ampak tako dolgo, kot se počutite, kot da ste na pravi poti, to je dobro.
>> Ima kdo kakšno kodo, se počutite udobno z mano vleče navzgor?
Ja, bom, ampak ali ima kdo kakšno kodo, da lahko potegnili gor?
Ok, lahko začnete, ga shranite, karkoli že je?
Vedno pozabim ta korak.
Ok, ki si ogleduje pritiskom,
hočeš, da pojasni svojo kodo?
[Študent] Najprej sem povečal velikost.
Mislim, mogoče bi moral imeti, da, kljub temu, sem povečal velikost,
in vidim, če je manjša od zmogljivosti.
In če je to manj kot zmogljivost, sem dodati polja, ki jih že imajo.
In če je ne bi, pomnožite zmogljivosti z 2,
in sem prerazporedi strune niz nekaj z večjo velikostjo zmogljivosti zdaj.
In če to ne uspe, bom povedal uporabnika in vrne false,
in če je to v redu, potem pa sem dal niz v novem mestu.
>> [Rob B.] Tudi obvestilo, da smo lepo bitni operaterja tukaj
pomnoži z 2.
Ne pozabite, levo premik se vedno dogaja, da se pomnoži z 2.
Pravica do premika deli z 2 dokler ga ne pozabite, da to pomeni,
delimo z 2 kot celo število deljeno z 2.
Morda je odsekana 1 tukaj in tam.
Toda premik levo po 1 se vedno dogaja, da se pomnožijo z 2,
razen če prekoračitev meje iz celega števila, nato pa je ne bo.
Komentar strani.
Všeč mi je storiti, se to ne bo spremenilo kodiranje kakršen koli način,
ampak mi je všeč, da narediš nekaj takega.
To dejansko se dogaja, da je nekoliko daljši.
Mogoče to ni popoln primer, da to dokažejo,
ampak mi je všeč, da je v teh odsekih bloke,
ok, če se to zgodi, če je, potem bom naredil nekaj,
, nato pa se izvede funkcija.
Ne rabim, da se pomaknite moje oči vse do konca funkcije
da vidimo, kaj se zgodi po drugem.
To je, če je to, če se zgodi, nato pa sem vrnil.
Ima tudi lepo dodatno korist vsega tega preko
Zdaj se nagne levo enkrat.
Jaz ne potrebujete več, če boste kdaj v bližini smešno dolge proge,
potem ti 4 bajte pomoč, pa tudi bolj levo je nekaj,
manj obremenjeni vi počutili, če želite, v redu, moram zapomniti
Jaz sem trenutno v while zanko notranji strani drugega notranjost za zanke.
Kjerkoli lahko to narediš vrnitev takoj, mi je nekako všeč.
To je povsem neobvezna in ni pričakovati, na kakršen koli način.
>> [Študent] Če obstaja velikosti - v okvari stanju?
Pred izpadom pogoj tu nismo realloc, tako da.
Opazuj, kako v okvari stanju, domnevno
če ne bomo free stuff kasneje, mi vedno dogaja, da ne
ne glede na to, kolikokrat smo poskušali pritisniti nekaj.
Če imamo potiskanje, smo ostali povečevanje velikosti,
čeprav mi ne postavljajte predmetov na kupu.
Ponavadi ne prirastek velikosti do
ko smo uspešno jo položite na kup.
Mi bi to naredil, recimo, bodisi tukaj in tukaj.
In potem namesto da bi rekel s.size ≤ zmogljivosti, to je manj kot zmogljivosti,
Samo zato, ker smo se preselili, če je bilo vse.
>> In ne pozabite, da je edini kraj, da bi se lahko vrne false
Tukaj je, kjer realloc vrne null,
in če se zgodi, da se spomnite standardna napaka,
Mogoče bi si, da je to primer, ko želite natisniti standardna napaka,
Tako ovrednotenj stderr in ne le tiskanje neposredno na standardni izhod.
Še enkrat, to ni pričakovati, če pa je napaka,
vnesite printf, potem boste morda želeli, da bi bilo tiskanje na standardne napake namesto standardne ven.
>> Kdor še kaj, da se seznani? Da.
[Študent] Lahko greš čez [neslišno]?
[Rob B.] Ja, dejansko binariness od tega, ali kaj je to?
[Študent] Torej si jo pomnožimo z 2?
[Rob B.] Ja, v bistvu.
V binarnem zemljišča, smo vedno imamo niz številk.
Premik to levo do 1. vstavi v bistvu je tukaj na desni strani.
Nazaj na to, samo spomniti, da je vse, kar je v binarni
je moč 2, tako da to predstavlja 2 do 0,
Ta 2 na 1, to 2 k 2.
Z vstavitvijo 0 do sedaj desni strani, samo premakniti vse več.
Kar je bilo 2 do 0 je sedaj 2 na 1, 2 je za 2.
Na desni strani, da se vstavi
je nujno, da bo 0,
ki ima smisel.
Če ste kdaj pomnožimo s številko 2, pa se ne bo končala čudno,
Tako naj bi 2 do kraja 0 0,
in to je tisto, napol sem opozoril, preden je, če se vam zgodi premik
po številu bitov v celo število
potem je to 1 se bo na koncu tekoč off.
To je edina skrb, če se zgodi, da se ukvarjajo z zelo velikimi zmogljivostmi.
Toda na tej točki, potem imate opravka s celo vrsto milijard stvari,
ki morda ne spadajo v spomin vseeno.
>> Sedaj lahko pridemo do popa, ki je še lažje.
Lahko bi se bilo všeč, če se zgodi, da pop cel kup,
in zdaj si na polovici zmogljivosti znova.
Lahko realloc za krčenje količino pomnilnika imate,
vendar vam ni treba skrbeti, da je to edini primer realloc se bo
raste spomin, ne zmanjšuje spomin,
ki se dogaja, da pop super enostavno.
Zdaj dolge čakalne vrste, ki se bo kot nizov,
vendar je spremenil vrstni red, ki ga sprejme stvari.
Prototip primer vrsti je linija,
tako da mislim, če ste bili angleški, bi rekel,
prototip primer vrsti je čakalna vrsta.
Tako kot črte, če si prvi, ki je v skladu,
pričakujete, da bo prva oseba iz linije.
Če ste zadnja oseba, ki je v skladu, ki ga bo zadnja oseba na popravilo.
Pravimo, da je FIFO vzorec, medtem ko je sklad LIFO vzorec.
Te besede so zelo univerzalna.
>> Kot skladih in v nasprotju z nizi, čakalne vrste navadno ne dovolijo dostopa do elementov na sredini.
Tu sklad, imamo push in pop.
Tu se zgodi, da so zahtevali jim enqueue in dequeue.
Prav tako sem slišal jih imenujemo spremembe in unshift.
Slišal sem, da ljudje pravijo, push in pop veljajo tudi za čas čakanja.
Slišal sem vstavite, odstranite,
Tako potiskanje in pop, če govorimo o skladih, ki ga potiskajo in živahen.
Če govoriš o vrsti, lahko izberete tudi besede, ki jih želite uporabljati
za vstavljanje in odstranjevanje, pa ni soglasja o tem, kaj je treba imenujejo.
Ampak tukaj imamo enqueue in dequeue.
Zdaj, struct izgleda skoraj identično dimnika struct.
Vendar moramo slediti glavo.
Mislim, da je pravi dol, ampak zakaj moramo glavo?
Prototipov, so v bistvu enaki za potiskanje in pop.
Lahko pomislite, da Pritisni in popa.
Edina razlika je, pop vrača, namesto zadnje, to je vrnil prvi.
2, 1, 3, 4, ali kaj podobnega.
In tu je začetek.
Naša vrsta je povsem poln, tako da je štiri elemente v njej.
Konec naši vrsti je trenutno 2,
in zdaj gremo vstaviti nekaj drugega.
>> Ko želimo dodati, da je nekaj drugega, kar smo naredili za dimnik različici
je smo razširili našo blok pomnilnika.
Kaj je narobe s tem?
[Študent] premaknete 2.
Kaj sem rekel prej o koncu čakalne vrste,
To nima nobenega smisla, da začnemo na 1,
potem želimo dequeue 1, potem dequeue 3, nato dequeue 4,
potem dequeue 2, potem dequeue to.
Ne moremo uporabiti realloc zdaj,
ali vsaj, boste morali uporabiti realloc na drugačen način.
Ampak ti verjetno ne bi smeli uporabljati le realloc.
Boste morali ročno kopirate spomin.
>> Obstajata dve funkciji za kopiranje pomnilnika.
Tukaj je memcopy in memmove.
Jaz sem trenutno berete strani man da vidite, katera boste želeli uporabiti.
Ok, memcopy je razlika
da memcopy in memmove, ena obravnava zadevo pravilno
če ste kopirate v regiji, ki se zgodi, da se prekrivajo regijo
ste kopiranju.
Memcopy ni zmogel. Memmove ne.
Si lahko težave, kot-
recimo, da želim, da bi kopirali tega tipa,
te štiri s tem tipom več.
Na koncu, kaj bi moral niz izgledal
ko je kopija 2, 1, 2, 1, 3, 4, in še nekaj stvari na koncu.
Ampak to je odvisno od reda, v katerem smo dejansko kopiranje,
ker če ne upoštevamo dejstvo, da je regija smo kopiranje v
prekriva 1 smo kopiranju,
potem lahko delamo kot začetek tukaj, kopiranje 2 na mesta, ki ga želite iti,
premaknite naših nasvetov naprej.
>> Zdaj bomo tukaj in tukaj in zdaj želimo kopirati
ta tip v tem tipom in da naše napotke naprej.
Kaj bomo na koncu dobili za 2, 1, 2, 1, 2, 1
namesto ustreznih 2, 1, 2, 1, 3, 4, saj
2, 1 razveljavljena izvirno 3, 4.
Memmove ročaji, da pravilno.
V tem primeru je v bistvu samo vedno uporabite memmove
ker jo obravnava pravilno.
Na splošno ne opravljajo nobene hujše.
Ideja je, namesto da začnejo od začetka in kopiranje na ta način
kot smo pravkar naredil tukaj, se začne ob koncu leta in kopira,
in v tem primeru nikoli ne moreš imeti težav.
Tukaj ni zmogljivost izgubljena.
Vedno uporabljajte memmove. Nikoli ne skrbi memcopy.
In to je, če boste morali ločeno memmove
Zavit-okrog delež v čakalno vrsto.
Brez skrbi, če ne v celoti narejena.
To je težje, kot dimnik, potiskanje in pop.
>> Vsakdo ima kakršne koli kode, da bi lahko delo z?
Tudi če popolnoma nepopolni?
[Študent] Ja, to je popolnoma nepopolna, čeprav.
Popolnoma nepopolna je v redu, dokler smo, lahko shranite na pregled?
Pozabil sem, da je vsak čas.
Ok, ne upošteva kaj se zgodi, ko bomo morali spremeniti velikost stvari.
Popolnoma ignorirati velikost.
Razloži to kodo.
Jaz sem preverjanje najprej, če je manjše od izvoda najprej
in nato po tem, sem vstavil, vzamem glavo + velikost,
in sem se prepričajte, da ovije okoli zmogljivosti matrike,
in sem vstavil nov niz na tem položaju.
Potem sem se poveča velikost in return true.
>> [Rob B.] To je zagotovo ena izmed tistih primerih, ko jih boste želeli, da se z uporabo mod.
Kakršna koli primeru, ko ste okoli zavijanje, če misliš, da okoli zavijanje,
takojšnja misel bi morala biti mod.
Kot hitro optimizacijo / bo vaš kodo eno vrstico krajši,
opazite, da je linija, takoj po tem 1
je samo velikost + +, tako da združitev, da v tej vrstici, velikost + +.
Zdaj tukaj imamo primer
če nimamo dovolj pomnilnika,
Tako smo povečali našo sposobnost za 2.
Mislim, da bi lahko imeli enako težavo, vendar pa lahko prezreti zdaj,
če, če ni uspelo povečati svojo zmogljivost,
potem boste želeli, da zmanjša vašo sposobnost za 2 znova.
Še ena kratka opomba je prav tako kot lahko to storite + =,
Prav tako lahko naredite << =.
Skoraj vse, kar lahko gre, preden je enak, + =, | =, & =, = <<.
Char * Nova je naš novi blok pomnilnika.
Oh, tukaj.
>> Kaj ljudje mislijo o vrsti našega novega bloka spomin?
[Študent] Treba je biti char **.
Razmišljate nazaj na našo struct tukaj,
strune je tisto, kar prerazporeditev.
Trudimo se, da celotno novo dinamično shranjevanje elementov v vrsti.
Kaj bomo dodelil svojim nizov je tisto, kar smo mallocing zdaj,
in tako nova, se bo char **.
To se dogaja, da je nabor nizov.
Kaj pa je tako, pod katerimi se bomo vrnili napačen?
[Študent] Če smo se delaš char *?
[Rob B.] Ja, dobro klic.
[Študent] Kaj je bilo to?
[Rob B.] Želeli smo narediti velikosti char *, ker nismo več-
To bi dejansko zelo velik problem, saj bi sizeof (char) je 1.
Char * sizeof se bo 4,
tako veliko krat, ko ste se ukvarjajo z ints,
ste nagnjeni k oditi z njim, ker je velikost notr in velikosti int *
na 32-bitnem sistemu se bo ista stvar.
Ampak tukaj, sizeof (char) in sizeof (char *), so se zdaj dogaja, da je ista stvar.
>> Kaj je okoliščina, ko se vrnemo false?
[Študent] Nov je nična.
Ja, če novi ničelna, vrnemo false,
in bom vrgel dol-
[Študent] [neslišno]
[Rob B.] Ja, to je v redu.
Če ne bi naredila 2-krat zmogljivost ali zmogljivosti shift 1 in šele potem jo nastavite tukaj ali karkoli.
Mi bomo to, kot smo ga imeli.
Kapaciteta >> = 1.
In ti nikoli ne bo treba skrbeti, da bi izgubili 1 je potekala
ker si pustil premakne za 1, tako da je mesto 1 je nujno 0,
Pravica do premika z 1, še vedno bo v redu.
[Študent] Ali morate storiti, da bo pred vrnitvijo?
[Rob B.] Ja, to pomeni nikakršnega smisla.
>> Vzemimo, da bomo na koncu vrne res do konca.
Tako bomo narediti te memmoves,
moramo biti previdni pri tem, kako jih narediti.
Ali ima kdo kakšne predloge za to, kako jih bomo naredili?
Tukaj je naš začetek.
Neizogibno je, da bomo začeli na začetku znova
in kopijo stvari od tam, 1, 3, 4, 2.
Kako si to naredil?
Najprej moram gledati na človeka stran za memmove znova.
Memmove, da argumentov je vedno pomembna.
Želimo, da naš cilj prvi, 2. vir, velikost tretji.
Obstaja veliko funkcij, ki obrne vira in cilja.
Destinacija, vir kaže, da je v skladu umirila.
Umaknite se, kaj se je vrnil?
Vrne kazalec na namembni kraj, iz katerega koli razloga boste morda želeli.
Znam prebrati sliko, vendar želimo, da se premaknete v naši okolici.
>> Kaj je naš cilj, da bo?
[Študent] Nova.
[Rob B.] Ja, in kje smo kopirate?
Prva stvar, ki mi je to kopiranje 1, 3, 4.
Kaj je to-1, 3, 4.
Kakšen je naslov tega 1?
[Študent] [neslišno]
[Rob B.] + Neposredne naslov prvega elementa.
Kako bomo prišli prvi element v matriki?
[Študent] čakalne vrste.
[Rob B.] Ja, q.strings.
Ne pozabite, tu je naša glava je 1.
To presneto. Mislim, da je to čudežno-
Tu je naša glava je 1. Jaz bom spremeniti svoje barve preveč.
In tukaj je strune.
To je lahko bodisi napisati kot smo tukaj
z glavami + q.strings.
Veliko ljudi tudi napiši & q.strings [head].
To ni res nič manj učinkovita.
Morda si mislite o njem, kot ste ga Dereferenciranje in nato dobili naslov,
vendar se bo prevajalnik prevesti, kar smo jih imeli pred nekako, q.strings + glava.
Kakorkoli želite razmišljati o tem.
>> In koliko bajtov želimo kopirati?
[Študent] Moč - glava.
Kapaciteta - glava.
In potem si lahko vedno napišete primer
da ugotovimo, če je to v redu.
[Študent], je treba deliti z 2, potem.
Ja, mislim, da smo lahko uporabite velikost.
Še vedno imamo velikosti pa-
z uporabo velikosti, imamo velikost enako 4.
Naša velikost je 4. Naš vodja je 1.
Želimo kopiranje teh 3 elementov.
To je duševno zdravje, da se preveri velikost - glava je pravilno 3.
In prišel sem, tako kot smo že omenili,
če bi uporabili sposobnosti, potem bi morali deliti z 2
ker smo že prerasla svoje sposobnosti, tako da namesto, da bomo uporabo velikosti.
, Ki kopira ta del.
Zdaj moramo kopirati drugi del, tisti del, ki je ostalo od vsega začetka.
>> To bo memmove v kakšnem položaju?
[Študent] plus size - glava.
Ja, tako smo že kopirali v velikosti - glavo bajte
in tako, če želimo kopirati preostale bajte je novega
nato pa velikost minus pa se je število bajtov smo že kopirali noter
In potem ko smo kopirate?
[Študent] Q.strings [0].
[Rob B.] Ja, q.strings.
Mi ne bi naredila in q.strings [0].
To je precej manj pogosti kot to.
Če je le, da bo 0, potem boste pogosto videli q.strings.
To je, če smo kopiranju.
Koliko zlogov pa smo prepuščeni slišiš? >> [Študent] 10.
Prav.
[Študent] Ali moramo množiti 5-10 krat v velikosti od bajte ali kaj podobnega?
Ja, tako je to, če-kaj točno se kopiranje?
[Študent] [neslišno]
Kakšna je vrsta stvari smo kopiranje?
[Študent] [neslišno]
Ja, char * i, da smo kopiranje, ne vemo, če ti prihajajo iz.
No, če oni kažejo na, kot so strune, smo na koncu jo potisnil na čakalni vrsti
ali enqueuing na vrsti.
Če tisti, prihajajo iz, ne vemo.
Vedeti pa je treba slediti char * s samimi.
Ne želimo, da bi kopirali velikosti - glava bajti.
Želimo, da bi kopirali velikosti - glava char * s,
tako da bomo to pomnožimo z sizeof (char *).
Enako tukaj, vodja * sizeof (char *).
>> [Študent] Kaj pa [neslišno]?
To tukaj?
[Študent] No, spodaj, da je velikost - glava.
[Rob B.] Ta tukaj?
Kazalec aritmetično.
Kako kazalec aritmetična bo to delovalo, je
samodejno pomnoži z velikostjo tipa, da imamo opravka.
Tako kot tukaj, novo + (velikost - glava)
je popolnoma enaka in nove [velikost glave -]
do pričakujemo, da bo delovala pravilno,
saj če imamo opravka z int array, nato pa ne bomo indeks z int-
ali če je od velikosti 5 in želite, 4. element, potem indeks Into the
int array [4].
Vi ne-[4] * velikost notr.
To je samodejno ročaji in tem primeru
je dobesedno enako, tako da nosilec sintaksa
se le, da bo treba pretvoriti v to, takoj ko zbiranje.
To je nekaj, kar morate biti pozorni, da
ko dodajate velikost - glava
dodajate ne en bajt.
Dodajate 1 char *, ki je lahko eno bajtov ali karkoli.
>> Druga vprašanja?
Ok, dequeue se bo lažje.
Dal ti bom malo za izvedbo.
Oh, in mislim, da je to ista situacija, v kateri
kaj enqueue primeru, če bomo enqueuing nično,
Morda želimo ravnati, morda ne bomo.
Tega ne bomo še enkrat tukaj, ampak enako kot naš dimnik primeru.
Če bomo enqueue nično, bi radi, da ga ne upoštevajo.
Vsakdo ima nekaj kode, da lahko potegnili gor?
[Študent] Imam samo dequeue.
Različica 2 je, da se, v redu.
Hočeš, da pojasni?
[Študent] Najprej se prepričajte, da je nekaj v čakalni vrsti
in da se velikost se bo po 1.
Kar morate storiti, da se potem vrnete glavo
in premaknite glavo 1.
Ok, tako da je kotna primeru moramo upoštevati. Ja.
[Študent] Če je vaša glava na zadnji element,
potem ne želite glave s točko zunaj polja.
>> Ja, to čimprej glavo zadela konec našega niza,
ko smo dequeue bi naša glava modded nazaj na 0.
Na žalost ne moremo storiti v enem koraku.
Mislim, da je tako, kot sem verjetno določi, da je
To se bo char *, kar smo se vračajo,
ne glede na vaše ime spremenljivke želi biti.
Potem želimo mod glavo po naših sposobnosti
in se nato vrne ret.
Veliko ljudi tukaj, ki bi jo lahko naredil,
To je primer-boš videl, če ljudje glavo
večja od zmogljivosti, ne z glavo - zmogljivosti.
In to je samo tisto, kar delajo okoli mod je.
Vodja mod = zmogljivost veliko čistejši
za zavijanje okoli glave, kot če bi nad glavo zmogljivosti - zmogljivosti.
>> Vprašanja?
Ok, zadnja stvar, ki smo jo zapustili naš povezani seznam.
Vi se lahko uporabijo za nekatere povezano vedenje seznama, če si
povezane sezname v svoje hash tabele, če si razpršene tabele.
Toplo priporočam početje razpršene tabele.
Morda ste že opravili Trie,
vendar poskusih težje.
V teoriji, oni asimptotično bolje.
Ampak samo poglej na veliko tablo,
in poskuša nikoli bolje, in zasedejo več pomnilnika.
Vse o poskuša konča pa slabši za več dela.
To je tisto, kar je rešitev, David Malan je vedno
Je vedno prispevkov njegovo Trie rešitev, in poglejmo, kjer trenutno je.
Kaj je bil po David J?
Je # 18, tako da ni strašno slabo,
in to se dogaja, da je eden izmed najboljših poskuša si lahko zamislite
ali eden izmed najboljših poskuša iz Trie.
Je to sploh ni njegova prvotna rešitev?
Počutim se, kot Trie rešitve ponavadi bolj v tem območju uporabe RAM.
>> Pojdi do samega vrha in RAM je v posameznih številk.
Pojdi nazaj na dnu, nato pa že lahko videli poskuša
kje si dobil absolutno ogromno RAM navada,
in poskuša težje.
Ni povsem vredno, vendar izobraževalno izkušnjo, če si eno.
Zadnja stvar, ki je naš povezani seznam,
in te tri stvari, dimniki, kolon in povezani seznami,
prihodnja stvar, ki jo kdaj naredil na področju računalništva
Predvidevam, da ste se seznanijo s temi stvarmi.
So le tako temeljnega pomena za vse.
>> Povezane sezname, in tu smo posamično povezani seznam se bo naša izvedba.
Kaj posamič povezani pomeni v nasprotju z dvojno povezani? Da.
[Študent] To samo kaže na naslednji kazalec namesto na kazalcev,
kot tisti pred njega in 1 po njem.
Ja, tako v obliki slike, kaj sem naredil?
Imam dve stvari. Imam sliko in sliko.
V obliki slike, naši posamično povezani seznam,
neizogibno, imamo nekakšen kazalec na čelu našega seznama
in nato v našem seznamu, imamo samo namig,
in morda to kaže na null.
To bo vaša tipična risba progo povezan seznam.
Dvojno povezani seznam, lahko greš nazaj.
Če dam vse vozlišča na seznamu, potem lahko nujno priti do
katero koli drugo vozlišče v seznam, če je dvojno povezani seznam.
Ampak, če boste dobili tretjo vozlišča v seznamu in je posamezno povezani seznam,
Zagotovo ne boste nikoli prišli do prvega in drugega vozlišča.
In tam koristi in škodo za in en očiten 1
je lahko zasedejo več velikosti in boste morali slediti, kje se te stvari so zdaj kaže.
Ampak samo skrbi posamezno povezana.
>> Nekaj ​​stvari, ki jih boš moral izvajati.
Vaš typedef struct vozlišče, int i: struct vozlišče * naslednji; vozlišče.
To typedef se sežge v vaših glavah.
Quiz 1 se rad dal typedef za povezano vozlišče seznama,
in bi morali imeti možnost, da takoj Škrabotine, ki določa
ne da bi sploh razmišljal o tem.
Mislim, da nekaj vprašanj, zakaj moramo dograditi tukaj?
Zakaj ne moremo reči, vozlišče *?
[Študent] [neslišno]
Ja.
Edina stvar, ki opredeljuje vozlišče kot stvar
je typedef sama.
Toda od te točke, ko smo nekako razčlenjevanjem po tej definiciji struct vozlišča,
nismo končali naš typedef še posebej zato, ker je typedef ni končal,
Vozel ne obstaja.
Ampak struct vozlišče počne, in to vozlišče tukaj,
To bi se lahko imenuje tudi kaj drugega.
To bi lahko imenovali n.
To bi lahko imenovali povezani seznam vozlišče.
To bi lahko imenovali ničesar.
Ampak to struct vozlišče je treba uporabiti isto, kot to struct vozlišče.
Kaj praviš temu je tudi tukaj,
ter da upošteva tudi drugo točko tega vprašanja
zato, veliko krat, ko vidiš konstrukti in typedefs za konstrukti,
boste videli anonimnih konstrukti, kjer boste videli typedef struct,
Izvajanje struct, slovar, ali karkoli.
>> Zakaj tu moramo povedati vozlišče?
Zakaj ne more biti anonimno struct?
To je skoraj enak odgovor.
[Študent] Moraš se nanašajo nanj v struct.
Ja, v struct, morate sklicevati na struct sama.
Če ne bi struct ime, če je anonimna struct, se ne more sklicevati na to.
In nenazadnje, to bi morali biti nekoliko enostavnejši,
in naj vam pomagajo uresničiti, če ste zapisuješ
da delaš nekaj narobe, če te vrste stvari niso smiselne.
In nenazadnje, zakaj se je to moralo biti struct vozlišče *?
Zakaj ne more biti samo struct vozlišče naslednji?
[Študent] Kazalec na naslednji struct.
To je neizogibno, kaj želimo.
Zakaj je ne bi bilo mogoče struct node naslednji?
Zakaj je moral biti struct vozlišče * naslednji? Ja.
[Študent] To je kot neskončno zanko.
Ja.
[Študent] bo vse v enem.
Ja, samo pomislite, kako bi naredili velikosti ali kaj podobnega.
Velikost struct je v bistvu + ali - nekateri vzorec tu ali tam.
To je v bistvu dogaja, da je vsota velikosti stvari v struct.
To tukaj, ne da bi spremenili ničesar, velikost bo enostavno.
Velikost vozlišča struct se bo velikost i velikosti + za naslednjo.
Velikost i se bo 4. Velikost prihodnje se bo 4.
Velikost vozlišča struct se bo 8.
Če ne bomo imeli *, misli dolžina tipa,
potem sizeof (i) se bo 4.
Velikost vozlišča struct Naslednji se bo velikost i + velikost vozlišča struct dostavo
+ Velikost + i velikosti vozlišča struct dostavo.
To bi bilo neskončno rekurzija vozlišč.
To je razlog, zakaj je to, kako se stvari morajo biti.
>> Še enkrat, zagotovo zapomnili, da
ali vsaj razumem dovolj, da bi mogli
Razlog skozi tisto, kar naj bi izgledal.
Stvari, ki jih boste želeli izvesti.
Če dolžina seznama,
da bi lahko goljufija in pri sebi
svetovni dolžine ali kaj podobnega, ampak ne boš naredil.
Mi bomo za štetje dolžine seznama.
Imamo vsebuje, tako da je v bistvu kot iskanje,
tako da imamo povezan seznam celih da vidim, če je to celo v povezanem seznamu.
Prepend gre za vnos na začetku seznama.
Pripni se dogaja, da vstavite konec.
Insert_sorted bo vstavite v razvrščeni mesto na seznamu.
Insert_sorted nekako predpostavlja, da nikoli ne uporablja pripnite ali dodate v slabih načinov.
>> Insert_sorted ko ste izvajanju insert_sorted-
recimo, da imamo povezani seznam.
To je tisto, kar trenutno izgleda, 2, 4, 5.
Želim vstaviti 3, tako dolgo, kot je ta seznam že sama urejen,
to je enostavno najti, kje 3 spada.
Začnem v 2.
Ok, 3 je večje od 2, zato želim, da se dogaja.
Oh, 4 je prevelika, zato vem, 3 je šel v med 2 in 4,
in moram popraviti napotke in vse te stvari.
Ampak, če ne bi nujno uporabiti insert_sorted,
kot recimo, da sem pripnite 6,
potem moj povezani seznam bo postal to.
Zdaj nima smisla, tako da za insert_sorted, lahko samo prevzeti
da je seznam urejen, čeprav obstajajo postopki
ki lahko povzroči, da se ne sortirajo in to je to.
Poiščite pomoč insert-tako tiste, ki so glavne stvari, ki jih boste morali izvajati.
>> Za zdaj, vzemite minuto za to dolžino in vsebuje
in bi tisti relativno hitro.
Približuje zapiranje časa, tako da ima kdo kaj za dolžino ali vsebuje?
Oni bodo skoraj identični.
[Študent] Dolžina.
Poglejmo, revizijo.
Ok.
Hočeš, da pojasni?
[Študent] sem ustvariti kazalec vozlišče in ga zažene na prvi, ki je naša globalna spremenljivka,
in potem sem preveriti, da vidim, če je nična, da mi ne bi dobili SEG napako in vrne 0, če je to res.
Sicer pa mislim, zanka preko sledenja celo v
kolikokrat sem pogledali naslednji element seznama
in v isti operaciji prirastek tudi do tega dejansko element,
in potem sem nenehno narediti pregled, da preveri, če je nična,
in če je nična, potem pa prekine in samo vrne število elementov sem dostopa.
>> [Rob B.] Ima kdo kakršne koli pripombe na karkoli?
To izgleda v redu pravilnost pametno.
[Študent] Ne verjamem, da boste morali vozlišče == null.
Ja, če je vozlišče == null return 0.
Ampak, če vozlišče == null, potem je to, oh, je pravilnost vprašanje.
To je bila samo ti i vrača, vendar to ni v obsegu sedaj.
Potrebuješ samo int i, tako da i = 0.
Ampak, če vozlišče nič, potem pa sem se še vedno dogaja, da je 0,
in bomo vrnili 0, tako da je ta zadeva enaka.
Še ena skupna stvar je, da bo izjavo
za notranje vozlišče za zanko.
Lahko bi rekli, oh, ne.
Naj ostane kot je ta.
Jaz bi verjetno dal int i = 0 tukaj
potem vozlišče vozlišče * = prva tukaj.
In to je verjetno, kako-kako se znebiti tega zdaj.
To je verjetno, kako bi jaz napisal.
Lahko tudi gledaš na to, kot je ta.
To za konstrukcijo zanke tukaj
bi morali biti skoraj tako naravno, da vas kot za int i = 0
i je manj kot dolžino niza, i + +.
Če je to, kako izbirate preko matrike, to je, kako si izbirate prek povezanega seznama.
>> To bi moralo biti nekaj običajnega na neki točki.
S tem v mislih, bo to skoraj isto stvar.
Vi boste želeli ponoviti čez povezan seznam.
Če je vozlišče, nimam pojma, kaj se imenuje vrednost.
I vozlišča.
Če je vrednost v tem vozlišču = i return true, in to je to.
Obvestilo, da je edini način, da smo se kdaj vrne false
Ponovil je, če smo v celotnem povezan seznam in se nikoli več vrnili res,
tako da je tisto, kar to počne.
Kot opomba, verjetno ne bomo dobili dodati ali pripnite.
>> Hitro zadnje note.
Če vidite statični ključno besedo, tako recimo statični int count = 0,
potem ne štejejo + +, lahko v bistvu mislim, da je globalna spremenljivka,
čeprav sem rekel, da to ni, kako bomo pri izvajanju dolžino.
To delam tukaj in nato prešteti + +.
Vsak način, da lahko vstopijo v našo vozlišče povezano seznama smo povečevanje našega štetja.
Bistvo je to, kar statična ključna beseda pomeni.
Če sem imel int count = 0, da bi redno stara globalna spremenljivka.
Kaj statični int Število pomeni, da je globalna spremenljivka za to datoteko.
Nemogoče je, da za nekatere druge datoteke,
rad pomislim pset 5, če ste začeli.
Imate tako speller.c in imate dictionary.c,
in če si razglasi stvar globalno, potem pa ničesar speller.c
mogoče dostopati v dictionary.c in obratno.
Globalne spremenljivke so dostopne vse datoteke. C,
vendar statične spremenljivke so dostopne le znotraj same datoteke,
tako znotraj črkovalnik, UV dictionary.c,
To je nekako, kako bi izjavljam svoj spremenljivka za velikost mojega niza
ali velikost mojega števila besed v slovarju.
Ker ne želim, da razglasi, da je globalno spremenljivko, da vsakdo, ki ima dostop do,
Res samo briga za moje namene.
>> Dobra stvar je tudi to ime cele trčenje stvari.
Če nekatere druge datoteke poskuša uporabiti globalno spremenljivko, imenovano count, gredo stvari zelo, zelo narobe,
tako da je to lepo ohranja stvari varno, in samo lahko dostopate do njega,
in ne more nihče drug, in če nekdo izjavi globalno spremenljivko, imenovano count,
potem to ne bo vplivalo na statično spremenljivko, imenovano count.
To je tisto, kar je statična. To je datoteka globalna spremenljivka.
>> Vprašanja o tem?
Vse je pripravljeno. Adijo.
[CS50.TV]