[Reproducció de música] DAVID J. Malan: Molt bé. [El] Benvingut de nou. Aquesta és CS50. I aquest cap de setmana 5. I fins ara, tenim més o menys estat prenent per fet que hi ha existeix aquest compilador, Clang, que has s'invoca a través d'aquest altra eina anomenada Fer que d'alguna manera màgicament converteix el codi font en codi objecte, els zeros i uns que la CPU del seu ordinador, al centre unitat de processament, en realitat entén. Però resulta que hi ha un nombre que és passant per sota de la campana a entre l'entrada i la sortida. I m'agradaria proposar que la carn que en una mica més detall en aquests quatre passos, tenen alguna cosa que es diu pre-processament, cosa diu compilar, el que hem vist, cosa que es diu el muntatge, i cosa que es diu enllaç. Així que fins ara, en alguns dels nostres programes, hem tingut aguda inclou. Més recentment, hem tingut alguns forta defineix les constants. Així que resulta que les coses que estan precedits pel símbol o el símbol de la lliura són pre-processador directives. Això és només una forma elegant de dir que és una línia de codi que en realitat convertit en alguna cosa més abans que el ordinador, fins i tot tractar de convertir la seva programa en zeros i uns. Per exemple, agut inclou estàndard I / O. H, pràcticament només vol dir anar per davant, agafa el contingut dels arxius stdio.h i enganxar allà. Així que no hi ha zeros i uns en aquest punt encara. No deixa de ser una substitució. I això es fa durant l'anomenada etapa de pre-processament, quan es realment executi Clang o específicament Fer en la majoria dels casos. Així que tot això ha estat succeint primer de forma automàtica fins al moment. Després ve l'etapa de compilació. Però hem estat molt simplificada compilació. Compilar un programa realment significa prendre d'una cosa així com C, el codi font que hem estat escrivint, sota a alguna cosa que es diu muntatge. El llenguatge assemblador és un nivell més baix llenguatge que, per sort, no ho farem tenen molta oportunitat d' escriure aquest semestre. Però és en el nivell més baix de la sentit que, literalment, començar a escriure sumar i restar i multiplicar i carregar de la memòria i guardar a la memòria, el instruccions molt bàsiques que un ordinador, sota de la caputxa, realment entén. Finalment, el muntatge deté idioma dels zeros i uns que hem estat descrivint fins ara. I en veritat, finalment, hi ha l'anomenat vinculació fase, que anem a veure en un moment, que combina els zeros i els uns amb els zeros i les altres persones abans que ha creat. Així que consideri aquest programa super simple. Va ser a partir de la setmana 1. Simplement va dir, Hello World, a la pantalla. Vam fer això a través d'Clang. O ens trobem que a través de Make que es va desenvolupar Clang. I emesa en el moment en què alguns zeros i uns. Però resulta que hi ha un pas intermedi. Si em vaig d'aquí - Ui, no ho va fer Vull veure-ho encara. Si em vaig d'aquí amb el meu aparell i obro hello.c, aquí és que el mateix programa. I el que faré en el meu terminal finestra d'aquí se me'n va a executar Clang en lloc de fer que automatitza els quatre els passos a seguir per a nosaltres. I jo faré soroll metàl · lic-S i llavors hello.c i escriviu. I em surt un missatge parpellejant una altra vegada, la qual cosa és bo. I ara en una finestra una mica més gran, Vaig a obrir gedit aquí. I vaig a obrir un arxiu que, Resulta que es diu hello.s aquest que conté llenguatge assemblador M'he referit abans. I això és el que s'anomena muntatge idioma, nivell força baix instruccions que el CPU Intel o el que és el que hi ha dins entén. I mov és per al moviment. La crida és per trucant, una funció molt baix nivell. sub és per restar. Així que quan vostè té una CPU en particular dins del seu equip, el que fa que sigui diferents, en comparació amb altres CPUs al mercat, és que les instruccions que entén i sovint l'eficient que és a dir, la rapidesa amb què és en l'execució d'alguns d'aquestes instruccions. Ara per obtenir més informació, pot prendre juntament CS61 tardor a la universitat. Però aquí tenim, per exemple, uns pocs identificadors que poguessin semblar familiar. hola.c és el nom del programa. . Text - no hi ha molt d'interès no en aquest moment, recordar que el text segment, a partir de dilluns, és on en memòria del programa de realitat acaba. Així que almenys vagament familiars allà. Aquí, per descomptat, és una menció de la nostra funció principal. Desplaçament cap avall, aquests es refereixen a les coses anomenats registres, molt petits trossos de memòria dins de la CPU real. I si em desplaço cap avall fins encara més, veig una mena menció indirecta d'ASCII. I, de fet, és aquesta cadena, hola, coma, món. Així que conte llarg, això ha estat passant per vostè, de forma automàtica, sota de la caputxa de tot aquest temps. I el que està succeint realment és, un cop se li han acabat Clang, o per mitjà de Fa, vostè està rebent en primer lloc, a partir del codi font, la cridats en llenguatge assemblador. Llavors Clang és convertir aquest conjunt llengua a zeros i uns. I aquesta és la diapositiva que vam començar nostra discussió en la setmana 0 a - i a continuació, a la Setmana 1. I, finalment, els zeros i uns es combinen amb els zeros i uns d'aquelles biblioteques que hem estat prenent per fet, com E / S estàndard o el Biblioteca cordes o fins i tot la biblioteca CS50. Així que per pintar aquest quadre més visualment, tenim hello.c. I, per descomptat, utilitza el printf funcionar per dir hola món. El pas de compilació presa fins aquest arxiu només vam veure hello.s, fins i tot però, que està suprimit típicament automàticament. Però aquest és el codi de l'assemblea en el pas intermedi. I després, quan ens vam reunir el conjunt llenguatge, per així dir-ho, que és quan es aconseguir aquests zeros i uns. Per això hem acostat efectivament avui el que hem donat per fet, significa anar codi font codi objecte. Però, finalment, ara que mateix quadre - anem a ficar-ho a la banda esquerra. I tingui en compte que en la part superior hi ha Vaig esmentar stdio.h. És un arxiu que hem inclòs en gairebé tots els programes que hem escrit. I això és l'arxiu el contingut obtenir còpia enganxada, efectivament dalt del seu codi. Però resulta que, en un ordinador sistema en algun lloc, hi ha probablement una arxiu stdio.c que algú va escriure anys Fa que implementa tota la funcions que van ser declarades a stdio.h. Ara, en realitat, no és probable que el el seu Mac o el PC o fins i tot al CS50 aparell és un codi C cru. Algú ja ho va recopilar i va incloure . O arxiu de codi objecte o. Un arxiu, que és una biblioteca compartida que ha estat pre-instal lat i pre-compilat per a vostè. Però suposem que efectivament hi ha al nostre stdio.c ordinador en paral · lel amb Clang. El seu codi està sent compilat i muntats. Codi stdio.c 's s'està recopilant i acoblat, de manera que aquest últim pas, aquí, hem de d'alguna manera enllaç, per així dir-ho, els seus zeros i uns amb els seus zeros i uns en un senzill programa que en última instància és anomenat simplement Hola. Així que això és tota la màgia que és vingut succeint fins ara. I seguirà prenent aquests processos per fet, però s'adonen hi ha un munt de detalls sucosos passant per sota allà. I això és el que fa que la seva ordinador amb Intel a l'interior particularment diferent. Així que en aquest sentit, si es desitja uneix-t'hi per dinar el divendres, no anar al lloc habitual cs50.net/rsvp, 13:15 aquest divendres. I ara alguns anuncis. Llavors tenim bones notícies. I tenim una mala notícia. Comenceu amb una bona notícia aquí. [Gemec] Està bé. Bé, tècnicament és un dia de festa, per la qual cosa no és tant un regal de nosaltres. Però la mala notícia, és clar. [Gemec] Em vaig passar un munt de temps en les animacions. [El] Hi haurà una sessió de revisió dilluns que ve. Serà a les 5:30 AM. Li recorden tots aquests detalls per correu electrònic en el camp de lloc web en tan sols un parell de dies. Serà filmat i posat a disposició poc després. Així que si vostè no pot fer que dilluns ranura per a la nit, no et preocupis. Seccions setmana que ve també centrar-se en la revisió de la prova. Si la secció és dilluns, que és efectivament vacances universitàries, ho farem sense deixar de complir en la secció. Si vostè simplement no pot fer que secció perquè et vas de distància, està bé. Assistir a una secció dimarts o diumenge o posada a punt a la secció de Jason, és que disponible en línia. Per tant, més males notícies. Així que d'acord amb el pla d'estudis, tenim conferència el proper divendres. Però la bona notícia - clarament, vaig passar molt de temps en això. [El] Nosaltres cancel · larem pròxima conferències de divendres. Així que serà un regal per a nosaltres, per la qual cosa realment pot tenir un respir en entre aquesta setmana i dues setmanes aquí. Així que no hi ha classes la setmana que ve, només una petita petit qüestionari, per la qual cosa cal sent cada vegada més excitat. Així que ara anem a centrar l'atenció en cosa que és de fet més visual i més emocionant i per establir les bases per al que va a estar a l'horitzó en només un parell de setmanes. Després de la primera prova, anem a convertir el l'enfocament dels nostres butlletins de problemes a un altre problema específic de domini, que d' forense o la seguretat en general. De fet, la tradició amb aquest problema joc és per a mi un dels l'ensenyament de companys o CA de creuar campus de prendre algunes fotografies de identificables, però no persones òbvies, llocs o coses, i després cada any que arreglen per eliminar accidentalment o danyar la targeta de mitjans digitals que està dins de la nostra càmera. Però no és gran cosa. Puc seguir endavant i connectar que en el meu ordinador. Jo puc fer una imatge forense de la mateixa, pel que a parlar, copiant els zeros i els fora de que la targeta de memòria, ja sigui és una targeta SD o targeta de memòria flash compacta o el que vostè està familiaritzat. I després podem lliurar això. I així, el repte per davant, entre d'altres coses per a tu, seran per a escriure Codi C que recupera un munt de JPEG per a mi i revelades seran aquestes persones, llocs o coses. I també parlarem, en aquest problema establert i en els dies per venir, més gràfics en general. Nosaltres els hem utilitzat, un curs, per sortir. Però vostè ha pres una espècie de per fet hi ha aquestes nocions d'alt nivell de rectangles i ovals. Però sota de la caputxa hi ha píxels. I han hagut de començar pensar en ells. O vostè per p-set 4, que pensar per la diferència entre les rajoles, com ràpidament que estiguis bola es mou a través de la pantalla d'esclatar. Així que hi ha aquesta noció de la punts a la pantalla que és entrar en joc ja. Ara el que es veu, però, és el que s'obté en una pantalla d'ordinador. Si alguna vegada has vist algun bé o mala televisió, les probabilitats són que pràcticament tractar al públic com tecnòfobs que realment no saber molt sobre la computació. I el que és molt fàcil per a la policia detectiu que dir, oi netejar això per a mi? O millorar, no? Millorar és com la paraula de moda a la majoria de qualsevol programa relacionat amb la delinqüència. I la realitat és que si vostè pren un imatge borrosa d'un sospitós fent una cosa dolenta, no es pot simplement millorar-la. No es pot ampliar fins a l'infinit. No es pot veure en el reflex d'algú ull que va cometre que delicte en particular, tot i la prevalença d'aquesta a la televisió. I així, amb que anem a motivar que proper problema conjunt amb una visió a alguns programes amb els quals podria ser familiar. [REPRODUIR VIDEO] -OK. Ara, anem a obtenir un bon cop d'ull. -Un moment. Executar dit. -Espera un minut. Anar a la dreta. -No. Congelar això. Pantalla completa. -OK. Congelar això. -Estrènyer en això, vols? -Vector en aquest tipus per la roda del darrere. -Apropar aquí en aquest lloc. -Amb l'equip adequat, la imatge formada pot ser ampliat i aguditzat. -Què és això? -Es tracta d'un programa de millora. -Pot vostè aclarir això alguna cosa? -No ho sé. Anem a millorar-lo. Secció A-6-Millorar. -He millorat el detall i - -Crec que és suficient per millorar. Deixeu anar a la meva pantalla. -Potenciar la reflexió en el seu ull. -Anem a córrer a través d'aquest millora de vídeo. -Edgar, pot millorar això? -Espera. -He estat treballant en aquesta reflexió. -Algú de reflexió. -Reflexió. -Hi ha una reflexió de la cara de l'home. -El reflex. -Hi ha una reflexió. -Faci zoom al mirall. -Es pot veure un reflex. -Es pot millorar la imatge d'aquí? -Pot vostè millorar aquí? -Pots millorar? -Pots millorar? -Podem millorar això? -Pots millorar? -Espera un segon, vaig a millorar. -Acosta't a la porta. -X10. -Zoom. [El] -Entrar a viure -Espera, atura't. -Atura. -Una pausa. -Gireu a 75 graus al voltant per favor la vertical. [El] -Stop, i de nou a la part sobre la porta de nou. -Tinc una imatge potenciador que poden bitmap? -Potser puguem usar la Pradeep Sen mètode per veure a les finestres. -Aquest programari és l'estat de la tècnica. -El valor d'icona està apagat. -Amb la combinació correcta d'algoritmes. -Ha pres algorismes d'il · luminació per al següent nivell i que poden utilitzar-los per millorar aquesta fotografia. -Bloqueig d'encesa i ampliar l'eix z. -Millorar. -Millorar. -Millorar. -Congelar i millorar. [FI REPRODUCCIÓ DE VÍDEO] DAVID J. Malan: So setembre Problema 5 és el que ens espera allà. Així que aviat tindrem una millor comprensió de quan i per què pot i la nostra no es pot millorar d'aquesta manera. Però primer, anem a tornar la nostra atenció a alguns dels components bàsics que anem a ha de ser capaç d'explicar aquesta història. Així recordem que vam treure aquesta foto a Dilluns i una mica la setmana passada. I això descriu la disposició de les coses en la memòria de l'equip quan l'execució d'alguns programes. El segment de tecnologia al capdamunt, el record, es refereix als zeros reals i uns que componen el programa. Hi ha, per sota d'això, alguns inicialitzat o dades sense inicialitzar, que normalment es refereix a coses com constants o cadenes o variables globals que tenen estat declarat per endavant. Aquí està el munt, però anem a venir tornar a això en un moment. I després hi ha la pila. Igual que una pila de safates al cafeteria, aquí és on la memòria es capes i capes cada vegada fas el que en un programa? Quin és l'ús de la pila per? Sí? Truqui a la funció. Cada vegada que es crida a una funció, és donat estella de memòria per a la seva variables locals o dels seus paràmetres. I gràficament, veiem que amb cada funció successiva cridés, quan un trucades B C trucades trucades D, que aconseguir capes en la pila. I dins de cadascuna d'aquestes porcions de la memòria és essencialment un únic àmbit per a aquesta funció, la qual, per descomptat, és problemàtic si es vol lliurar d'una funció a una altra Una peça de dades que voleu que per mutar o canviar. Aleshores, quina va ser la nostra solució per a permetre Una funció representada per una pila emmarcar canviar la memòria en l'interior d'un altre marc de pila? Com funcionen els dos parlen l'un a l'altre? Així que a través de punters o adreces, que, de nou, simplement descriure en què la memòria, per mitjà d'una específica nombre mos, el particular valor pot ser trobat. Així recordar l'última vegada també hem continuat la història i va mirar a un bastant programa defectuós. I aquest programa està lliure d'errors per a uns pocs raons, però la més preocupant és perquè no pot comprovar què? Sí, no marqui l'entrada. Com? Si es tracta de més de 12 caràcters. Així que molt intel · ligentment, al trucar memcopy, que, com el seu nom indica, només memòria de còpies del seu segon argument en el seu primer argument. El tercer argument, molt intel · ligentment, és revisat per assegurar-se que vostè no ho fa copiar més de, en aquest cas, la longitud de barres, nombre de caràcters, en la destinació, que és el array C. Però el problema és que el que si el mateix C no és prou gran per gestionar això? Vostè va a copiar el nombre de bytes que s'han donat. Però, ¿què és el que realment té més bytes que té espai per? Doncs bé, aquest programa molt tontament just cegament procedeix a prendre el que és dóna, hola barra invertida és 0 genial si la cadena és curta suficient, com cinc caràcters. Però si en realitat és 12 caràcters o 1200 caràcters, ens vam veure l'última vegada que només anem a per complet sobreescriure la memòria que no li pertany a vostè. I pitjor dels casos, si es sobreescriu que porció vermella motiu cridem a la remet - això és només a l'ordinador automàticament, per a tu, darrere de la escenes, plecs de distància un valor de 32 bits que li recorda al que la direcció hauria tornar quan foo, aquesta altra funció, es porta a terme l'execució. És una molla de pa del tipus a la qual es retorna. Si sobreescriu que, potencialment, si vostè és el dolent de la pel · lícula, pot va poder potencialment prendre el control ordinador d'algú. I el més segur estavellar en la majoria dels casos. Ara bé, aquest problema només es va agreujar com vam començar a parlar de la memòria gestió en general. I malloc, per a l'assignació de memòria, és un funció que es pot utilitzar per assignar memòria quan no sabem per endavant que puguem necessitar. Així, per exemple, si torno per l'aparell aquí. I obro l'última vegada hello2.c, recordar aquest programa aquí, que semblava una mica d'alguna cosa com això, només tres línies - dir el seu nom, i després nom de la cadena, a l'esquerra, és igual a getString. I després imprimir-lo, el nom de l'usuari. Així que aquest era un programa super simple. Perquè quedi clar, deixa anar per davant i fer hola-2. Jo faré punt slash hola-2. Digui el seu nom - David. Intro. Hola David. Sembla que funciona bé. Però el que realment està passant sota la campana en aquesta llista? En primer lloc anem a pelar algunes capes. String és simplement un sinònim hem adonat de què? Estrelles Char. Així que farem una mica més complexes però tècnicament més correcta que aquesta és un estel char, el que significa que nom, sí, és una variable. Però el que les botigues de noms és la direcció del un char, que se sent una mica estrany perquè m'estic tornant una cadena. Estic tornant múltiples caràcters no un char. Però, per descomptat, només cal la primera Direcció de caràcters recordar que el cadena sencera és perquè ¿per què? Com es pot esbrinar on és el final de la cadena és saber el principi? El zero barra invertida. Així que amb aquests dos pistes d'esbrinar abans que el començament i el final de qualsevol cadena són, sempre que estiguin format adequadament amb què nul terminador, que el zero barra invertida. Però això està trucant getString. I resulta que getString tot aquest temps ha estat una mena de trampa per a nosaltres. S'ha estat fent aquesta feina, sens dubte, Obtenció d'una cadena des de l'usuari. Però on és la memòria es ve? Si ens remuntem a la imatge aquí i aplicar la definició de només un Fa moment, que la pila és on memòria quan se'ls crida funcions, Amb aquesta lògica, quan es diu a getString, i després escric en D-A-V-I-D Enter, on és D-A-V-I-D emmagatzema barra invertida zero, sobre la base de la història que nosaltres hem dit fins aquí? Sembla estar en la pila, no? Quan es diu a tenir cadena s'obté una petita porció de la memòria a la pila. Així que és lògic pensar que la D-A-V-I-D s'emmagatzema barra invertida zero hi ha a la pila. Però espereu un minut, getString retorns aquesta cadena, per així dir-ho, el que significa que és la safata de la cafeteria es pren de la pila. I vam dir l'última vegada que tan aviat com retorna la funció, i prendre aquest safata, per així dir-ho, de la pila, el es pot assumir sobre les restes d' que la memòria? Que tipus d'ells va tornar a dibuixar com a signes d'interrogació perquè es converteixen efectivament valors desconeguts. Ells poden ser reutilitzats quan alguns següent funció es diu. En altres paraules, si ens toca a emmagatzemar - Vaig a dibuixar una imatge ràpida aquí de la pila. Si arribem a ser el dibuix de la part inferior de la meva segment de memòria, i ho direm que aquest és el lloc de memòria ocupat per principal i potser arg ci arg v i qualsevol altra cosa en el programa, quan getString es diu, presumiblement getString es un tros de memòria aquí. I llavors D-A-V-I-D d'alguna manera acaba a aquesta funció. I jo vaig a simplificar en excés. Però anem a suposar que la seva D-A-V-I-D barra invertida zero. Així que aquesta quantitat de bytes s'utilitzen en el marc de getString. Però tan aviat com torna GetString, que va dir l'última vegada que aquesta memòria sobre aquí tot es fa - woops - tot es torna efectivament esborrats. I podem pensar en això ara com a qüestió marques, ja que se sap el que passarà amb aquest record. De fet, molt sovint criden a funcions que no sigui getString. I tan aviat com ho dic una altra funció que getString, potser no en Aquest programa en particular que acabem de veure però en l'altre, sens dubte alguna altra funció podria arribar a ser donada aquest espot següent a la pila. Per tant, no pot ser que les botigues getString D-A-V-I-D a la pila, perquè ho faria perdrà immediatament l'accés a la mateixa. Però sabem que getString només torna el que? No és tornar a Em sis caràcters. Què està realment tornant què arribem a la conclusió última vegada? La direcció de la primera. Així que d'alguna manera, quan vas getString, que és l'assignació d'una part de la memòria per la cadena que el tipus i els usuaris direcció i després tornar de la mateixa. I resulta que quan es vol funcionar per assignar memòria en aquest camí i tornar a la persona que truca aquesta funció, la direcció de que parteix de la memòria, malgrat tot no pot posar a la pila al inferior, ja que funcionalment és només No serà seu molt ràpidament, el que probablement pot endevinar on probablement tirarem en canvi, l'anomenada munt. Així que entre la part inferior de la memòria de disseny i la part superior de la memòria de disseny són un munt de segments. Una d'elles és la pila, i la dreta per sobre d'ella és el munt. I heap és només un tros diferent de memòria que no s'utilitza per a les funcions de quan se'ls crida. S'utilitza per a la memòria de llarg termini, quan desitja una funció que aconsegueixin unes memòria i ser capaç d'aferrar a ella sense perdre el control. Ara vostè podria potser immediatament veure que això no és necessàriament un disseny perfecte. A mesura que el programa assigna memòria en la pila, o com es diu cada vegada més funcions, o com es pot assignar memòria en el munt amb malloc apagat com getString està fent, el que clarament sembla inevitable problema? Dreta. Igual que el fet que aquestes fletxes estan un davant l'altre no presagia res de bo. I, de fet, podríem fallar molt ràpidament un programa en qualsevol nombre de maneres. De fet, crec que podríem tenir un cop fet això accidentalment. O si no, ho farem deliberadament ara. Deixin-me seguir endavant i escriure súper ràpid un programa anomenat dontdothis.c. I ara vaig a anar aquí i Què aguda inclouen stdio.h. Anem a declarar la funció foo presa Sense arguments, que és denotat també per buit. I l'única foo va a fer és anomenada foo, que probablement no és el molt intel · ligent, però que així sigui. Ent void main. Ara l'única cosa principal que va de fer és trucar a foo també. I, només per diversió, em vaig a anar per davant aquí i dir printf "Hola des foo ". D'acord. Així que si jo no he comès cap error, Feu dontdothis dot slash. I ho farem en una finestra més gran - dot slash, dontdothis. Anem. Uh oh. Pel que sembla, vostè pot fer això. Maledicció. D'acord. Esperi. En espera. Hem - Nosaltres el fem servir amb Make. [Sospira] Ja ho sé, però crec que que acaba d'eliminar. Uh, sí. Maledicció. Resolgui aquest Rob. Què? És molt simple. Sí, ens vam tornar optimització off. Acceptar, estand adéu. Ara em sento millor. D'acord. Està bé. Així que anem a tornar a compilar això - Fer-te dontdothis. Podria ser necessari canviar el nom d'aquest a dothis.c en un moment. Això és. Gràcies. D'acord. Així que el fet que estava imprimint alguna cosa era en realitat només alentir el procés pel qual hauria arribat a aquest punt. D'acord. Phew! Així que el que realment està passant? La raó que, com un part, és fer res en termes d'entrada de sortida tendeix a ser més lent perquè d'escriure caràcters a l' pantalla, ha de desplaçar-se. Així que conte llarg, vaig haver en realitat Va succeir tan impacient, tindríem vist el resultat final també. Ara que tinc passeig de la impressió de nova creació, veiem de seguida. Per què està succeint això. Bé, l'explicació simple, per descomptat, foo és que probablement no hauria es fa dir. Ara bé, en termes generals, aquesta és la recursió. I pensem que un parell de setmanes Fa recursiva és bo. La recursivitat és la forma màgica de expressar súper succinta. I simplement funciona. Però hi ha una característica clau de tots els programes recursius que hem parlat i mirant al lluny, que era que havien de? Un cas base, que era una mica dur codificat cas que dit en algunes situacions no cridi foo, que és clarament no és el cas aquí. Així que el que realment està succeint en termes d'aquesta imatge? Bé, quan Main diu foo, que aconsegueix un tros de memòria. Quan es crida a foo foo, es posa una porció de la memòria. Quan es crida a foo foo, es posa una llesca. Es posa una llesca. Es posa una llesca. A causa foo mai torna. Mai estem esborrant un dels marcs de la pila. Així que estem bufant a través de la pila, no parlar de qui sap què més, i estem sobrepassant els límits de la nostra així anomenat segment de la memòria. Error anar segmentació falsa. Per tant la solució no és clarament, no ho facis. Però la implicació més gran és que, sí, no és absolutament cert límit, encara que no està ben definida, quant a com moltes de les funcions que pot trucar en un programa, quantes vegades una funció pot cridar-se a si mateix. Així que, encara que ho vam fer predicar recursivitat com aquesta cosa màgica potencialment 01:00 parell de setmanes per a la sigma funció, i quan tinguem les dades d' estructures i CS50, veuràs una altra aplicacions per a ell, no és necessàriament el millor. Perquè si una funció es diu a si mateix, diu a si mateix, fins i tot si no hi ha una base de cas, si no aconsegueixes que el cas base de 1.000 trucades o 10.000 trucades, per llavors és possible que hagi quedat sense espai en l'anomenada pila i prem altres segments de la memòria. Per tant, també és un disseny de trade-off entre l'elegància i entre solidesa de la seva especial aplicació. Així que hi ha un altre inconvenient o altra Gotcha al que hem estat fent fins ara. Quan vaig trucar a getString - m'ho dius a mi tornar a hola-2. Tingueu en compte que estic trucant getString, que està tornant una adreça. I diem avui que la direcció de és del munt. I ara estic imprimint el cadena en aquesta direcció. Però mai hem cridat l' oposat de getString. Mai hem tingut a calll una funció com ungetstring, on la mà de nou aquest record. Però, francament, és probable que hauria d'haver estat. Perquè si seguim demanant a l'equip per a la memòria, a través d'algú com getString però mai tornar, segurament que també està obligat a dur a problemes amb el que ens vam quedar sense memòria. I, de fet, podem mirar per a aquests problemes amb la nova eina l'ús és una mica críptic per escriure. Però m'ho dius anar per davant i esquitxades cap amunt a la pantalla en un moment. Vaig a seguir endavant i executar Valgrind amb el paràmetre el primer comandament argument de la línia és el nom d'aquest programa hola-2. I lamentablement és sortida és atroçment complexa sense una bona raó. Així que veiem tot aquest embolic. David és l'estat del meu nom. Així que aquest és el programa actualment en funcionament. I ara tenim aquest producte. Així Valgrind és similar en esperit a GDB. No és un depurador per se. Però és un comprovador de memòria. És un programa que executarà el programar i li dirà si li preguntes a un equip per a la memòria i mai hi va lliurar enrere, el sentit del que vostè té una pèrdua de memòria. I les pèrdues de memòria tendeixen a ser dolent. I és que els usuaris d'ordinadors tenen Probablement aquest sentit, si té una Mac o un PC. Alguna vegada ha utilitzat l'equip per temps i no reiniciat en diverses dia, o només tens una gran quantitat de programes en execució, i la cosa maleïda retarda a un punt mort, o almenys és super molest d'utilitzar, ja que tot acaba molt lent. Ara que pot haver-hi qualsevol nombre de raons. Podria ser un bucle infinit, un error en Codi d'algú, o, més simplement, que podria significar que vostè està utilitzant més memòria, o tractant, de la seva equip té en realitat. I potser hi ha un error en algun programa que mantenen demanant memòria. Navegadors d'anys eren coneguts per això, demanant més i més memòria però mai va tornar. Segurament, si només té un nombre finit quantitat de memòria, no es pot demanar infinitament moltes vegades per alguns que la memòria. I així, el que es veu aquí, tot i que una altra vegada la sortida de Valgrind és innecessàriament complex per fer una ullada a en primer lloc, aquesta és la part interessant. Heap - en ús a la sortida. Així que aquí està la quantitat de memòria es en ús en el munt al vegada que el meu programa va sortir - pel que sembla 6:00 bytes en un bloc. Així que em vaig a moure les mans al que un bloc és. Pensa que és només una part, una major paraula tècnica per al fragment. Però sis bytes - ¿Quins són els sis bytes que encara estaven en ús? Exactament. D-A-V-I-D barra invertida zero, 05:00 lletres nom, més el terminador nul. Així que aquest programa valgrind adonar que jo demanar sis bytes, segons sembla, per manera de getString, però mai els va donar l'esquena. I de fet, això podria no ser tan obvi si el meu programa no és de tres línies, però és 300 línies. Així que en realitat podem donar un altre comandament argument de la línia d'Valgrind per fer-lo més detallat. És una mica molest per recordar. Però si ho faig - anem a veure. Fuga - Va ser fuites - encara que no em acord el que està fora de la mà. - Fugida de verificació és igual completa. Sí, gràcies. - Fugida de verificació és igual completa. Intro. El mateix programa s'està executant. Escriviu a David un cop més. Ara veig una mica més de detall. Però a continuació el resum munt, la qual és idèntica a quatre - ah, això és una mica agradable. Ara Valgrind és en realitat la recerca una mica més difícil en el meu codi. I està dient que, segons sembla, malloc en línia - que allunyar. En la línia - no veiem quina línia és. Però malloc és el primer culpable. Hi ha un bloc en malloc. D'acord? Bé, no. Cert? Vaig trucar GetString. getString aparentment crida malloc. Llavors, ¿quina línia de codi és aparentment la culpa de tenir assignat aquesta memòria? Anem a suposar que qui va escriure malloc ha existit el temps suficient com perquè sigui no és culpa seva. Així que és probable que la meva. GetString en cs50.c - pel que és una presentar en algun lloc de l'ordinador - en la línia 286 sembla ser el culpable. Ara anem a suposar que CS50 ha estat voltant per bona quantitat de temps, pel que nosaltres també som infal · libles. I el que no és probable que en getString que l'error es troba, sinó més aviat en line hola-2.c 18. Així que donem una ullada a el que era la línia 18. Oh. D'alguna manera aquesta línia no és necessàriament amb errors, per se, sinó que és la raó darrere d'aquesta pèrdua de memòria. Així súper senzilla, el que faria intuïtiva ser la solució a aquest problema? Si estem demanant memòria, mai van ser donant-li l'esquena, i que sembla ser un problema, ja que amb el temps el meu equip podria quedar-se sense memòria, podria endarrerir baix, les coses dolentes poden passar, així, Quina és la solució simple i intuïtiva? Només has de donar volta. Com es pot alliberar aquesta memòria? Bé, per sort és molt senzill a dir el nom gratuïta. I mai hem fet això abans. Però es pot pensar essencialment en lliure com l'oposat de malloc. lliure és l'oposat a la l'assignació de memòria. Ara m'ho dius a compilar això. Feu hola-2. Déjame córrer de nou. hola-2 David. Així que sembla que funciona a exactament de la mateixa manera. Però si torno a Valgrind i tornar a executar mateix comando que en el meu recent programa compilat, mecanografia en el meu nom com abans - Niça. Resum Heap - en ús a la sortida - zero bytes en blocs de zero. I això és molt agradable, tot van ser alliberats blocs de la pila. No hi ha fuites són possibles. Així que ve, no amb Problemes de 4, però amb Set Problema 5, els forenses i cap endavant, això també es convertirà en un mesura de l'exactitud de la seva programa, ja sigui que tingui o no o no tenen pèrdues de memòria. Però, per sort, no només es pot raonar a través d'ells intuïtivament, que és, sens dubte, fàcil per a petits programes però és més difícil per als programes més grans, Valgrind, per als programes de major envergadura, pot ajudar a identificar el problema particular. Però hi ha un altre problema que pugui sorgir. Permetin-me obrir aquest arxiu aquí, que és, de nou, un exemple senzill. Però ens centrarem en el que aquest programa fa. Això es diu memory.c. Anem a publicar més tard avui al zip del codi font actual. I noti que tinc una funció anomenada f que no pren arguments i retorna res. En la línia 20, que estic pel que sembla es declara una punter a un int i dir que és x. Estic assignant és el retorn valor de malloc. I per ser clars, quants bytes am Probablement tornar a malloc en aquesta situació? Probablement 40. D'on vas treure això? Bé, si vostè recorda que un int és sovint 4 bytes, almenys és al aparell, 10 vegades 4 és òbviament 40. Així que malloc torna una adreça d' un tros de memòria i emmagatzematge que abordar en última instància en x. Així que per ser clars, el que llavors està succeint? Bé, deixa canvia de nou a la nostra imatge aquí. No em deixis sol dibuixar el fons del meu la memòria de l'ordinador, em va deixar anar endavant i dibuixar tot el rectangle que representa tota la meva RAM. Anem a dir que la pila està a la part inferior. I hi ha un segment de text en les dades sense inicialitzar. Però jo només vaig a abstreure els altres coses distants com dot, dot dot. Jo només faré referència a aquest com la pila a la part superior. I a continuació, a la part inferior d'aquesta imatge, per representar principal, em vaig per donar-li una memòria llesques a la pila. Per f, vaig a donar-li una llesca de memòria a la pila. Ara, he de consultar amb el meu codi de nou origen. Quines són les variables locals per al principal? Aparentment res, així que tall és efectivament buit o ni tan sols tan gran com he dibuixat. Però en f, tinc una variable local, que es diu x. Així que seguiré endavant i donar f una part de la memòria, que va qualificar de x. I ara malloc de 10 vegades 4, Així malloc 40, on és el memòria ve? No hem fet un dibuix com això abans. Però anem a suposar que és efectivament que ve d'aquí, així que un, dos, tres, quatre, cinc. I ara he de 40 d'aquests. Així que vaig a fer punt, punt, punt de suggerir que fins i tot hi ha més memòria al tornar de la pila. Ara, quina és l'adreça? Anem a triar el nostre arbitrària abordar com sempre - Ox123, tot i que probablement va ser alguna cosa completament diferent. Aquesta és l'adreça del primer byte de recordo que m'estic preguntant per malloc. Així que en resum la línia, un cop 20 realitza, el que és, literalment, emmagatzemat a l'interior de x aquí? Ox123. Ox123. I el bou no és interessant. Només vol dir que aquí hi ha un nombre hexadecimal. Però el fonamental és que el que he botiga en x, que és una variable local. Però el seu tipus de dades, de nou, és una direcció d'un int. Bé, vaig a guardar Ox123. Però, de nou, si això és una mica massa complicat innecessàriament, si em desplaço cap enrere, podem abstreure aquesta molt lluny raonable i just dir que x és un punter a aquest tros de memòria. D'acord. Ara la pregunta que ens ocupa és el següent - línia 21, resulta que està lliure d'errors. Per què? Com? No té per què - dir que una vegada més. Bé, no ho fa gratis. Així que aquest és el segon mes. Així que hi ha una altra, però específicament en la línia 21. Exactament. Aquesta simple línia de codi és només una desbordament de memòria intermèdia, una saturació de la memòria intermèdia. Un buffer només significa una part de la memòria. Però aquest tros de memòria és de grandària 10, 10 nombres enters, el que significa que si tenim índex en ell amb el sucre sintàctic de la notació de matriu, la plaça suports, vostè té accés a x 0 x suport de suport 1 x, suport de punt, punt, punt. x suport 9 és el més gran. Així que si ho faig x suport 10, on De fet vaig a la memòria? Bé, si tinc 10 int - anem realment atreure a tots d'ells aquí. Així que aquesta va ser la primera de cinc. Aquí hi ha els altres cinc sencers. Així que x 0 és el suport aquí. x suport 1 és aquí. x suport 9 està aquí. x suport 10 està aquí, el que significa que estic dient, en la línia 21, l'equip per posar el nombre d'on? El nombre 0 on? Bé, és 0, si. Però el fet que el 0 és una espècie de coincidència. Podria ser el número 50, per a tots els que ens importa. Però estem tractant de posar-ho en x suport 10, que és on aquesta signe d'interrogació es dibuixa, que No és una bona cosa. Aquest programa podria molt bé accident com a resultat. Ara, seguirem endavant i veure si això És, de fet, el que succeeix. Feu memòria, ja que l'arxiu es diu memory.c. Seguirem endavant i executar la memòria de programa. Així que vam tenir sort, en realitat, el que sembla. Vam tenir sort. Però anem a veure si ara correm Valgrind. A primera vista, el meu programa podria semblen ser perfectament correcta. Però m'ho dius córrer Valgrind amb el - Fugida de verificació és igual completa a la memòria. I ara, quan em trobo això - interessant. Invalid escriure de mida 4 a la línia 21 de memory.c. Línia 21 de memory.c és quin? Oh, interessant. Però esperi. Mida 4, quin és el que es refereix a? Jo només tenia una escric, però és de mida 4. Per què és 4? És perquè és un int, que és, de nou, quatre bytes. Així Valgrind trobat un error que jo, fer una ullada al meu codi, no ho va fer. I potser la seva TF faria o no faria. Què Però Valgrind amb seguretat va trobar que que hem comès un error allà, fins i tot encara que vam tenir sort, i l'ordinador decidir, eh, jo no vaig a xocar només perquè vostè va tocar un byte, un el valor de la memòria d'int que no ho va fer realitat pròpia. Bé, què més hi ha errors aquí. Direcció - es tracta d'una adreça de mirada boig en hexadecimal. Això només vol dir que en el munt de lloc és zero bytes després d'un bloc de mida 40 s'assigna. Permetin-me Allunyar aquí i veure si això és una mica més útil. Interessant. 40 bytes estan definitivament perduts en el registre de la pèrdua de gener 1. Una vegada més, més paraules que és útil aquí. Però en base a les línies ressaltades, on hauria probablement centrar la meva atenció per a un altre bug? Sembla que una línia 20 de memory.c. Així que si ens remuntem a la línia 20, que és el un que va identificar anteriorment. I no és necessàriament erroni. Però hem invertit aquest els seus efectes. Llavors, com puc corregir almenys un d'aquests errors? Què podia fer jo després de la línia 21? Que podia fer sense x, per la qual cosa de retornar la memòria. I com puc solucionar aquest error? Sens dubte hauria d'anar no més de 0. Així que vaig a tractar i tornar a fer aquest. Ho sentim, però sens dubte no més de 9. Fer memòria. Permetin-me tornar a executar Valgrind en una finestra més gran. I ara mira. Niça. Van ser alliberats tots els blocs de la pila. No hi ha fuites són possibles. I per sobre d'aquí, no hi ha cap menció més de la dreta no vàlid. Només per aconseguir cobdiciós, i anem a veure si una altra demostració no va com estava previst - Jo vaig tenir la sort fa un moment. I el fet que aquest és 0 és potser innecessàriament enganyosa. Farem 50 anys, una mica arbitrària nombre, marca de memòria slash dot memòria - encara tingui sort. Res estavellar-se. Suposem que jo acabo de fer alguna cosa realment ximple, i ho faig 100. Permeteu-me refer la memòria, dot barra de memòria - vam tenir sort de nou. Què hi ha de 1000? ints més enllà, més o menys, on hauria d'estar? Fer memòria - maleïda sigui. [El] D'acord. No perdrem el temps ja. Torneu a executar la memòria. Això és. Està bé. Així que pel que sembla s'indexa 100.000 ints més enllà d'on hauria d'haver estat en memòria, succeeixen coses dolentes. Així que això no és, òbviament, una regla dur ràpid. Jo era una mena d'assaig amb i error per arribar-hi. Però això es deu al fet que, el conte llarg, memòria de l'equip també es divideix en aquestes coses diuen segments. I a vegades, l'equip realment que ha donat una mica més de memòria del que demanes. No obstant això, per a l'eficiència, és simplement més fàcil obtenir més memòria, però només diré que vostè està rebent una part. I si tens sort, de vegades, Per tant, vostè podria ser capaç de tocar memòria que no li pertany a vostè. No té cap garantia que el que el valor que va posar en el seu lloc es quedarà allà, perquè l'equip encara pensa que no és seu, però que no va necessàriament per colpejar a un altre segment de la memòria en la equip i induir un error com aquest d'aquí. Està bé. Qualsevol pregunta, llavors en la memòria? Està bé. Anem a fer una ullada aquí, llavors, en cosa que hem estat donant per concedida des de fa força temps, el que es troba a l'arxiu anomenat cs50.h. Així que aquest és un arxiu. Aquests són només un grapat sencer dels comentaris amunt. I és possible que hagi vist en aquest cas que va furgar en l'aparell. Però resulta que tot el temps, quan solíem utilitzar cadena com sinònim, el mitjà pel qual declarem que era sinònim amb aquesta paraula clau typedef, per a la definició de tipus. I estem dient bàsicament, fem encadenar un sinònim d'estrelles caràcters. Que els mitjans pels quals la pila creat aquestes rodes d'entrenament conegut com la cadena. Ara aquí és només un prototip per getchar. Pot ser que haguem vist abans, però això és de fet el que fa. getchar no pren cap argument, retorna un char. GetDouble no pren cap argument, torna una doble. getFloat no pren arguments, declaracions un flotador, i així successivament. getint és aquí. getlonglong hi ha aquí. I getString és aquí. I això és tot. Aquesta línia de color morat és un altre preprocessador Directiva per la hashtag a l'inici de la mateixa. Està bé. Així que ara vull anar a cs50.c. I no parlarem massa temps en això. Però per donar-te una idea del que és estat succeint tot això temps, em va deixar anar a - fem-ho getchar. Així getchar és majoritàriament comentaris. Però sembla que això. Així que aquesta és la funció real getchar que hem estat benentès que existeix. I tot i que no hem utilitzar aquest que moltes vegades, si alguna, és almenys relativament simple. Així que val la pena prendre un ràpid cop d'ull aquí. Així getchar té un bucle infinit, deliberadament per semblar. A continuació, diu - i això és una espècie de bona reutilització de codi que ens va escriure. Crida getString. Perquè ¿què significa tenir una xerrada? Bé, pot ser que també tractar d'aconseguir una tota la línia de text de l'usuari i a continuació, només ha de buscar en un d'aquests personatges. En la línia 60, aquí hi ha una mica de mica d'una comprovació de validesa. Si getString un valor nul, no anem a procedir. Quelcom ha fallat. Ara bé, això és una mica molest, però convencional en C. caràcters màx probablement representa el que acaba basant-se en el seu nom? És una constant. És com el valor numèric de la més carbó pot representar amb un mos, que és probablement el nombre 255, que és el major nombre que representar vuit bits, a partir de zero. Així que he utilitzo això, en aquesta funció, escriure aquest codi, només perquè si alguna cosa va malament en getchar però el seu propòsit a la vida és tornar a char, necessita alguna manera poder per indicar a l'usuari que alguna cosa va sortir malament. No podem tornar null. Resulta que és un punter nul. I de nou, getchar té retornar un char. Així que la convenció, si alguna cosa surt malament, és a dir, el programador, o en aquest cas, jo amb la biblioteca, que tenia un sol decidir arbitràriament, si alguna cosa surt malament, vaig a tornar el nombre 255, que és veritablement significa que no podem, l'usuari no pot escriure el caràcter representat per la nombre 255, perquè teníem un robar com un denominat valor sentinella a representar un problema. Ara resulta que el caràcter 255 no és quelcom que es pugui escriure amb el teclat, pel que no és gran cosa. L'usuari no s'adona que Jo he robat aquest personatge. Però si alguna vegada es veu a les pàgines de manual en un sistema informàtic alguna referència a una majúscules constant com aquest que diu, en cas d'error aquesta força constant serà retornat, això és tot cert va fer humà Fa anys va ser arbitràriament decidit tornar aquest valor especial i cridar una constant en el cas alguna cosa va malament. Ara la màgia passa aquí baix. En primer lloc, vaig a declarar a la línia 67 dos personatges, C1 i C2. I després, en la línia 68, hi ha realment una línia de codi que és una reminiscència de nostre amic printf, atès que no tenen per cent Cs entre cometes. Però adonar-se del que està passant aquí. sscanf significa scan cadena - significa escanejar un format corda, sscanf ergo. Què significa això? Això vol dir que es passa a sscanf una cadena. I la línia és el l'usuari in Es passa a sscanf una cadena de format com això que diu scanf quins són amb l'esperança que l'usuari ha escrit polz A continuació, passa a les direccions dels dos trossos de memòria, en aquest cas, perquè tinc dos marcadors de posició. Així que vaig a donar l'adreça de C1 i C2 de la direcció. I recordi que vostè dóna en funció de la direcció d'una variable, el que és la implicació? Què pot fer que funcioni com un resultat de donar-li la direcció d'un variable, davant la pròpia variable? Es pot canviar, oi? Si tinguessis algú un mapa per a un examen físic direcció, poden anar-hi i fer el que vulguin en aquesta direcció. La mateixa idea aquí. Si passem a sscanf, la direcció de dos fragments de memòria, fins i tot aquests petits petits trossos de memòria, C1 i C2, però els diem que la direcció d'ells, sscanf pot canviar. Així que el propòsit de sscanf a la vida, si llegim la pàgina de manual, és llegir el que el usuari va escriure en, l'esperança que l'usuari tingui escrit en un personatge i potser un altre personatge, i el que l'usuari escrit, el primer caràcter es Aquí, el segon personatge va aquí. Ara, en un apart, això i ho faria Només sé això de la documentació, el fet que em vaig posar un espai en blanc no només vol dir que no importa si l'usuari prem la barra d'espai alguns vegades abans que ell o ella pren un caràcter, vaig a ignorar qualsevol espai en blanc. Així que, sé per la documentació. El fet que hi ha una segona c% seguit d'un espai en blanc és en realitat deliberada. Vull ser capaç de detectar si l'usuari espatllat o no cooperar. Així que espero que l'usuari només escriu en un personatge, per tant, estic esperant sscanf que només es va a tornar el valor 1, ja que, de nou, si llegeixo la documentació, el propòsit de sscanf a la vida és per tornar a la sèrie de Les variables que es van omplir amb l'entrada de l'usuari. Vaig passar en dues variables adreces, C1 i C2. Espero, però, que només un de ells és assassinat perquè si sscanf retorna 2, el que és presumiblement la conseqüència lògica? Que l'usuari no només em donen una personatge com li vaig dir o ella. Probablement escriure en almenys dos caràcters. Així que si jo no tingués lloc la segona % C, només tenia un, que Francament seria més intuïtiu enfocament, crec que a primera vista, vostè no serà capaç de detectar si l'usuari ha estat donant més entrada del que realment volia. Així que aquesta és una forma implícita de comprovació d'errors. Però noti el que faig aquí. Un cop estigui segur que l'usuari em va donar una personatge, alliberar la línia, fent el contrari getString, que al seu torn utilitza malloc i, a continuació, torneu C1, el personatge que esperava el proporcionat per l'usuari i només va proporcionar. Així que una ràpida s'albira només, sinó qualsevol pregunta sobre getchar? Tornarem a alguns dels altres. Bé, deixa anar endavant i fer això - Suposem ara, per motivar la nostra discussió en una setmana més el temps, aquest és un arxiu anomenat structs.h. I un cop més, això és només una mostra d'alguna cosa que està per venir. Però cal notar que molts d'això és els comentaris. Així que vull destacar només el L'interessant per ara. typedef - hi ha aquesta mateixa paraula clau de nou. typedef s'utilitza per declarar cadena com un tipus especial de dades. Podeu utilitzar typedef per crear nou tipus de dades que no existien quan C va ser inventat. Per exemple, int ve amb C. caràcters ve amb C. doble ve amb C. Però no hi ha noció d'un estudiant. I no obstant això, seria molt útil per capaç d'escriure un programa que emmagatzema en una variable, número d'identificació de l'estudiant, seu nom, i la seva casa. En altres paraules, tres peces de les dades, com un int i un corda i una altra cadena. Amb la definició de tipus, el que és bastant potent sobre això i la paraula clau per sturct estructura, vostè, el programador el 2013, realment pot definir el seu propi els tipus de dades que no existien anys però fa que s'adaptin als seus propòsits. Així que aquí, a les línies 13 a 19, estem declarant un nou tipus de dades, com 01:00 int, però cridant estudiant. I dins d'aquesta variable va a de tres coses - 01:00 int, una cadena, i una cadena. Així que vostè pot pensar en el que és realment que va passar aquí, tot i que aquest és un mica d'una simplificació per avui, un estudiant és essencialment va pel que sembla això. Serà un tros de memòria amb una identificació, un nom camp, i un camp de casa. I serem capaços d'utilitzar els trossos de memòria i accedir a ells de la següent manera. Si entro a struct0.c, aquí hi ha un relativament llarg, però després d'un patró, de codi que utilitza aquest nou truc. Així que en primer lloc, permetin-me cridar la seva atenció a les parts interessants sobre de la tapa. Afilat defineix als estudiants 3, declara una constants anomenats estudiants i cessionaris de manera arbitrària el número 3, només així que tinc tres estudiants amb aquest programa per ara. Aquí ve Principal. I fixin-se, com puc declarar un conjunt d'estudiants? Bé, només ha d'utilitzar la mateixa sintaxi. La paraula estudiant òbviament nova. Però els estudiants, la classe, els estudiants del suport. Així que per desgràcia hi ha molt de reutilització dels termes aquí. Això és només un nombre. Així que això és com dir tres. Classe és el que jo vull per cridar a la variable. Podria dir-estudiants. Però la classe, això no és una classe en un orientat a objectes Java tipus de via. És una classe d'estudiants. I el tipus de cada element de dades en aquesta matriu és estudiant. Així que això és una mica diferent i de dir alguna cosa així, és només - Estic dient dóna'm 3 estudiants i trucar a aquesta classe d'arranjament. Està bé. Ara aquí està un quatre bucle. Familiars d'aquest tipus - iterate de zero en un màxim de tres. I aquí està la nova peça de la sintaxi. El programa em va a sol · licitar, l'ésser humà, per donar-li a un estudiant ID, que és un int. I aquí està la sintaxi amb què es pot emmagatzemar alguna cosa en el camp d'identificació en Classe d'ubicació del suport I. Així aquesta sintaxi no és nova. Això només significa donar-me el vuitè estudiant a la classe. No obstant això, aquest símbol és nou. Fins ara, hem utilitzat no podem punts, almenys en codi com aquest. Això vol dir que van a l'estructura coneguda com un estudiant i posar una mica allà. De la mateixa manera, en aquesta línia següent, el 31, vagi endavant i posar el que l'usuari escriu un nom aquí i el que fan per guanyar-se casa, el mateix, seguir endavant i el va posar en. casa. Llavors, què fa aquest programa en última instància, fer? Es pot veure una mica bromista allà. Deixin-me seguir endavant i fer fer estructures 0 dot slash struct 0, ID de l'estudiant 1, dir David Mather, estudiant ID 2. Rob Kirkland, estudiant ID 3. Lauren Leverit - i l'únic que va fer aquest programa, que és una cosa completament arbitrari, es Jo volia fer alguna cosa amb aquestes dades, ara que ens han ensenyat a utilitzar les estructures, és només tenia aquest bucle addicional aquí. I iterar sobre el conjunt dels estudiants. He utilitzat el nostre, amic potser ara familiar, cadena de comparar, stircomp a verificació és la casa vuitena de l'estudiant igual a Mather? I si és així, imprimir alguna cosa arbitràriament com, sí, ho és. Però un cop més, només em dóna oportunitats d'usar i reutilitzar i reutilitzar aquesta nova notació de punt. Així que a qui li importa, oi? El pujar amb un programa d'estudiant una mica arbitrari, però resulta que podem fer coses útils amb aquesta, per exemple, com segueix. Aquesta és una estructura molt més complicat en C. Té una dotzena o més camps, una mica enigmàticament anomenat. Però si alguna vegada has sentit parlar d'un gràfic format d'arxiu anomenat mapa de bits, BMP, que Resulta que el format d'arxiu de mapa de bits gairebé sembla que aquest. És una mica cara Smiley estúpid. És una petita imatge que m'he acostat en prou gran perquè pogués veure dels punts o píxels individuals. Ara, resulta que podem representar un punt negre amb, per exemple, el nombre 0. I un punt blanc amb el número 1. En altres paraules, si vostè vol fer un Cara somrient i guardar la imatge en un ordinador, és suficient per emmagatzemar i zeros els que es veuen així, quan escaigui, de nou, els són de color blanc i zeros són de color negre. I junts, si vostè té efectivament un ceñidor d'uns i zeros, té una reixeta de píxels, i si vostè posa a terme, té un bonic careta somrient. Ara, el format d'arxiu de mapa de bits, BMP, és efectiva que sota el capó, però amb més píxels sot que en realitat pot representar els colors. Però quan vostè té més sofisticat formats d'arxiu, com BMP i JPEG i GIF amb la qual vostè pot ser familiar, els arxius en el disc generalment no només tenir zeros i uns dels píxels, però tenen algunes metadades, així - meta en el sentit que no és realment dades, però és útil tenir. Així que aquests camps aquí s'estan implicant i anem a veure això amb més detall en el P-set 5, que abans dels zeros i uns que representar els píxels d'una imatge, hi ha un munt de metadades com la mida de la imatge i l' amplada de la imatge. I noto que estic arrencant alguns coses arbitràries aquí - amplada i alçada. Comptador binari i algunes altres coses. Així que hi ha algunes metadades en un arxiu. Però per entendre com es col · loquen els arxius d'aquesta manera, vostè pot a continuació, manipular imatges, recuperar imatges des del disc, canviar la mida d'imatges. Però no es pot necessàriament millorar-los. Necessitava una fotografia. Així que vaig tornar a RJ aquí, que et va veure a la pantalla fa força temps. I si obro Keynote aquí, aquest és el que passa si s'intenta apropar i millorar RJ. No està millorant realment. Ara Keynote és una espècie de desenfocament en un poc, només per passar per alt el RJ fet que no aconsegueix especialment millorada quan fer més gran I si fer-ho d'aquesta manera, veure les places? Sí, definitivament es pot veure els quadrats d'un projector. Això és el que passa quan a millorar. Però per entendre com la nostra RJ o el Cara somrient s'implementa ens deixarà En realitat escriure codi que manipula aquestes coses. I jo que pensava que anava a acabar amb aquesta nota, amb 55 segons d'una realcen això és, M'atreveixo, diguem més aviat enganyós. [REPRODUIR VIDEO] -Està mentint. Sobre què, no ho sé. -Llavors, què sabem? -Que a les 9:15 Ray Santoya era al caixer automàtic. -Així que la pregunta és què estava fent a les 9:16? -El rodatge de la nou mil · límetres en alguna cosa. Potser va veure el franctirador. -O va ser treballar amb ell. -Esperi. Torna un. -Què és el que veus? -Porteu la seva cara cap amunt, pantalla completa. -Les seves ulleres. -Hi ha una reflexió. -Aquest és l'equip de beisbol Neuvitas. Aquesta és la seva logotip. -I està parlant amb qui sigui que estigui portant aquesta jaqueta. [FI REPRODUCCIÓ DE VÍDEO] DAVID J. Malan: Això es pot establir Problema 5. Ens veiem la setmana que ve. Home: En el següent CS50. [Grills] [Reproducció de música]