>> [Mūzikas atskaņošanai]
DAVID J. Malan: Nu labi.
Tas ir CS50, un šis ir beigas Nedēļas Four.
Un viens no tematiem šodien ir tas, ka ciparu kriminālistikas,
māksla atgūt informāciju.
Un tiešām, pat ja tu esi vidū
šobrīd Miera pie Triju un Breakout, nākamnedēļ,
uzmanība tiks pievērsta tieši šis domēns.
>> Tātad viena no stilīgākais darbavietu es kādreiz bija bija atpakaļ absolvents skolā,
kad es strādāju par vietējo Middlesex County District Attorney s
biroja, dara kriminālistikas strādāt.
Tātad būtībā, Massachusetts Valsts policija, reizēm,
strādājot gadījumos būtu ienest lietām, piemēram, cieto disku
un disketes un atmiņas kartes un tamlīdzīgi.
Un viņi varētu nodot tās man un manam mentors,
un mūsu mērķis bija atrast pierādījumus, ja ir kāds, par šiem medijiem.
Tagad, iespējams, esat redzējuši ieskatu Šīs pasaules kriminālistikas
medijos, TV un filmām.
Bet darbs man bija, un daresay ka pasaule,
nav gluži kā jūs varētu redzēt to.
Pieņemsim to apskatīt to, kas Jūs droši vien esat redzējuši.
[Video atskaņošana]
-OK.
Tagad, pieņemsim iegūt labu apskatīt jums.
>> [Mūzikas atskaņošanai]
>> -Turiet To.
Palaist šo atpakaļ.
>> -Wait Minūti.
Iet labi.
-Nav.
Freeze, ka.
-Pilna Ekrāns.
>> -OK.
Freeze, ka.
Padarīta stingrāka līdzi, ka, jūs?
>> -Vector Kas par ka puisis no pakaļējā riteņa.
>> -Zoom In tepat šajā vietā.
>> -ar Pareizo aprīkojumu, attēlu var tikt paplašināta un palielinājusi.
>> -Ko Tas tāds?
>> -Tas Ir veicināšanas programma.
>> -Vai Jums skaidrs, ka pat tādi ir?
>> -Es Nezinu.
Pieņemsim uzlabot to.
>> -Enhance A6 sadaļa.
Es uzlabota detalizēti, and--
-Es Domāju, tur ir pietiekami daudz, lai uzlabotu.
Atlaidiet to uz mana ekrāna.
>> -Es Uzlabota atspoguļojumu viņas acīs.
-Ļaujiet Ir palaist to caur video uzlabošanu.
>> -Edgar, Jūs varat uzlabot šo?
>> -Hang On.
>> -I've Ir strādājuši pie šī pārdomām.
>> -Nav S kāds ir atspulgs.
>> -Reflection.
-Nav Ir atspulgs no cilvēka sejas.
>> -The Pārdomas!
-Nav Ir atspulgs.
-Zoom Kas par spoguli.
Jūs varat redzēt pārdomas.
>> -Var Jums uzlabot attēlu no šejienes?
-Var Jums uzlabot to?
-Var Mēs veicinām šo?
-Var Jums uzlabot to?
-Turiet Uz sekundi.
Es uzlabot.
-Zoom Jo uz durvīm.
-Times 10.
-Zoom.
-Move In.
-Vairāk.
-Wait, Apstāties.
-Stop.
-Pause To.
-Rotate Mums 75 grādus ap vertikāli, lūdzu.
>> -Stop.
Iet atpakaļ uz daļu par durvīm vēlreiz.
>> -Got Attēla pastiprinātāju, kas var Bitmap?
>> -Maybe Mēs varam izmantot pradeep Singh metode, lai redzētu, uz logiem.
>> -The Programmatūra ir jaunākie sasniegumi.
>> -The Īpašvērtību ir izslēgts.
>> -ar Labi kombinācija algorithms--
>> -Viņš Ir veikti apgaismojums algoritmi uz nākamo līmeni,
un es varu izmantot tos, lai uzlabot šo fotogrāfiju.
>> -Lock Par un palielinātu z ass.
>> -Enhance.
Uzlabot.
-Enhance.
-Freeze Un uzlabot.
[END VIDEO PLAYBACK]
DAVID J. Malan: Tātad tie ir visi vārdi, bet tie nebija
izmanto teikumus pareizi.
Un tiešām nākotnē, jebkurā laikā, lūdzu, jūs dzirdat kādu sakām vārdu,
"Uzlabot", nosmieties tikai mazliet.
Jo, kad jūs mēģināt uzlabot, Piemēram, tas ir tas, kas notiek.
>> Tātad, šeit ir krāšņs foto.
Tas ir CS50 paša Daven.
Un pieņemsim, ka mēs vēlējāmies koncentrēsies uz zibsnīšana viņa acīs,
vai atspoguļojums slikts puisis, kas bija nepārprotami
piesavināties drošības kameru.
Tas ir tas, kas notiek, kad jūs tuvinātu attēlu, kas
ir tikai ierobežots skaits bitu, kas saistītas ar to.
>> Tas ir tas, ko jūs varētu saņemt.
Un tiešām, jo ​​Daven acīm ir tikai četri, varbūt seši pikseļi
ka rakstīt tieši to, ko Tika glimmering tur.
Tātad Problem Set Four galu galā būs jūs izpētīt šo pasauli, jo īpaši
raksturs, kaut mēs saucam failu i / o, kur
i / o ir tikai iedomātā veids sakot, ieejas un izejas.
>> Tātad līdz šim, visi mijiedarbības mēs esam bija ar datoru
ir lielā mērā ar savu klaviatūra un ekrāns,
bet ne tik daudz ar cietā diska, vai saglabājot failu ārpus tiem, jūs
sevi rakstīt.
Jūsu programmas līdz šim ir nav radīt, un ietaupot,
un atjaunināt savus failus.
>> Nu, kas ir fails?
Nu, kaut kā JPEG.
Šis ir attēlu jūs varētu ir vai augšupielādēt Facebook,
vai redzēt jebkur tīmeklī.
Patiešām, ka foto mēs tikko zāģis no Daven bija JPEG.
Un, kas ir interesanti par failiem, piemēram, JPEG
ir tā, ka tos var identificēt, parasti, dažas modeļus bitiem.
>> Citiem vārdiem sakot, to, kas ir tas, ka atšķir JPEG no GIF
no Ping no Word dokuments Excel failu?
Nu, tas ir tikai atšķirīgs modeļi bitiem.
Un šie dažādie modeļi ir Parasti sākumā šiem failiem.
>> Lai tad, kad jūsu dators atver Word doc, vai arī tad, kad dators atver JPEG,
tas izskatās parasti pie Pirmie vairāki biti failā.
Un, ja tā atzīst, modelis, tā saka, ak, tas ir attēlu.
Ļaujiet man parādīt to lietotājs kā grafiks.
Vai arī, ak, tas izskatās Word doc.
Ļaujiet man parādīs to lietotājam kā eseju.
>> Tā, piemēram, JPEG, izrādās, ir
diezgan sarežģīta zem motora pārsega.
Bet pirmie trīs baiti biežāk kā reizi JPEG sākt ar šiem trim skaitļiem.
Tātad baits nulle, viens, un divi, kas lielākā katru JPEG, 255, tad numurs
216, tad skaitlis 255.
>> Un ko jūs varēsiet sākt darīt nākamnedēļ
faktiski poking zem kapuci failus, piemēram JPEG
un, piemēram, bitkartes failus, un redzot , kas vienmēr ir bijis tur tik ilgi
kā jūs esat bijis, izmantojot datoru.
>> Bet to, kas nav parasti rakstīts tāpat aiz skaitļiem, piemēram, šis.
Datoru zinātnieki nav mēdz runāt aiz komata.
Tie nav īsti runā bināro.
Parasti, ja mēs vēlamies izteikt skaitļus,
mēs faktiski izmantot heksadecimālo, kas jums var atgādināt
no, teiksim, Problem Set Viens, kas apstrīdēja
lai jūs domājat par citu sistēmu.
>> Mēs, protams, ir pazīstami ar komata, nulles caur deviņi.
Mēs runājām par bināro.
Un mums nav īsti ir izmantot ka daudz šeit
uz out, jo datori izmantos to.
Bet programmētāji būs ļoti bieži, bet ne vienmēr,
izmantot heksadecimālo, kas nozīmē tikai to, Jums ir 16 burti savā alfabētā,
atšķirībā no diviem vai 10.
>> Tātad, kā jūs rēķināties ar augstāku nekā deviņi heksadecimāli?
Tu ej 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, tikai ar konvencijas.
Bet to, kas ir galvenais ir tas, ka katrs no tiem ir viens simbols.
Nav 10.
Nav 11, per se, jo katrs Sava cipariem, tāpat patīk komata
un tāpat kā binārā, būtu vienkārši būt vienu rakstzīmi, pēc vienošanās.
>> Tāpēc, ka tad ir alfabēts mums mūsu rīcībā heksadecimālo.
Tātad, ko tas JPEG izskatās, ja jūs bija rakstīt šo pirmo trīs
baiti nevis kā aiz komata, bet, Piemēram, kā heksadecimālim?
Un kāpēc ir hex pat viss, kas noder?
>> Nu, ātri apskatīt piemēru.
Tātad, ja es rakstīt, biti, kas pārstāvēt šos decimāldaļu numbers--
tas varētu būt nedaudz ierūsējis tagad no dažām nedēļām atpakaļ,
bet pa kreisi vienu un labi viens ir diezgan viegli.
255 bija lielākais skaits, mēs varētu būt ar astoņiem bitiem.
Tas viss bija ones.
Tātad vienīgais, kas ir nedaudz interesanti ir vidējā viena.
Un, ja jūs veida darīt out math, jūs secināt, ka, protams,
ka modelis viens un nullītes pārstāv 216.
Tāpēc pieņemsim tikai nosaka, lai tagad, ka tie ir pareizi.
Bet kāpēc tas ir interesanti?
>> Nu, baitu, protams, ir astoņi biti.
Un izrādās, ka, ja jūs domājat, ka par baitu kā divu gabalos četru biti,
kā šis.
Ļaujiet man vienkārši pievienojiet dažas vietas.
Tātad, pirms, pēc.
Esmu tikko pievienotās dažas balto laukumu vizualizācijai dēļ šeit.
Kā mēs varētu tagad pārstāv, teiksim, heksadecimālo katrs quad biti,
katrs komplekts no četriem bitiem?
>> Tā, piemēram, pa kreisi Tagad, mums ir 1111 bināro.
Kas ir tas, ka skaits aiz komata, ja jūs out math?
Jums ir ones vieta, twos vietu, četrrāpus vietu, un astotnieki vietu.
>> AUDITORIJA: 15.
DAVID J. Malan: Tas ir 15.
Tātad, ja mēs astoņi plus četri plus divi plus viens, mēs iegūstam 15.
Lai es varētu pierakstīt 15 zemāk 1111, bet viss punkts šeit
ir heksadecimālo, nav decimālo.
Tā vietā, rakstot uz leju 15, 1-5, Es esmu gatavojas rakstīt, ka hex,
kas, ja jūs domājat, ka atpakaļ, ja Jums ir nulle caur f, kas ir 15 būs?
AUDITORIJA: f.
DAVID J. Malan: Tātad izrādās, tas ir f.
Un jūs varat strādāt, ka ārā, sakot, labi, ja ir 10, tad OK, f ir 15.
Tik tiešām, mēs varētu pārrakstīt tas pats skaitļu kopums kā f f.
Un tad, ja mēs mazliet par matemātiku, mēs secināt, ka tas ir d.
Astoņi ir diezgan viegli, jo mēs ir viens no eights vietā.
Un tad mums ir pāris vairāk f f s.
>> Tātad, ko cilvēki mēdz darīt pēc vienošanās ja viņi izmanto sešpadsmitnieku ir viņi vienkārši
rakstu šo nedaudz vairāk kodolīgi, atbrīvoties no lielākā daļa no šī baltā telpā.
Un tikai, lai būtu super skaidrs lasītāji, ka šis ir heksadecimāla,
vienkāršs konvencija vidū cilvēki ir rakstīt nulli
x, kas nav nekādas citas nozīmes nekā vizuālo identifikatoru,
šeit nāk Hex numuru.
>> Un tad, jūs nodot divus ciparus, f f šajā gadījumā, tad d, tad f f.
Tik garš stāsts īss, heksadecimālo vienkārši mēdz
būt noderīgi, jo katra tās cipari, nulle caur f, perfekti līnijas
klajā ar modeli četriem bitiem.
>> Tātad, ja jums ir divas heksadecimālo cipari, nulle caur F, atkal un atkal,
, kas dod jums perfekti astoņi biti vai viens baits.
Tātad, tāpēc tai ir tendence būt konvencionāli noderīga.
Nav intelektuālo saturs tiešām pārsniedz to,
izņemot tās faktisko lietderību.
>> Tagad JPEG ir ne tikai failu formātus grafikas.
Jūs varētu atgādināt, ka pastāv failus, piemēram, tas pasaulē,
vismaz no pāris gadus atpakaļ.
>> Tātad tas faktiski bija uzstādīta Windows XP
uz miljoniem datoru visā pasaulē.
Un tas bija bitmap failu, BMP.
Un bitmap failu, kā jūs redzēsiet nākamo nedēļa, nozīmē tikai modeli punkti,
pikseļi kā viņi sauc, karti par bitiem, tiešām.
>> Tātad, kas ir interesanti, lai gan, par šo faila formātu, BMP, ir
ka zem motora pārsega, to ir vairāk nekā tikai trīs baitu
ka izveidot savu galvenes, tāpēc runāt, dažus pirmos kodieniem.
Tas tiešām izskatās mazliet sarežģīta pēc pirmā acu uzmetiena.
Un jūs redzēsiet šo P komplektā.
Un iegūt kaut ko īpaši no šo tagad
nav tik svarīgi, jo tikai ar to ka sākumā katra bitmap
fails, grafiskā formātā, tur ir viss ķekars numuriem.
>> Tagad Microsoft, autors šajā formātā,
mēdz zvanīt tiem lietas ne ints un simboli
un pludiņiem, bet vārdi un d vārdus un ilgojas un baiti.
Lai viņi tikai dažādus datu tipus.
Viņi dažādi nosaukumi par to pašu.
Bet jūs redzēsiet, ka P Set Four.
>> Bet tas ir tikai teikt, ka, ja cilvēkam double-noklikšķina kādu BMP failu uz viņa
vai viņas cieto disku, un atveras logs parāda, viņam vai viņai, ka attēlu,
ka noticis tāpēc, ka darbības sistēma, iespējams, pamanījuši ne tikai
BMP faila paplašinājums faila nosaukumu,
bet arī fakts, ka tur ir dažas konvencija modelis bitiem
pašā sākumā Minētā bitkartes failu.
>> Bet pieņemsim tagad jākoncentrējas uz šāda sarežģīta failu,
bet gan par kaut ko līdzīgu šim.
Pieņemsim, ka šeit gedit, I vienkārši ir iesākums
no programmas, kas ir diezgan vienkārši.
Man daži ietilpst līdz top.
Tagad Man # include "structs.h", bet Es atgriezīšos, ka brīdi.
Bet tas ir noderīgs tagad.
Tātad, tas ir programma kas notiek, lai īstenotu
tāpat dzimtsarakstu datu bāzē.
Tātad datu bāze studentu, un katrs students pasaulē
ir vārdu un māju un, iespējams, daži citas lietas, bet mēs saglabātu tā vienkārši.
Katram studentam ir vārdu un māju.
>> Tātad, ja es gribēju rakstīt programma, kuras mērķis dzīvē
bija tikai atkārtot no nulle par līdz trim,
ja tur ir trīs studentus Hārvarda universitātē.
Un es tikai vēlos saņemt, izmantojot GetString, katra studenta vārds un mājas,
un tad vienkārši izdrukāt tos out.
>> Tas ir veida, piemēram, nedēļas Viens, Otrā nedēļa sīkumi tagad,
kur es tikai gribu, lai cilpa, vai kaut kas tamlīdzīgs.
Un es vēlos, lai izsauktu GetString maz reizes, un pēc tam izdrukāt f pāris reizes.
Tātad, kā es varētu darīt, lai gan, kad gan nosaukumu un māju
ir iesaistīti katram studentam?
>> Tātad mans pirmais instinkts varētu būt darīt kaut kas līdzīgs šim.
Es varētu vispirms pateikt, labi, man dot, saka, masīvs stīgas sauc par nosaukumiem.
Un es nevēlos hardcode trīs šeit.
Ko es gribu, lai tur?
Tātad STUDENTIEM, jo tas ir tikai nemainīgs deklarēts augšpusē,
tikai, lai man nav hardcode trīs vairākās vietās.
Tādā veidā, es varu mainīt to vienu vietu, un tas ietekmē izmaiņas visur.
Un tad, es varētu darīt string mājas studentiem.
>> Un tagad, es varētu darīt kaut ko līdzīgu uz (int i = 0; i <studentu i ++.
Tāpēc es esmu rakstīt ātri, bet tas ir iespējams, iepazinies sintakse tagad.
>> Un tagad, tas bija vēl nesen.
Ja es gribu likt i-th studenta vārds, es domāju, ka es to izdarītu.
Un tad, nevis vārdi bet mājas stiprinājuma i.
Man šī, GetString, un ļaujiet man iet atpakaļ un noteikt šo līniju.
Piekrītat?
Nepiekrist?
Tas nav ļoti draudzīga.
Es neesmu teicis, ka lietotājam, ko darīt.
>> Bet tagad, ja es arī gribēja vēlāk, pieņemsim
teiksim, izdrukāt šīs lietas out-- tik TODO vēlāk.
Es esmu gatavojas darīt vairāk ar this-- tas varbūt ti
pareiza īstenošana iegūt nosaukumus un mājas, trīs
no tiem kopā katra, no lietotāja.
>> Bet tas nav ļoti labs dizains, labi?
Ko darīt, ja studentam ir ne tikai vārdu un māja, bet arī ID numurs,
un tālruņa numurs, un e-pasta adresi,
un varbūt mājas lapā, un varbūt Twitter rokturis,
un jebkurā no citām detaļām numurs saistīta ar students vai persona,
kopumā.
Kā mēs sākam pievienot funkcionalitāti, lai šo programmu?
>> Nu, es jūtos kā vienkāršākā veidā varētu būt kaut ko darīt, piemēram, teiksim,
int ids studentiem.
Lai es varētu likt visu savu ID tur.
Un tad, kaut ko piemēram, tālruņa numurus,
Es neesmu pārliecināts, kā pārstāvēt, ka tikai pagaidām.
Tāpēc iesim uz priekšu un tikai zvanu Tas Twitters studenti, kas
ir mazliet dīvaini, but-- un ķekars vairāk lauki.
>> Esmu sācis efektīvi kopēt un ielīmēt šeit.
Un tas notiek, lai augt diezgan smagnēja diezgan ātri, labi?
Vai tas nebūtu jauki, ja tur bija pasaules datu struktūra zināms
nevis kā int vai auklas, bet kaut augstāks līmenis, abstrakcijas, tāpēc
runāt, kas pazīstams kā students?
C nenāca ar iebūvētu funkcionalitāte studentiem,
bet, kas notiks, ja es gribēju, lai dotu to, piemēram?
>> Nu, izrādās, es esmu gatavojas atveriet failu ar nosaukumu structs.h šeit
un jūs varat darīt tieši to.
Un mēs esam gatavojas sākt darīt to tagad.
Un zem kapuces P Set Trīs, Jūs esat jau to izdarīt tagad.
Nav tādas lietas kā g RECT vai g ovālas programmēšanas valodu C.
>> Ļaudīm Stenfordas īstenoti tiem datu tipi, izmantojot šo pieeju, šeit,
deklarējot savu jauno datu veidi, kuros izmanto jaunu atslēgvārdu
sauc struktūrai un vēl viens sauc typedef.
Un tiešām, pat ja sintakse izskatās nedaudz atšķiras no sīkumi
mēs esam redzējuši iepriekš, principu, tas ir super vienkārši.
>> Tas tikai nozīmē "noteiktu veidu."
Kas notiek, lai būtu struktūru, un struktūra
ir tāpat kā ar konteineru par vairākām lietām.
Un, ka struktūra, kas notiek ir virkne sauc vārds,
un stīgu sauc par māju.
Un sauksim, tikai ērtības labad, tas viss datu struktūra students.
>> Tātad, kad jūs nokļūt semikols, jums ir tagad
izveidojis savu datu tips sauc students
, kas tagad stāv līdzās int, un peldēt, un char, un stīgu,
un g tiešās, un g ovālas, un jebkura numurs citas lietas, cilvēki ir izgudrots.
>> Tātad, kas ir noderīgi, par šo Tagad ir tā, ka, ja es iet atpakaļ
līdz struktūrai 0 un pabeigt šo īstenošanu, ko es uzrakstīju
iepriekš šeit, ievērosiet, ka visi neizbēgama messiness ka
bija gatavi sākt notiek kā es pievienotās tālruņu numurus un Twitters un visu
šīs citas lietas, kas studenta definīcija,
tagad tas ir īsumā apkopoja kā vienu masīva studentiem.
>> Un katrs no tiem studentiem tagad ir vairākas lietas iekšpusē no tā.
Tā, ka tikai atstāj vienu jautājumu.
Kā jūs nokļūt pie vārda, un māja, un ID,
un kāds cits ir iekšpusē students?
Super vienkārši, kā labi.
Jauns sintakse, bet vienkārša ideja.
>> Jūs vienkārši indekss uz masīvs, kā mēs to darījām pagājušajā nedēļā, un šo.
Un, kas ir skaidri jauns gabals sintakse?
Vienkārši., Kas nozīmē "iet iekšā struktūra un saņemt lauks sauc
nosaukums, saņemt lauku sauc māja, saņemt lauku sauc students. "
>> Tātad P Set Trīs, ja tu esi joprojām strādā uz to,
un lielākā daļa cilvēku joprojām ir, saprast, ka jums
sākt izmantot lietas, piemēram, g rects un g ovals
un citas lietas, kas nešķiet nāk no Nedēļas nulle, viens, vai divi,
saprotu, ka tas ir tāpēc, Stanford deklarēta dažas jaunas datu tipu.
>> Un tiešām, tas ir tieši tas, ko mēs darīt, kā labi, jo P Set Four, kad
sākam risināt ar lietām piemēram, attēlus, bitkartes, un vairāk.
Tātad tas ir tikai teaser un garīgās modelis to, kas nāk.
Tagad, es procrastinated mazliet šorīt.
Es biju veida ziņkārīgs, lai redzētu, kas Microsoft wallpaper faktiski
izskatās šodien.
Un izrādās, kāds 2006.gadā faktiski devās gandrīz precīzi
pats vietas nofotografēt realitātē kādi izskatās, ka šajās dienās.
Lauks tagad nedaudz aizaugusi.
>> Tātad, runājot tagad attēlu, pieņemsim atvest Daven šeit
uz ekrāna un Niklasa un tikai atgādināt jums
ka, ja jūs vēlaties pievienoties mums pusdienās šo piektdien, galvenais, lai mūsu parasto URL
šeit.
>> Tātad, ja mēs mitēties pirmdien?
Mēs ieviesām šo problēmu, vai ne?
Tas bija šķietami pareizs īstenošana mijmaiņas,
, kurā jūs lietojat divas ints, viens sauc, viens sauc b,
mijmaiņas tiem, tāpat kā Laura bija šeit uz skatuves ar pienu un ūdeni,
izmantojot pagaidu mainīgs, vai tukša glāze,
lai mēs varētu likt b ar, gan in b neveicot putru lietas.
Mēs izmantojām mainīgo.
To sauc temp.
>> Bet to, kas bija būtisks Problēma ar šo kodu pirmdien?
Kāda bija problēma šeit?
Jā.
>> AUDITORIJA: Tas aizņem vairāk vietas.
>> DAVID J. Malan: Aizņem vairāk vietu, jo es esmu, izmantojot mainīgo,
un tas ir OK.
Tas ir taisnība, bet es esmu teiksiet, ka ir OK.
Tas ir tikai 32 bitu grand shēma lietām, tāpēc nav liels darījumu.
Citas domas?
AUDITORIJA: Tas tikai mijmaiņas mainīgie lokāli.
DAVID J. Malan: Tieši tā.
Tas tikai mijmaiņas mainīgos lokāli.
Tāpēc, ka jebkurā laikā jūs saucat function-- kad man bija paplātes no Annenberg
pēdējo reizi, jums ir galvenais uz grunts.
Tiklīdz jūs zvanīt funkciju sauc swap, swap nesaņem x un y,
sākotnējie vērtības.
Kāda swap get, vai mēs apgalvot?
Mērķauditorija: kopijas.
DAVID J. Malan: Tātad kopijas.
Tātad, tas kļūst viens un divi, ja jums atgādināt piemēru no pēdējo reizi,
bet kopiju viena un divu , kas tiek veiksmīgi samainīti.
Bet Diemžēl šajā nolūkā šīs vērtības joprojām ir tāds pats.
Tātad, mēs varam redzēt to ar mūsu jaunais draugs, cerams GDB,
ka jūs vai TFS un Ca ir jābūt ir vadīt jūs pret šādi.
>> Līdz ar to nav swap atsaukšana izskatās like-- pieņemsim atvērt this-- izskatās šādi.
Mēs inicializēts x vienam, y līdz diviem.
Bija ķekars drukas f s.
Bet tad, galvenais zvans šeit bija swap, kas
Tieši kods mēs tikko redzēju pirms brīža.
Kas ir pareizs sākumā skatienu, bet funkcionāli,
šī programma nedarbojas, jo tas nav neatgriezeniski swap x un y.
>> Tātad, pieņemsim redzēt to, ātri silts šeit ar GDB, ir ./noswap.
Ķekars pārliecinošu informāciju, ka Es nopirkšu atbrīvoties no ar Control L tagad.
Un tagad, es esmu gatavojas iet uz priekšu un palaist to.
Un diemžēl, ka nebija, ka noderīgs.
Tā skrēja programmu iekšpusē šis programmu, ko sauc GDB, atkļūdotājs,
bet tas nav man kule apkārt.
>> Tātad, kā es varu tiešām pauzēt izpilde iekšā šo programmu?
Tātad pārtraukums.
Un es varētu lauzt jebkurā līniju skaits, kas ir viens, 10, 15.
Bet es varu arī pauze simboliski sakot pārtraukuma Main.
Un kas notiek, lai uzstādītu pārtraukuma punkts, acīmredzot pie 16 līnijas galvenais.
Un kur ir 16 līnijas?
Iesim līdz kodam un iet līdz noswap.
Un tiešām, 16 līnija ir Pats pirmais programmā.
>> Tāpēc tagad, ja man iet uz priekšu un tips palaist šo laiku, Enter, tas apturēta.
Tātad pieņemsim kule apkārt.
Izdrukāt X- kāpēc x nulle?
Un ignorēt dolāra zīmi.
Tas ir tikai mīļotājs izmantošana programmas.
Kāpēc x nulle šobrīd?
Jā.
>> AUDITORIJA: Tas ir apturēta tieši pirms 16 līnija, nevis faktiski par 16 līnijas.
DAVID J. Malan: Tieši tā.
GDB, pēc noklusējuma, ir apturēta izpilde tieši pirms 16 līnijas.
Tātad tas nav izpildīts, kas nozīmē x ir kādu nezināmu vērtību.
Un mums paveicās, ka tā ir kaut kas tīrs līdzīgu nullei.
Tāpēc tagad, ja es tipa nākamais, Tagad tas izpildīts 16.
Tas gaida man izpildīt 17.
Ļaujiet man iet uz priekšu un izdrukāt x.
Tas ir viens.
Ļaujiet man iet uz priekšu un izdrukāt y.
Kas man būtu jāredz tagad?
>> Mērķauditorija: [dzirdams]
>> DAVID J. Malan: mazliet skaļāk.
>> Mērķauditorija: [dzirdams]
DAVID J. Malan: Ne gluži vienprātības.
Tātad, jā, mēs redzam dažas atkritumu vērtību.
Tagad, y ir 134514064 tur.
Nu, tas ir tikai daži atkritumu vērtība.
Mana programma izmanto RAM dažādiem mērķiem.
Tur ir citas funkcijas.
Citi cilvēki rakstīja iekšā manā datorā.
Tātad šie biti ir izmantoti citas vērtības, un ko es esmu redzēt
ir paliekas dažu pirms tad šo atmiņu.
>> Līdz ar to nav liels galā, jo, tiklīdz kā es tipa blakus, un pēc tam izdrukāt y,
tas ir inicializēts vērtība, ko es gribu.
Tāpēc tagad, iesim uz priekšu mazliet ātrāk.
N uz nākamo.
Darīsim to vēlreiz.
Bet es nevēlos, lai sasniegtu to šeit, jo, ja I
gribu redzēt, kas notiek iekšā noņemamo, kas ir komanda?
>> AUDITORIJA: soļi.
>> DAVID J. Malan: soļi.
Tātad šis soļi mani funkcija, nevis pār to.
Un tagad tas ir nedaudz noslēpumains godīgi, bet tas ir tikai
saki man, es esmu 33 rindā tagad.
Un pieņemsim darīt atkal.
Print temp.
Atkritumu vērtība negatīva šoreiz, bet tas ir tikai vēl atkritumu vērtība.
Tātad, pieņemsim darīt tālāk, drukas temp.
Tas ir inicializēts līdz 1, kas ir vērtība x, aka.
>> Tagad, kur ir mūsu un x nāk no?
Nu, paziņojuma galvenais, mēs sauc šīs vērtības x un y.
Mēs pēc tam laiž tos apmainīt šādi.
X bija pirmais, komats y.
Un tad, swap var zvanīt viņiem x un y.
Bet skaidrības labad, tas ir zvanot viņiem un b.
, Bet a un b ir tagad būs kopijas, x un y, attiecīgi.
>> Tātad, ja es dodos atpakaļ uz GDB, temp tagad ir viena, un tagad ir viens.
Bet, ja man blakus un tagad darīt drukāt , jau ir pārgājuši.
Piens ir ielej bijušais Apelsīnu sula ir stikls, vai otrādi.
>> Un, ja man darīt tālāk atkal, un tagad ja es izdrukāt kā veselība pārbaudītu,
joprojām ir divi, bet tagad b ir viens.
Atklāti sakot, tas ir joprojām.
Man vienalga, ko temp ir.
Bet, tiklīdz es tagad rakstot, teiksim, turpina iet atpakaļ, tagad es esmu beigās
programma.
Un diemžēl, x ir joprojām ir viens un y ir vēl divi.
>> Tātad, kāds bija lietderība GDB tur?
Tas nav man palīdzēt noteikt Problēma per se,
bet cerams man palīdzēt saprotu realizējot
ka jā, mana loģika ir taisnība, bet mans kods nav galu galā, kam
pastāvīga ietekme.
Tāpēc, ka ir problēma, mēs esam gatavojas tagad atrisināt šodien.
>> Bet pieņemsim nokļūt, izmantojot šo.
Virkne ir meli.
Tā arī nav datu tips ka pastāv C. Tas ir
bijis sinonīms dažiem laiks kaut ko citu,
un mēs varam atklāt, ka šādi.
>> Ļaujiet man iet uz priekšu un atvērt Programma sauc salīdzināt-0.
Un nevis rakstīt šo vienu out, mēs sāksim staigāt pa kodu
Es jau rakstīju, bet tas ir tikai dažas rindiņas.
Tātad šis ir salīdzināt-0.
Un pirmais, ko es daru kļūst teksta rindiņu.
>> Bet paziņojums, ko es esmu darot pirmo reizi.
Kas ir atšķirīgs acīmredzami par līnija 21?
Patiesībā, pagaidiet minūti.
Tas ir divas kopija.
Tas nav pat pareizo programmu.
Nu labi, spoilers brīdinājumu.
Labi, lai nekad prātā, ka.
Tas ir uz nākotnes jautājumu.
>> Te ir salīdzināt-0, un es esmu par to, lai iegūtu teksta rindiņu.
Programma ir daudz vienkāršāk.
Tātad tas ir vienkārši.
Tas ir tāpat kā nedēļa One Week otrās sīkumi brīdī. String s = GetString.
Tagad, es saku to vēlreiz uz leju šeit.
string t = GetString.
Un tad, pēdējā lieta šajā programmu, jo tā nosaukums liecina,
ir Es esmu gatavojas izmēģināt, lai salīdzinātu tos.
>> Tātad, ja s, pirmā rinda, vienāds = t, tad es esmu
teiksiet rakstot to pašu.
Else, es esmu gatavojas teikt Rakstot dažādas lietas.
Tātad, pieņemsim apkopot un palaist šo programmu.
Tātad, lai salīdzinātu nulle.
Izskatās labi.
Nav apkopošanas kļūdas.
>> Ļaujiet man iet uz priekšu tagad un ierakstiet ./compare-0.
Ļaujiet man iet uz priekšu un kaut ko pateikt : Daven un kaut: Rob.
Un es tipa dažādas lietas.
Līdz šim tik labi.
Programma, šķiet, ir pareizs.
>> Bet pieņemsim palaist vēlreiz.
Kaut ko pateikt: Gabe.
Viss labi.
Varbūt es hit starpdevējs vai kaut bailīgs.
Darīsim to vēlreiz.
Tik Zamyla.
Zamyla.
Dažādas lietas.
Tātad, kas notiek?
>> Tāpēc mums ir šīs divas līnijas kods, GetString tiek saukta divreiz.
Un tad, es esmu vienkārši mēģina salīdzināt s un t.
Bet kas īsti tad notiek?
Nu, mans rokraksts ir apmēram, lai miesnieks šo piemēru nedaudz.
Un pieņemsim faktiski mest Tas veido vairāk nekā šeit, kā labi.
>> Tātad mums ir līnija, piemēram, String s = GetString.
Tāpēc, ka ir vienkārši pirmais interesanti līnija no šīs programmas.
Bet to, kas visu šo laiku ir bijis notiek zem motora pārsega?
Nu, kreisajā pusē ir virkne, kas ir daži no mainīgā tips,
un to sauc s.
Tāpēc es zinu, ka tas ir, izmantojot atmiņu, vai RAM, manā datorā kaut kā.
Tāpēc es esmu gatavojas abstrakti izdarīt, ka kvadrātu.
32 biti, izrādās, taču vairāk par to nākotnē.
Un tad, kas notiek vairāk nekā šeit?
>> Nu, protams GetString saņem virkni no lietotāja.
Un GetString dabūja Zamyla vai Gabe vai Daven.
Tātad, pieņemsim izvēlēties pirmais no tiem, kas bija Daven.
Tik efektīvi, kādi GetString saņēmu me minētajā pirmajā gadījumā bija D-a-v-e-n.
Un tad, kas cits darīja tas dod man slepeni?
Mērķauditorija: [dzirdams]
DAVID J. Malan: Jā, / 0 vai null raksturs.
Tātad tas faktiski deva man virkni.
Bet mēs jau zinām no iepriekšējās izskatās, ka virkne ir tikai masīvs
rakstzīmes, un tas ir izbeigts šis īpašais sargs tēlu / 0.
>> Bet, ja tā ir taisnība un tas ir kvadrātveida,
tas ir acīmredzami daudz lielāks taisnstūris.
Un tiešām, tas ir, Es apgalvo, tikai 32 bitus.
Un tas ir acīmredzami vairāk nekā 32 biti, jo tas ir iespējams
astoņi plus astoņi plus astoņi plus astoņi plus astoņi,
tikai tāpēc, ka baitu ASCII.
Kā heck mēs gatavojamies, lai ietilptu Daven šajā mazā kastīte šeit?
>> Nu, kas ir GetString faktiski dara?
Nu, šis režģis šeit ir mana datora atmiņas vai RAM.
Tāpēc pieņemsim patvaļīgi teikt, ka, ja katra no tām pārstāv baitu,
tad mēs varam domāt par katru baitu kā ar adresi,
tāpat 33 Oxford Street, vai 34 Oxford Street, vai 35 Oxford Street.
>> Tātad tāpat kā mājās ir adreses un ēkām ir adreses,
tā darīt atsevišķas baiti atmiņa ir adreses vai ciparus
, kas unikāli identificē tos.
Tagad tas ir patvaļīgs.
Bet, lai saglabātu tā vienkārši, es esmu gatavojas izmantot heksadecimālo tikai pēc vienošanās,
bet 0x ir nekas cits nekā "šis ir heksadecimālo."
un es esmu gatavojas apgalvot, ka "D" nonāks pie Byte One atmiņā.
>> Man nekas cits notiek atmiņa, tāpēc Daven ieguva pirmo vietu
pie Byte One.
Tas tad būs 0x2.
Tas ir gatavojas 0x3.
Šis būs 0x4.
Tas ir gatavojas 0x5.
Šis būs 0x6.
>> Bet tad, kad jums sākt domāt par to, kāda datora vainas
zem motora pārsega, Jūs varat sākt, lai noteiktu
kā jūs, pirms dažiem gadiem, būtu ir īstenojušas C sevi.
Kas ir GetString iespējams returning-- jo tas
uzskata, tāpat kā tas nav atgriežoties Daven, per se,
tāpēc, ka viņš, protams, nenāks lai ietilptu šajā maz box--
tā, kādi ir GetString iespējams atgriežas?
>> Mērķauditorija: [dzirdams]
>> DAVID J. Malan: no Daven atrašanās vietu.
Un tas ir bijis to izdarīt kopš nedēļas One.
Kas GetString ir patiešām atgriešanās nav string, per se.
Tas ir viens no baltiem meliem.
Tā ir atgriešanās adresi string atmiņā, unikāla adrese.
Daven dzīvo pie 33 Oxford Street.
Bet vēl kodolīgi, Gavin dzīvo at 0x1, Adrese Number One.
>> Tātad, kas izpaužas likts šajā mazā kastīte tad, lai būtu skaidrs,
ir tikai adrese, virknes.
Tātad visu šo laiku, tas ir bijis notiek.
Bet ko tas mājiens Tagad ir tā, ka, ja viss s ir
ir vairāki iekšpusē no tā, kurš ir pārtraukt jums, programmētājs,
No liekot jebkuru numuru jebkurš mainīga un tikai lekt
šai rieciens atmiņas?
Un tiešām, mēs redzēsim tas ir drauds nākamajā reizē.
>> Bet tagad, tas jūtas nepietiekami.
Ja es saku, get me string, tu man Daven.
Bet jums nav īsti man Daven.
Viss, kas Jums dod man ir Daven adrese.
Kā es varu, tad zināt kur Daven sākas un ends--
stāsts ir kļūst weird-- kur Daven sākas un beidzas,
un tad, nākamais string atmiņā sākas?
>> Nu, ja jūs nododot man sākumā Daven,
būtībā, kā es varu zināt kur beigās viņa vārds ir?
Šis īpašais null raksturs, kas ir visi tagad vēl svarīgāk
ja stīgas zem kapuce vienkārši identificēti
unikāli to atrašanās vietu atmiņā.
Tātad visu šo laiku, kas ir to, kas ir bijis notiek.
>> Tātad, ja mēs skatāmies tagad kodu šeit, paskaidrojiet
ja jums būtu kļūda rindā 26.
Kāpēc Zamyla un Zamyla atšķiras?
Kāpēc Gabe un Gabe atšķiras?
Jā, aizmugurē.
>> AUDITORIJA: Viņiem ir dažādas adreses.
>> DAVID J. Malan: Vienkārši tāpēc, ka tās ir dažādas adreses.
Jo, kad jūs zvanu GetString atkal, ko es darīšu ātri šeit,
ja tas ir otrā rindā, string t, kas man bija šajā programmā,
vienāds ar vēl vienu zvanu uz GetString.
Nākamajā reizē es aicinu GetString, es eju
lai iegūtu atšķirīgu rieciens atmiņas.
>> GetString ir atļauts lūgt darboties
sistēma, lai iegūtu vairāk un vairāk atmiņas.
Tas nav gatavojas atkārtoti pats seši baiti katru reizi.
Tas notiek, lai saņemtu jaunu rieciens atmiņas, kas
ir t gatavojas saņemt kāda cita vērtība, nekā šeit.
>> Tātad, kad man s vienāds = t, jūs neesat salīdzinot
D pret to un pret šo un V pret to.
Jūs salīdzināt šo pret to, kas
godīgi sakot, ir diezgan useful-- useless-- ir diezgan bezjēdzīgi, jo, kas tiešām
cares kur stīgas ir atmiņā?
>> Un tiešām, mums nav.
Un mēs nebrauksim sāktu īpaši gādīga.
Tikai tādā mērā, ka kļūdas var rasties un drošības apdraudējumiem var rasties griba
mēs faktiski sākt rūpēties par to.
Tātad, pieņemsim noteikt šo problēmu.
Izrādās, jūs salabot super vienkārši.
>> Un pieņemsim faktiski, pirms I atklāj, ka atkal, kāda būtu
jūs darīt, ja kādā CS50 klasē, un jums bija īstenot
salīdzinājums pret divām stīgām.
Jūs noteikti varat ne tikai izmantot s vienāds = t.
Bet tikai loģiski, cik jūs salīdzināt šo virkni
pret šīs virknes, izmantojot C kodu?
Jā.
>> AUDITORIJA: Just do cilpa [nedzirdama]
DAVID J. Malan: Perfect.
Mērķauditorija: [dzirdams]
DAVID J. Malan: Jā.
Tikai izmantot cilpas vai kamēr cilpa vai neatkarīgi.
Bet vienkārši piemērot pamatideju, ka, ja tas ir rieciens atmiņas vai masīva
un tas ir, atkārtot vairāk gan vienlaicīgi.
Un tikai salīdzināt burtus.
>> Un tev būs nedaudz uzmanīgiem, jo ​​jums
negribu vienu pirkstu aiziet pagātnē otru
jo viens virkne ir ilgāk par otru.
Tātad jūs gatavojas vēlaties, lai pārbaudītu šī īpašā vērtība gada beigās, null.
Bet tas tiešām ir, jo beigas, tik vienkārši.
Un godīgi sakot, mums nav vajadzīga no jauna šo riteni.
Te ir versija Two.
Un tas, ko es esmu gatavojas teikt, šeit ir tas, ka vietā, salīdzinot s vienāds = t,
Es esmu tā vietā gatavojas teikt, ja virkne salīdzinājums s komatu t vienāds = 0.
Tagad, kas ir stīgu salīdzināt?
>> Izrādās, tas ir funkcija, kas nāk ar C, kura mērķis dzīvē
ir salīdzināt divas stīgas.
Un maisa salīdzināt, ja mēs lasām tās man lapas vai dokumentus vai CS50
atsauces, tā būs vienkārši pateikt, ka ažiotāžu
salīdzināt atgriežas nu negatīvas numurs vai pozitīvs skaitlis vai nulle,
kur nulle nozīmē, viņi vienādi.
>> Tik vienkārši minējums.
Ko tas varētu nozīmēt, ja maisīt salīdzināt atdevi
negatīva vērtība vai pozitīva vērtība?
AUDITORIJA: Lielāks vai mazāks.
DAVID J. Malan: Jā, lielāks vai mazāks.
Tātad, ja jūs vēlaties, lai sakārtotu vienu veselumu ķekars virknes in dictionary--
kā mēs galu galā nosaka road-- ideāls funkciju izmantot iespējami,
tāpēc, ka tas notiek, lai to izdarītu salīdzinājums stīgas jums, un pastāstīt
Jums tas nāk pirms b, vai arī b nonāk līdz alfabēta.
Mēs varam darīt tieši to.
>> Un novērojat man bija viens otru lieta šajā piemērā.
Kas vēl ir mainījies augstāka up šajā galvenā funkcija?
Char *.
Un tas ir tas, ka citu balto meli.
Visu šo laiku, kad jūs esat bijis rakstot virkni,
mēs esam slepeni pārrakstīšana string kā char *, lai šķindēt faktiski
saprot tevi.
>> Citiem vārdiem sakot, CS50.h un kā mēs beidzot redzēt,
mēs, sinonīmu sauc virkni tas ir tas pats, kas char *.
Un tagad, zinu tikai to, ka *, Šajā sakarā vismaz
nozīmē adresi.
>> Par ko adrese?
Nu, tas, ka es teicu char *, un nevis int * vai peldēt *
nozīmē, ka char * ir adresi, char.
Tātad šī mazā kastīte šeit, aka auklas, ir patiešām tipa char *,
kas ir tikai iedomātā veids, kā pateikt, Šajā ailē dosies adresi.
Un ko tas adrese attiecas uz?
Acīmredzot, char.
>> Bet mēs varētu absolūti ir int * un citas lietas.
Bet tagad, char * ir patiešām visvairāk vienkāršs un vienu procentu.
Tātad šī problēma notiek pieaugt, lai gan, atkal.
>> Pieņemsim, ka man atvērt šo programmu.
Let 's redzēt, ja tagad mēs varam prognozēt to, kas ir nepareizi ar šo kodu.
Tātad šajā programmā, kopēt-0, es esmu gatavojas iet uz priekšu un atkal aicinu
GetString un uzglabāt vērtību s.
>> Un tad, kāpēc es daru to, tāpat kā atgādinājumu nedēļas agrāk?
Mēs darījām teikt, ka GetString dažreiz atgriež null.
Ko tas nozīmē, ja GetString atgriež null?
Kaut kas nogāja greizi.
Tas droši vien nozīmē, virkne ir pārāk liels, datora atmiņas.
Tā notiek, super, super, super reti, bet tas varētu notikt.
Mēs vēlamies, lai pārbaudītu to, un tas ir viss, ko mēs darām.
>> Tāpēc, ka mēs redzēsim, tagad, ja jums nav sākt pārbaudes parasti lietām
piemēram, null, jūs varētu faktiski sākt iet
uz adresēm atmiņā, kas ir nederīgi.
Un jūs gatavojas sākt liekot vairāk un vairāk segmentācija defekti.
Vai Mac vai PC, tikko izraisot datoru pakārt
vai programmu, lai iesaldētu, potenciāli.
>> Tāpēc tagad, es apgalvot, kopēt-0.c, ka I dodos uz pārkopēt virknes veidā
līnijas 28.
Un tad, es esmu pieprasīt apakšā
šeit, ka es esmu gatavojas mainīt vienu no tiem.
>> Tātad paziņojums šo.
Es esmu aicinot mūsu veco draugu strlen.
Un tikai paskaidrot angliski Ko šī līnija 34 dara?
Kāda t kronšteinu 0 pārstāvēt pa kreisi.
Jā.
>> AUDITORIJA: Pirmā raksturs t?
DAVID J. Malan: First raksturs t.
Tas arī viss.
Pirmais simbols t, es gribu piešķirt lielais versiju
pirmā rakstura t.
Tātad tas ir kapitalizācijai pirmais burts.
Un tad, ļoti pēdējā lieta, ko es daru jo šī programma ir man apgalvo lūk
oriģinālu, s, un šeit ir kopija, t.
>> Bet, pamatojoties uz stāstu, mēs tikko stāstīja par to, ko stīgas patiešām ir,
kas ir līnija 28 patiešām darīt, un to, kas ir
rezultātā bug notiek būt uz ekrāna?
>> Tātad, pirmkārt, pirmais jautājums, 28.
Kas ir stīgu t = s īsti dara?
Ja mums ir uz kreisās rokas side šeit string t = s;
kas dod man vienu lodziņu šeit un viena kaste šeit.
Un domāju, ka šī adrese ir 0x, teiksim, 50 šoreiz, patvaļīgi.
Kāda string t = s darīt zem pārsega?
>> Mērķauditorija: [dzirdams]
>> DAVID J. Malan: Tā saglabā atmiņu risināt tur, tāpēc 0x50 iet tur.
Tātad, ja tagad, es eju uz pirmā raksturs t un lielajiem burtiem to,
ko es faktiski dara, lai s?
Es esmu patiešām dara to pašu, vai ne?
Jo, ja adrese 0x50-- un vienkārši, es nav daudz vietas uz kuģa šeit
bet pieņemu, ka tas ir 0x50 šeit lejā, kaut kur mana datora atmiņā.
>> Un man ir, piemēram, Gabe ar mazajiem burtiem šeit, kā šis.
Un es jau teicu t kronšteins 0 izpaužas kapitalizētas.
Nu, t skava 0 ir pirmais burts t.
Tik maz g gatavojas kļūt liels G. Bet problēma
ir, ko tas s arī norāda uz?
>> AUDITORIJA: pats.
>> DAVID J. Malan: pašu precīzu lieta.
Tik vienkāršs izskaidrojums, iespējams, pat tad, ja sintakse ir mazliet dīvaini.
Tāpēc pieņemsim to izdarītu.
Veikt kopiju-0, un tad ./copy-0.
Kaut ko pateikt: Gabe.
Un diemžēl, abi viņiem tagad ir kapitalizētas,
bet, kas ir pamatā iemesla dēļ, ka mēs esam vienkārši
Tagad nodarbojas ar adresēm.
>> Tātad, kā mēs sākam address-- no pun intended--
Kā mēs sākam risināt Šī konkrētā problēma?
Nu, kas copy1.c, lietas virzās lai iegūtu nedaudz sarežģītāka.
Bet es varētu apgalvot konceptuāli vienkāršs risinājums.
>> Tik grūti nokļūt pie pirmā acu uzmetiena.
Nebūs viegli pirmais reizi, kad jūs ierakstiet to ārā, iespējams,
bet, ja problēma ir tā, ka vienkārši darot t = s tikai
kopijas adresi, ko, atkal, ja es varētu izvēlēties par jums,
būs risinājums par faktiski kopējot virkni?
>> AUDITORIJA: Mēs ņemšu iespējams atkal izmanto cilpu.
>> DAVID J. Malan: Jā.
Tāpēc mēs ejam uz nepieciešamību cilpu vēlreiz.
Un tāpēc, ka, ja mēs gribam, lai kopētu string s citā virknē,
mēs, iespējams, vēlas to darīt raksturu pēc rakstura.
Bet problēma ir tā, ja tas ir sākotnēji s,
Tagad mums ir nepieciešams, lai sāktu nepārprotami piešķirot atmiņu t.
>> Citiem vārdiem sakot, pieņemsim ievilktu šo pēdējo reizi.
Ja tas ir String s = GetString.
Un pieņemsim likt šo šeit, kā labi.
Tas ir GetString.
Un tad, attēlu kaut ko piemēram, ka būs kā agrāk,
g-a-b-e / 0.
Tas izskatās mazliet kaut kas līdzīgs šim.
Un s tāpēc, mēs to saucam par 0x50, un kas notiek, lai būtu 51, 52.
>> Tātad tas ir 0x50.
Un tad, man stīgu t.
Atmiņā, kas ir tikai gatavojas dod man mazliet kvadrātu, kā šis.
Tātad, kas ir nozīmīgs solis, tagad?
Ja es gribu, lai kopētu s uz t, ko tukšs mums nepieciešams aizpildīt šeit?
Vai to, ko mums vajag darīt augstā līmenī?
Yeah?
Kāds?
Jā.
>> AUDITORIJA: Mums [nedzirdama].
DAVID J. Malan: Jā, mēs nepieciešams aizpildīt šo tukšu.
Es nevaru kopēt un tad kapitalizēt Gabe vārdu
kamēr es lūgt operētājsistēmu citam rieciens atmiņas
kas ir vismaz tikpat liela kā oriģinālam.
Tā, ka atstāj mūs ar jautājumu.
>> Kā es varu lūgt operētājsistēmu nav tikai vienkāršu maz pointer--
kā to sauc, adresi, pointer-- nav
vienkāršu mazā kastīte piemēram, tas sauc virkni?
Kā es varu jautāt darboties sistēma lielu rieciens atmiņas?
Līdz šim es esmu tikai gotten, ka atpakaļ netieši zvanot GetString.
Tātad, kā tiek GetString pat iegūt savu atmiņu?
>> Nu, izrādās, ka tur ir šī citas funkcijas šeit
ka mēs tagad sākam izmantot.
Tagad, tas izskatās tā vairāk mistisks than-- un es esmu vienīgais, kurš var redzēt it--
šī līnija izskatās tā vairāk mistisks tad tā būtu pirmā acu uzmetiena.
Bet pieņemsim diedelēt to intervālu.
>> Kreisajā pusē, man ir char * t.
Tātad angļu, sāksim formulēt pareizi teikumi tehnisko žargonu.
Tātad tas ir piešķirot mainīgo tipa char * sauc t.
Tagad, ko tas īsti nozīmē?
>> Nu, tas nozīmē, ko es gatavojas likt šo mainīgo sauc t?
Adresi, char.
Tāpēc, ka ir tikai vienkāršāk, vairāk saprātīgs veids
aprakstīt kreiso pusi.
Tā, kas rada šo aili tikai šeit.
Tā labajā pusē, domājams, notiek
piešķirt, ka lielāks rieciens atmiņas kā?
Tāpēc pieņemsim diedelēt šo intervālu.
>> Tas ir milzīgs pirmā acu uzmetiena, bet to, kas notiek iekšā šeit?
Pirmkārt, tur ir malloc, kas acīmredzot mūsu jaunais draugs,
"Atmiņas piešķirt."
Tātad tas ir arguments, kas pāriet tajā, tāpēc tas ir diezgan liels arguments.
Tāpēc pieņemsim diedelēt šo intervālu.
>> strlen no s, protams, pārstāv the--
AUDITORIJA: rakstzīmju skaits.
DAVID J. Malan: Just rakstzīmju skaitu s.
Tātad garums s, sākotnējā string.
Tātad, G-a-b-e.
Tātad, tas ir iespējams, četras šajā lietā.
Kāpēc es daru +1 pēc zvanot strlen no s?
Mērķauditorija: [dzirdams]
DAVID J. Malan: Ka īpašais null raksturs.
Ja tu man jautā, kas ir garums Gabe vārds, es esmu gatavojas teikt četri.
Zem motora pārsega, lai gan, man vajag ka piektais baits par null raksturs.
Tātad, tas ir iemesls, kāpēc es esmu dara +1.
>> Tagad tikai gadījumā, ja jūs izmantojat šo programma uz datora, nevis, teiksim,
CS50 ierīces, kur lielums char
var būt atšķirīgs no manas computer--
Izrādās, ka es varu aicinu šo operators sizeof, vienkārši lūgt datoru,
kāda ir lielums char šajā datorā?
>> Un reizinot pieci šajā piemērs ar izmēru char, kas
par lielāko datoru būs tikai viens, malloc
gatavojas piešķirt man tas lielā rieciens atmiņas vairāk nekā šeit, labajā pusē.
Un tas notiek, lai return-- tas ir function-- tāpēc ir
atgriezīsies pie manis, ko?
AUDITORIJA: adrese?
DAVID J. Malan: par ko adrese?
AUDITORIJA: No atmiņu tas piešķirts?
DAVID J. Malan: Of atmiņu tas piešķirts.
Tāpēc man nav ne jausmas, atklāti sakot, , kur tas notiek, lai galu galā.
Es esmu gatavojas ierosināt, ka tas notiek, lai galu galā pie 0x88.
Pilnīgi patvaļīga, bet kaut kas nav 0x50,
jo operētājsistēmu, ko Windows un Mac OS darīt man, ir
pārliecinieties, ka tā dodot me dažādas gabalos RAM.
>> Tātad šis ir vērtība, ja tas rieciens atmiņas varētu beigties.
Tātad, tas ir tas, nonāk šeit, 0x88.
Tāpēc tagad ir skaidri, es varu saprast , ka tas nav tas pats, kā tas,
jo viņi norādot uz dažādi gabalos atmiņas.
Tātad, ja es tagad tiešām vēlaties kopēt šo jo, pieņemsim darīt savu piedāvāto risinājumu.
>> Pieņemsim tikai iet, izveidot cilpas, un darīt t kronšteinu i izpaužas s kronšteinu i.
Jo tagad es varu izmantot šis masīvs līdzīgi notācija,
jo, pat ja malloc ļoti vispārēji piešķir man atmiņu,
atmiņa ir tikai kaimiņu baiti.
Baitos, baits, baitu, atpakaļ atpakaļ atpakaļ.
>> Es varu, protams, kā programmētājs pret to kā masīva, kas
nozīmē, ka varu izmantot beidzot šī pazīstamā pieraksts tikai daži kvadrātiekavās.
>> Tāpēc ļaujiet man pauze tur, jo tas ir daudz visu uzreiz, pat
lai gan pamatideja vēlreiz apkopot ir tas, ka virkne, visu šo laiku,
nav jauna datu tips per se.
Tas ir tikai tā sauktais rādītājs, adresi raksturs,
kas tikai nozīmē, ka ir vairāki ka cilvēka konvencijas
mums ir tendence rakstīt kā 0x kaut ko.
>> Bet tas ir tikai skaitlis, tāpat 33 Oxford Street,
kas notiek, CS ēkas adrese.
Jebkuri jautājumi par šo informāciju?
Yeah?
>> AUDITORIJA: Kāpēc mēs pārbaudām t ir vienāda ar null?
>> DAVID J. Malan: Kāpēc mēs pārbaudīt t vienāds ar null?
Ja mēs lasām documentation-- liels question-- par malloc,
tas gatavojas teikt fine print, dažreiz malloc varētu atgriezties null,
tāpat kā GetString.
Un tiešām, GetString atgriež null Ja, savukārt, malloc atgriež null,
jo GetString izmanto malloc.
>> Un, kas varētu notikt, ja OS, Mac OS, Windows, neatkarīgi, ir vienkārši
no atmiņas jums.
Tātad tas, kas tur notika.
>> Un ļaujiet man atklāt vienu citu lietu kas varētu vienkārši trieciens jūsu prātā
vai pilnīgi pārāk tālu pār līniju.
Bet ļaujiet man uzvilkt pati cilpa kopēšanai,
kas pirms brīdis, atsaukšana bija šo. t kronšteins i izpaužas s kronšteinu i.
>> Jauka un draudzīga.
Jūtas kā Otrā nedēļa atkal.
Bet šis variants patiesībā var būt pārrakstīt, jo tas, kas izskatās noslēpumains.
Tas ir paņēmiens, ko sauc rādītājs aritmētika, adrese aritmētika.
Bet kāpēc tas darbojas?
>> Tagad kaitinoši, autori C nolēma izmantot
* simbols dažādiem mērķiem.
Mēs esam redzējuši to izmanto jau vienreiz, char *, kas nozīmē "dod man mainīgais
kas notiek, lai apturētu adresi, char. "
Tātad char * šajā kontekstā nozīmē "man mainīgo."
>> Diemžēl, ja jūs izmantojat * bez vārds priekšā tā, piemēram, palijas,
tā tagad sauc dereference operators.
Un mēs redzēsim vairāk par šo pirms ilgi.
Bet tas tikai nozīmē "iet uz turieni."
Tas ir tāpat kā teikt, ja kāds man pasniedza par kādu papīra "33 Oxford Street,"
ja man "* 33 Oxford Street", tas nozīmē, ka "Iet uz leju ceļu uz CS ēkā."
>> Tik * vienkārši nozīmē iet uz turieni, ja tur neviens vārds tā priekšā.
Tātad, kas ir t, lai būtu skaidrs?
t ir adrese rieciens atmiņu, kas tika dots atpakaļ uz mani.
s ir adrese, ko, lai būtu skaidrs, piemērā, mēs esam runājuši,
par mazo Gabe?
s ir adrese of--
AUDITORIJA: string.
DAVID J. Malan: Of Gabe sākotnējo nosaukumu.
Tātad, tas ir adrese šis rieciens atmiņas.
Tātad, ja es saku t + i-- i, paziņojums, ir tikai mūsu vecais draugs.
Tas ir tikai rādītājs mainīgais kas ir atkārtojot no nulles uz augšu
ar garumu virknes s.
Tātad tas būs nulle, tad vienu, tad divas, tad trīs, pēc tam četras.
Tātad, pieņemsim apkopot šo jauno Momentloterijas līdzīgi puzzle gabalus, ja jūs,
kaut gan, atkal, sintakse ir daudz mistisks nekā nulles.
Tātad, t ir adrese + i gatavojas sniegt man
numuru, jo tie visi ir skaitļi, kas mēs esam bijuši zīmēšanas kā Hex.
Bet viņi tikai ciparus.
>> Tātad, ja adrese t mēs minētā bija 0x88, kas ir 0x88 plus nulle.
Pat ja jūs neesat apmierināti ar hex vēl, ņem minējums.
>> AUDITORIJA: oriģināls.
>> DAVID J. Malan: Still 0x88.
Tātad, ko tas * 0x88 nozīmē?
Tas nozīmē, "iet tur", kas nozīmē efektīvi, "nodot savu pirkstu šeit."
Un tagad par labajā pusē šis izteiciens, * un tad parens,
s + i ir S, kas ir risinātu šeit par maz g.
s + 0, protams, s, neatkarīgi s ir.
>> Tātad tagad, tas * s, kas, tāpat kā * 33 Oxford Street nozīmē iet uz adresi
s.
Tātad, šeit ir šis pirkstu, labo roku.
Tātad, ko es esmu gatavojas iekopēt ko?
Lieta, par tiesībām, kas ir Gabe, maz g šeit, uz šeit.
>> Un tā iedarbība, kas pirmā atkārtojuma no cilpas,
kā jūs ierosināts, lai gan tas izskatās traks sarežģītāka nekā jebkas
mēs esam redzējuši iepriekš, ir vienkārši sakot iet šeit un kopēt, ka raksturu šeit.
Tas dod jums karti abām vietām.
>> Un mēs redzēsim daudz vairāk par to.
Bet tagad, cerība ir tikai ieviest dažas no šīm pamatidejām.
Un tiešām, aplūkosim viens galīgo programmu šeit
un tad apsolīja claymation, kas būs viss labi.
Viss labi.
Tāpēc ļaujiet man atvērt up-- tur mēs ejam.
Tāpēc ļaujiet me-- mēs atgriezties ar šo attēlu pirms ilgi.
Ļaujiet man atvērt šo galīgo piemēru šeit.
>> Tātad, šeit ir super, super programma, kas accomplishes
nekas dzīvē, kas dara sekojošo.
Tas pirmo reizi deklarē divi mainīgie, x un Y, kas nav skaitļi šajā laikā,
per se.
Viņi nav veseli skaitļi, per se.
Tie ir acīmredzami int *.
Tātad tikai kāds, ko tas nozīmē ja jūsu datu tipu, jūsu mainīgs,
ir veids int * zvaigzne?
Tas ir adrese int.
>> Tāpēc es nezinu, kur tas ir vēl.
Tas vienkārši nozīmē "izsakoties, galu galā, adrese int šeit. "
0x50, 0x88, kur tas ir atmiņa, adrese notiek tur.
Un tas, ko y būs, kā labi.
>> Ja tagad es saku x = malloc (sizeof (int)), tas ir iedomātā veids, kā pateikt,
hey operētājsistēma, izmantojot malloc, dod man pietiekami daudz atmiņas lielumam
no int, kas, iespējams būs 32 biti vai četri baiti.
>> Tātad, ko tas malloc atgriezties?
Malloc atgriež adresi.
Tātad, kas notiek, lai saņemtu glabājas x?
Par rieciens adrese atmiņa, četri baiti, ka malloc
tikko konstatēja man, lūdzot operētājsistēma.
>> Tagad tikmēr, rinda četri šeit * x = 42.
Tikai, lai būtu skaidrs, Kas notiek tur lejā?
Uz kreisajā pusē, * x.
tas ir tāpat kā * 33 Oxford Street.
Tātad * x nozīmē ko?
>> AUDITORIJA: Izlase.
>> DAVID J. Malan: Iet uz šo adresi.
Ja šī rieciens atmiņa ir, iet uz to.
Un īstenot to, ko tur, protams?
AUDITORIJA: 42.
DAVID J. Malan: 42.
Nu labi, * y, pati ideja.
Iet uz adresi y.
Nodot skaits 13 tur, bet to, kas ir y šobrīd?
AUDITORIJA: Nav atmiņas par y.
DAVID J. Malan: Ir nav atmiņas par y.
Tātad, ko y nav iespējams satur, kā mēs esam teicis?
>> AUDITORIJA: Atkritumu.
>> DAVID J. Malan: Daži atkritumu vērtība.
Tagad, atkritumu vērtība joprojām ir vairāki.
Tas joprojām var sajaukt adresi.
Tas ir tā, it kā kāds ierakstījis kaut uz leju,
un es nepareizi interpretēt to tādā veidā, daži ēku pa ielu.
Un, ja jūs vienkārši mēģināt iedziļināties daži ēka jums nepieder,
vai kādu rieciens atmiņas jums nav bijusi dota, sliktas lietas var notikt.
Dators var crash, vai kādu citu nenoteikts uzvedība varētu notikt.
>> Tātad intro, tad, lai Binky tas ir.
Es joprojām atceros, 20 daži nepāra gadus vēlāk,
kur es biju, kad es beidzot saprot norādes.
>> Kas ir, ja jūs atstāt šeit trīs minūtēs
un domāju, ka man nav saprotu norādes, saprotam
Es atcerējos par 20 gadi kādu traku iemeslu dēļ
kad un kāpēc tas beidzot nogrimis jo, sēžot ar manu mācību
puisis, Nishat Mehta in atpakaļ Eliot ēdamzālē.
Tagad, es esmu atcerējos tas tāpēc, ka tas bija
viens no tēmas I, kas īpaši, cīnījās ar.
Un tad, tas beidzot uzklikšķināt, piemēram, es uzdrošinos teikt daudz tēmām
galu galā būs.
Un tagad, lai padarītu ka jūtas visu laimīgāki, un vēl jo vairāk pārliecinošs,
pieņemsim galīgo izskatu mūsu Pēdējās trīs minūtes šeit pie Binky,
no mūsu draugs, Nick Parlante no Stenfordas.
>> [Video atskaņošana]
>> Hei, Binky.
Mosties!
Ir pienācis laiks, lai šautriņu jautri.
>> -Ko Tas tāds?
Uzziniet par norādes?
Ak, našķis!
>> -Labi, Lai sāktu, es domāju, mēs esam būs nepieciešama pāris norādes.
>> -OK.
Šis kods piešķir divas norādes, kas var norādīt uz veseliem skaitļiem.
-OK.
Nu, es redzu divas norādes, bet viņi nešķiet, ka norādot uz kaut ko.
>> -Tas Ir taisnība.
Sākotnēji, norādes neliecina neko.
Lietas, viņi norāda uz sauc pointees, un to izveidošanas 's
atsevišķs solis.
>> -OH, Labi, labi.
Es zināju, ka.
Šie pointees ir atsevišķi.
Er, tā kā jūs piešķirt pointee?
>> -OK.
Nu, šo kodu piešķir jauna skaitlis pointee,
un Šajā daļā ir x, lai norādītu uz to.
>> Hei, kas izskatās labāk.
Lai padarītu to kaut ko darīt.
>> -OK.
Es ņemšu dereference rādītāja x līdz uzglabāt numuru 42 savā pointee.
Par šo triks, man nāksies manu Magic Wand of dereferencing.
>> -Jūsu Magic Wand of dereferencing?
That-- tas ir lieliski.
>> -Tas Ir tas kods izskatās.
Es ņemšu tikai izveidoja numuru un [POP]
>> Hei, izskatās.
Tur tas notiek.
>> -Tātad Darot dereference par x šādi bultiņa, lai piekļūtu savu pointee.
Šajā gadījumā, veikals 42 tur.
Hey mēģiniet izmantot to, lai saglabātu numuru 13 caur otru rādītāju, y.
>> -OK.
Es ņemšu tikai iet nekā šeit uz y, un saņemt numuru 13 iestatīšanu.
Un tad, ņem zizlis Dereferencing un tikai [BUZZ]
>> OH!
>> OH, hey!
Tas nestrādāja.
Saka, Binky, es nedomāju dereferencing y ir laba ideja, jo jūs zināt,
izveido pointee ir atsevišķs solis.
Un es nedomāju, ka mēs kādreiz darīja.
>> -Laba Punkts.
-Jā.
Mēs piešķirti rādītāja y, bet mēs nekad iestatīt tā, lai norādītu uz pointee.
>> -Ļoti Uzmanīgu.
Hei, jūs meklējat labi tur, Binky.
Vai jūs varat salabot, lai y punkti uz to pašu pointee kā x?
>> -Sure.
Es izmantot savu burvju nūjiņu no Pointer uzdevumu.
>> -Vai Ka būs problēma, piemēram, pirms?
-No.
Tas nav pieskarties pointees.
Tas tikai maina vienu rādītāju uz norāda uz vienu un to pašu, kā citu.
>> OH, es redzu.
Tagad y norāda uz to pašu vietu, kā x.
Tik jāgaida.
Tagad, y ir fiksēts.
Tā ir pointee.
Tātad jūs varat mēģināt zizlis Dereferencing vēlreiz, lai nosūtītu 13 pārvērtībām.
>> -Uh, OK.
Šeit tas pats. [POP]
>> Hei, apskatīt to.
Tagad dereferencing darbus y.
Un tāpēc, ka norādes tiek daloties ka viena pointee, viņi gan redzēt 13.
-Jā.
Sharing, neatkarīgi.
Tātad mēs gatavojamies, lai pārslēgtos vietām tagad?
>> Ak, izskatās.
Mēs esam ārpus laika.
>> -But--
>> -Just Atcerēties trīs bultiņu noteikumus.
Number One, pamatstruktūra ir tas, ka jums ir rādītājs,
un tas norāda vairāk nekā uz pointee.
Bet rādītājs un pointee ir atsevišķi,
un kopējā kļūda ir izveidot rādītāju,
bet aizmirst, lai dotu tai pointee.
>> Skaits Divi, rādītājs dereferencing sākas rādītāja
un seko tās bultiņas pār , lai piekļūtu savu pointee.
Kā mēs visi zinām, šis darbojas tikai tad, ja ir
pointee, kāda veida saņem atpakaļ ar Reglamenta Number One.
>> Numurs Trīs, rādītājs piešķiršana aizņem vienu rādītāju
un izmaiņas to norādīt uz pats pointee kā cits rādītājs.
Tātad, pēc uzdevuma, divas norādes
norādīs uz to pašu pointee.
Dažreiz, ka sauc dalīšana.
Un tas viss notiek ar to, tiešām.
Bye-bye tagad.
[END VIDEO PLAYBACK]
DAVID J. Malan: Tas ir tas CS50.
Mēs redzēsim tevi nākamnedēļ.