[Powered by Google Translate] [Setmana 5] [David J. Malan, Harvard University] [Aquesta és CS50.] [CS50.TV] [Dona] Està mentint, sobre què, no ho sé. [L'home] Llavors, què sabem? [La dona] Això a les 9:15, Ray Santoya era al caixer automàtic. [L'home] Per tant el dubte és, què estava fent a les 9:16? [Dona] El rodatge de la 9 mm en alguna cosa. Potser va veure el franctirador. [L'home] O que estava treballant amb ell. [Home] Espera. Torna un. [Home] Què és el que veus? [♫ ♫ música Suspens] [Dona] Porti el seu cap per amunt. Pantalla completa. [Home] seu ulleres. >> Hi ha una reflexió. [♫ ♫ música Suspens] [L'home] Això és l'equip de beisbol de Nuevita. Aquesta és la seva logotip. [Dona] I ell està parlant amb qui porta aquesta jaqueta. [David Malan] Per tant, aquest és CS50 de 5 setmanes, i avui ens arruïnen una mica de la televisió i de la pel · lícula per a vostè. Així que quan estàs veient un espectacle com aquest d'aquí, i els policies diuen "Pots netejar això?" o "millorar" no hi ha millorar en el món real. De fet, el que realment aconsegueix és una mica d'alguna cosa com això. He aixecat una de les fotos del personal de la pàgina. Aquest és un programa anomenat Photoshop. Això és 1 feb Bowdens, Març 1 Bowdens realitat, avui dia, perquè tenim la Sra Bowden aquí també, amb Rob i Pau. Però aquí és Rob a la pantalla, i si ens centrem en aquesta brillantor que sempre ha tingut en els seus ulls, el que en realitat veiem és que el que veus és el que obtens. Això és "millorat", de manera que "CSI" té una mica malament. Hi ha un clip, si podem recollir a "CSI" només una mica més. Aquesta és una frase bonica per pronunciar des d'ara si voleu sonar tècnic amb els teus amics quan, en realitat, està dient absolutament res. [L'home] Durant setmanes he estat investigant els assassinats assassines Cabby amb un cert morbo. [Dona # 1] Això és en temps real. [Dona # 2] Vaig a crear una interfície GUI utilitzant Visual Basic, a veure si puc rastrejar una adreça IP. [Malan] Així àudio fora de sincronia de banda, la creació d'una interfície gràfica d'usuari amb Visual Basic per rastrejar una adreça IP és una completa tonteria. En aquests dies no s'utilitza Visual Basic, no hi ha necessitat d'una interfície gràfica d'usuari i l'adreça IP és un terme tècnicament precisa. Així que mantenir un ull cap a fora per a ells, i un dels meus favorits: Aquest és una mica més arcà, perquè el que necessita saber un idioma diferent. Hi ha un llenguatge anomenat Objective-C, que és un superconjunt de C. El que vol dir que és C més algunes característiques addicionals, com ara programació orientada a objectes. I aquest és el llenguatge que Apple ha popularitzat per a la programació de iOS. Així que aquí hi ha un clip d'un xou totalment diferent, de "Numbers" que si en realitat es mira de prop en el seu TiVo i la pausa en el moment just, veuràs que el que estem veient no és exactament el que s'està descrivint. I vaig a tractar d'un connector d'àudio diferent aquí i veure si no podem mantenir la sincronització d'àudio en aquest moment. Et dono "Numbers". [Home # 1] Es tracta d'una adreça IPv4 de 32 bits. [Home # 2] IP, que és la Internet. >> Private xarxa. És una xarxa privada d'Anita. [Malan] Bé. Es tracta d'Objective-C, i és per algun programa per acolorir per a nens, com vostè potser pot deduir del nom de la variable d'allà. Així que, llavors, era "Numbers". Així que avui i aquesta setmana et presentem una mica del món de la ciència forense i el context en els problemes, per tant. Avui serà una lliçó abreujada perquè hi ha un esdeveniment especial a aquí després, així que anem a fer una ullada, i es burlen tant dels estudiants com per als pares d'avui dia amb algunes de les coses que estan en l'horitzó. Entre ells, a partir de dilluns, tindrà una mica més dels seus companys de classe. EDX, Harvard i MIT nova iniciativa en línia per als cursos oberts i més, està posant en marxa al campus de Harvard, dilluns. Això significa venir dilluns vostè haurà de - a partir de l'últim recompte, 86.000 companys de classe addicionals seguiran al llarg de amb xerrades CS50 i seccions i tutorials i butlletins de problemes. I com a part d'això, es convertiran en membres de la classe inaugural de CS50 i CS50x ara. Com a part d'això, ara, adonar-se que hi haurà alguns Upsides també. Per preparar-se per això, per l'enorme quantitat d'estudiants, només cal dir que tot i que comptem amb 108 TFS i CAS, no exactament el millor estudiant / professor un cop arribem a 80.000 estudiants. Així que no anem a classificar problema per a molts jocs de forma manual. Així va presentar aquesta setmana en el conjunt de problemes serà CS50 Check, que serà una utilitat de línia d'ordres en l'aparell que obtindrà una vegada que el actualitzeu a finals d'aquest cap de setmana, i vostè serà capaç d'executar una ordre, comprovi 50, en el seu propi conjunt de processadors, i obtindrà una retroalimentació sobre si el seu programa és correcte o incorrecte d'acord a les especificacions de disseny diferents que ens han proporcionat. Així que més que en l'especificació i conjunt de problemes i els companys de classe CS50x va a utilitzar això també. Així butlletí de problemes 4 té a veure amb la medicina forense. I aquesta peça es va inspirar en algunes coses de la vida real, de manera que quan jo estava a la universitat, em van internar per un temps amb Oficina de Districte del Comtat de Middlesex del procurador fent el treball forense amb el seu principal investigador forense, i el que això equivalia a És a dir, crec que he esmentat la setmana passada alguns, és la policia estatal de comunicació o altres faria entrar, els deixen les coses com discs durs i CD i els disquets i similars, i llavors l'objectiu de l'oficina forense era determinar si els hi va haver o no evidència d'algun tipus. Aquesta va ser la Unitat d'Investigacions Especials, així que era delictes de coll blanc, era una espècie més problemàtica dels delictes, qualsevol cosa que implica algun tipus de mitjans de comunicació digitals, resulta que no molta gent escriure un correu electrònic dient: "Jo ho vaig fer". Així que molt sovint aquestes recerques forenses no es va presentar tot el que molt de fruit; però de vegades la gent anava a escriure aquests correus electrònics. Així que de vegades els esforços es van veure recompensats. Però per dur a aquest conjunt de processadors forense, anem a introduir en pset 4 una mica de gràfics. Així que probablement prendre aquestes coses per assegut, JPEG, GIF i els que en aquests dies, però si vostè realment pensa d'ell, una imatge, igual que la cara de Rob, pot modelar com una seqüència de punts o píxels. Ara, en el cas de la cara de Rob, hi ha tot tipus de colors, i comencem a veure els punts individuals, otherwide coneguts com píxels, una vegada que comencem per apropar la imatge Però si simplifiquem el món sigui una mica, i només puc dir que això aquí és Rob en blanc i negre, bé, per representar en blanc i negre que només es pot utilitzar binari. I si utilitzarem binari, 1 o 0, podem expressar aquesta mateixa imatge de la cara somrient de Rob amb aquest patró de bits: 11000011 representa blanc, blanc, negre, negre, negre, negre, blanc blanc. I el que no és un gran salt, llavors, començar a parlar de fotografies a tot color. Les coses que vostè veuria a Facebook o prendre amb una càmera digital, però, certament, quan es tracta de colors, necessita més bits. I molt comú en el món de les fotografies és utilitzar no 1-bit color, ja que això suggereix, però de 24-bit color, on realment obtenir milions de colors. Així com en el cas quan el zoom a l'ull de Rob, que era qualsevol nombre de milions de possibilitats diferents colors. Així que anem a introduir en aquest butlletí de problemes 4, així com en el tutorial, que serà avui a les 3:30 en lloc de les habituals a causa de 2:30 conferència de divendres aquí. Però el vídeo estarà en línia, com és habitual, demà. També vaig a presentar a un altre format d'arxiu. Així que això està deliberadament destinada a semblar intimidatori al principi, però això és només part de la documentació per a una estructura C. Resulta que Microsoft, fa anys, va ajudar a popularitzar aquest format, anomenat el format d'arxiu de mapa de bits, BMP, i això va ser un super-simple, colorit format d'arxius gràfics que s'utilitza des de fa força temps i de vegades encara per fons de pantalla en els escriptoris. Si vostè pensa de nou a Windows XP i els turons i el cel blau, que era típicament un BMP, o la imatge de mapa de bits i mapes de bits És divertit per a nosaltres perquè tenen una mica més de complexitat. No és tan simple com aquesta reixeta de 0 i de 1; en canvi, té coses com una capçalera al començament d'un arxiu. En altres paraules, dins d'un arxiu. Bmp és un manat sencer de 0 i de 1, però hi ha alguna cosa addicional 0 i 1 a allà. I resulta que el que probablement ha donat per fet durant anys, formats d'arxiu com. doc o. xls o mp3. o mp4., siguin quins siguin els formats d'arxiu que vostè està familiaritzat. Doncs bé, què significa ser fins i tot un format d'arxiu? Com que al final de la dia, tots aquests arxius d'utilitzar només 0 i d'1 i potser els 0 i els 1 representen, b, c, a través d'ASCII o similar, però a través del final del dia, és només 0 i de 1. Així que els humans només de tant en tant decideixen inventar un nou format d'arxiu on estandarditzar el que els patrons de bits realment signifiquen. I en aquest cas aquí, amics els que va dissenyar el format de fitxer de mapa de bits va dir que en el primer byte en un arxiu de mapa de bits, com s'indica mitjançant el desplaçament 0, no, que serà una mica crípticament anomenat bfType variable anomenada, que només representa el tipus de fitxer de mapa de bits, el tipus de fitxer de mapa de bits que és això. Es pot inferir, potser, des de la segona fila de compensar 2, número 2 bytes, té un patró de 0 i 1 que representa què? La mida d'alguna cosa, i va des d'allà. Així que en conjunt el problema 4, vostè pot caminar a través d'algunes d'aquestes coses. No anem a acabar la cura de tots ells, però noti que comença a posar-se interessant al voltant de la línia o byte 54, rgbtBlue, verd i vermell. Si alguna vegada has escoltat la sigla RGB, vermell, verd, blau, aquesta és una referència a això. Perquè resulta que vostè pot pintar tots els colors de l'arc de Sant Martí amb una combinació de vermell, blau i verd. I, de fet, els pares a l'habitació pot recordar alguns dels primers projectors. En aquests dies, vostè acaba de veure una llum brillant que surt d'una lent. No obstant això, en el seu moment, va tenir la lent de color vermell, la lent blava i verd de la lent i junts dirigida a la pantalla i es va formar un quadre de colors. I molt sovint les escoles intermèdies i secundàries que tenen aquests lents sempre tan lleugerament decantat, de manera que eren una mena de veure imatges dobles o triples, però aquesta era la idea. Tenies llum vermella, verda i blava que pinta un quadre. I aquest mateix principi s'utilitza en els ordinadors. Així que un dels desafiaments, llavors, en el conjunt de problemes 4 seran un parell de coses: una és per redimensionar una imatge. Per prendre en un patró de 0 i de 1, esbrinar què trossos de 0 i de 1 representen el que en una estructura d'aquest tipus, i després trobar la manera de reproduir els píxels: els vermells, els blaus, els verds dins, així que quan una imatge es veu com aquest principi, podria tenir aquest lloc després d'això. Entre altres desafiaments, també, serà que se li va lliurar una imatge forense d'un arxiu real d'una càmera digital i en aquesta cambra, fa molt de temps, eren un munt de fotos. El problema és que ens esborrin per accident o ha tingut la imatge danyada d'alguna manera. Les coses dolentes succeeixen amb càmeres digitals, de manera que ràpidament copiat tots els anys 0 i 1 de fora d'aquesta targeta per a vostè, va salvar a tots en un arxiu gran, i després els anem a lliurar a vostè problema en el grup 4 de manera que vostè pot escriure un programa en C amb el de recuperar tots aquests arxius JPEG, idealment. I resulta que els arxius JPEG, encara que són una mena format d'arxiu complex, són molt més complexes que aquesta cara somrient aquí. Resulta que cada JPEG comença amb els mateixos patrons de 0 i de 1. Així que usant un bucle while o un cicle for o similar, vostè pot iterar sobre tots els 0 i els 1 en aquesta imatge forense i cada vegada que veus el patró especial que està definit en l'especificació del conjunt del problema, es pot assumir, 'Oh, això és, amb una probabilitat molt alta, l'inici d'un arxiu JPEG, 'i pel que fa a trobar el mateix patró, un cert nombre de bytes o kilobytes o megabytes després, es pot assumir, 'Ooh! Heus aquí una segona JPEG, la foto que vaig prendre després de la primera. Permetin-me deixar de llegir aquest arxiu en primer lloc, començar a escriure aquest nou '. I la sortida del seu programa conjunt de processadors per 4 hi haurà fins 50 imatges JPEG. I si no són 50 imatges JPEG, té una mica d'un bucle. Si vostè té un nombre infinit d'imatges JPEG, té un bucle infinit. Així que, també, serà un cas bastant comú. Això és el que està en l'horitzó. Qüestionari 0, darrere nostre. Adona't, pel meu correu electrònic, que invariablement hi ha gent que són alhora tipus feliç, neutral, i trist voltant qüestionari temps 0. I si us plau acostar-se a mi, la TFS cap, Zamyla, el seu propi TF o una de les entitats emissores de certificats que vostè sàpiga si li agradaria discutir com anaven les coses. Així que per impressionar als pares aquí a l'habitació, el que és la biblioteca CS50? Bon treball. Quina és la biblioteca CS50? Sí? [Respostes dels estudiants, inintel · ligible] >> Bé, bé. Així que és un conjunt prescrit de codi que nosaltres, el personal, va escriure: que posem a per proporcionar algunes funcionalitats comuns. Coses com aconseguir-una cadena ¡Ajudeu-me a un int, totes les funcions que s'enumeren aquí. A partir d'ara, comencem a prendre realment aquestes rodes d'entrenament apagat. Així que anem a començar a portar una "cadena" de vostè, que, recordem, era només un sinònim per al tipus de dades real? char *. Així que per als pares, que probablement va ser - això és bo, així char * començarem a veure a la pantalla amb més raó ara que eliminar "cadena" del nostre vocabulari, almenys quan es tracta de realment escriure codi. De la mateixa manera, deixarem d'utilitzar algunes d'aquestes funcions com a molt, ja que els nostres programes es posaran més sofisticat en comptes de només escriure programes que se sentin allà amb un missatge parpellejant, esperant que l'usuari escrigui alguna cosa polz Vostè rebrà les seves entrades d'altres llocs. Per exemple, vostè els rebi d'una sèrie de bits en el disc dur local. En el seu lloc, vaig a aconseguir en el futur d'una connexió de xarxa, un lloc web en algun lloc. Així que anem a pelar aquesta capa, per primera vegada, i llevant l'aparell CS50 i l'arxiu anomenat CS50.h, que ha estat fort fins i tot durant setmanes. Però anem a veure realment el que hi ha dins d'això. Així que la part superior de l'arxiu en blau és només un munt de comentaris, informació sobre la garantia i llicència. Aquesta és una espècie de paradigma comú en programari, ja que una gran quantitat de programari en aquests dies és el que s'anomena "codi obert" el que significa que algú ha escrit el codi i ho va fer lliurement disponibles, ja que per executar i utilitzar, però en realitat llegir i modificar i integrar en el seu propi treball. Així que això és el que vostè ha estat utilitzant, el programari de codi obert, encara que en una forma molt petita. Si em desplaço cap avall més enllà dels comentaris, però, començarem a veure algunes coses més familiars. Així notar a la part superior aquí, que l'arxiu CS50.h inclou una gran quantitat d'arxius de capçalera. Ara, la majoria d'ells no hem vist abans, però és un familiar, quin d'aquests hem vist, encara que breument, fins ara? Sí, les biblioteques estàndard. Stdlib.h té malloc, així que una vegada que comencem a parlar sobre l'assignació de memòria dinàmica, que anem a tornar a la setmana següent, així, que va començar a incloure aquest arxiu. Resulta que bool i veritat i la falsedat en realitat no existeix en C, per se, si no va acompanyat l'arxiu aquí. Així tenim, per setmanes, ha inclòs estàndard bool.h de manera que vostè pot utilitzar la noció d'una. bool, vertader o fals Sense això, vostè hauria d'ordenar d'fingir i utilitzar un int i només arbitràriament assumir que 0 és fals i 1 és veritable. Ara bé, si desplaceu-vos cap avall encara més, aquí és la nostra definició d'una cadena. Resulta que, com hem dit abans, que quan això * és en realitat no importa. Vostè pot fins i tot tenir espai al seu voltant. Nosaltres, en aquest semestre, ha estat promovent com això per deixar clar que la * té a veure amb el tipus. Però dese compte, com comú, sinó una mica més comú, és posar-lo allà però funcionalment és el mateix. Però ara, si llegim més avall, anem a fer una ullada a, diguem, getInt, perquè hem utilitzat que, potser, primer de tot aquest semestre. I aquí està getInt. Això és el que? Aquest és el prototip. Molt sovint, hem posat prototips a la part superior del nostre. Arxius c, però també es pot posar en prototips arxius de capçalera, arxius. h, com aquesta aquí, així que quan vostè escriu algunes funcions que vol que altres persones puguin utilitzar, que és exactament el cas de la biblioteca CS50, no només posar en pràctica les seves funcions en una mena CS50.c, també posar els prototips no en la part superior d'aquest arxiu, però a la part superior d'un arxiu de capçalera, després que l'arxiu de capçalera és el que els amics i col · legues inclouen, amb forta incloure en el seu propi codi. Així que tot aquest temps que has estat incloent tots aquests prototips eficaçment a la part superior del seu arxiu, però a través d'aquest mecanisme inclouen agut que, essencialment, còpia i enganxa aquest arxiu en el seu compte. Ara, aquí hi ha una mica de documentació molt detallada. Hem pràcticament per fet que getInt rep un int, però resulta que hi ha alguns casos extrems, no? Què passa si l'usuari escriu un nombre que és massa gran? Un trilió, que no pot cabre dins d'un int? Quin és el comportament esperat? Bé, l'ideal és predictible. Així que en aquest cas, si un llegeix la lletra petita, veuràs que si la línia no es pot llegir, aquesta INT_MAX devolucions. Mai hem parlat d'això, però sobre la base de la seva capitalització, el que és, probablement? És una constant, de manera que és una constant especial que probablement declarat en un d'aquests arxius de capçalera que hi ha més sobre al fitxer, i INT_MAX és probablement alguna cosa com, aproximadament, 2 milions de dòlars. La idea és que, perquè hem d'indicar d'alguna manera que alguna cosa va sortir malament, nosaltres, sí, tenim 4 milions de números a la nostra disposició, negatiu 2 milions de dòlars en fins a 2 milions de dòlars, més o menys. Bé, el que és comú en la programació és de robar un d'aquests nombres. Potser 0, potser 2 milions de dòlars, potser negatiu 2 milions de dòlars. Així de passar un dels seus valors possibles perquè pugui comprometre amb el món que si alguna cosa surt malament, jo em tornaré aquest valor super-gran. Però vostè no desitja que l'usuari escrigui alguna cosa críptica com "2, 3, 4 ..." del nombre realment gran, on es generalitza en canvi com una constant. Així que en realitat, si s'estaven anal en les últimes setmanes, en qualsevol moment que cridi getInt, vostè ha d'haver estat revisant amb una condició if. El tipus d'usuari en INT_MAX, o més específicament, va fer INT_MAX getInt canvi? Perquè si ho fes, que en realitat vol dir que no ho escrigui, alguna cosa va sortir malament en aquest cas. Així que això és el que es coneix generalment com un "sentinella" de valor, la qual cosa significa especial. Bé, passem ara als arxius. C. L'arxiu de C ha existit en l'aparell durant algun temps, i, de fet, l'aparell ha de precompilat per a vostè en aquesta cosa que anomenem "codi objecte" però això no li importa a vostè on està perquè el sistema sap, en aquest cas, on és, l'aparell. Però anem ara a desplaçar-se cap avall getInt, i veure com getInt ha estat treballant tot aquest temps. Així que aquí tenim comentaris similars d'abans. Permetin-me fer un zoom sobre només la part del codi, i el que tenim per getInt és la següent. No es necessita entrada i retorna un int, mentre que (veritat), així que tenim un bucle infinit deliberada però, presumiblement, sortirem d'això d'alguna manera, o tornar des d'aquest. Així que anem a veure com funciona això. Bé, sembla que estem usant GetString en aquesta línia primer dins del bucle, 166. Això ara és una bona pràctica perquè en quines circumstàncies GetString podria tornar aquesta paraula clau especial NULL,? Si alguna cosa surt malament. Què podria sortir malament quan es diu alguna cosa així com GetString? Sí? [Resposta Estudiantil, inintel · ligible] >> Si. Així que potser malloc falla. En algun lloc sota la campana cridant a GetString malloc, que assigna la memòria, que permet l'emmagatzematge informàtic tots els caràcters que l'usuari escriu en el teclat. I suposem que l'usuari tenia un munt de temps lliure i escrit més, per exemple, de 2 mil milions de caràcters. Més caràcters que l'equip encara té RAM. Bé, GetString ha de ser capaç d'indicar que perquè, fins i tot si es tracta d'un cas super, super cantonada infreqüent. Ha de ser d'alguna manera capaç de manejar això, GetString i així, si tornar enrere i llegir la seva documentació, ho fa, de fet, torni NULL. Ara bé, si GetString falla en tornar NULL, getInt fallarà tornant INT_MAX, com un sentinella. Aquests són només convencions humanes. L'única manera de saber que aquest és el cas és mitjançant la lectura de la documentació. Així de desplaçar cap avall perquè el int és realment GotInt. Així que si em desplaço una mica més lluny, en la línia 170 que té un comentari sobre aquestes línies. Per tant, declarem, en 172, un int n i aire char, i llavors aquesta nova funció que alguns de vosaltres heu ensopegat abans, però sscanf. Això significa cadena f exploració. En altres paraules, dóna'm una cadena i el vaig a buscar els fragments d'informació d'interès. Llavors, què significa això? Bé, suposo que escriure, literalment, 1 2 3 en el teclat, i després prem enter. Quin és el tipus de dades de 1 2 3 quan són retornats per GetString? Òbviament és una cadena, no? Tinc una cadena, de manera que 1 2 3 és realment "1 2 3" amb el 0 \ al final de la mateixa. Això no és un int. Això no és un nombre. Sembla un nombre, però no és en realitat. Llavors, què getInt he de fer? S'ha d'explorar aquesta cadena d'esquerra a dreta, 1 2 3 \ 0, i d'alguna manera convertir un enter real. Ara, vostè podria trobar la manera de fer això. Si penses en pset 2, vostè probablement té una mica còmode amb César o Vigenère pel que pot iterar sobre una seqüència, vostè pot convertir caràcters a sencers amb pua. Això és un munt de treball. Per què no cridar a una funció com sscanf que fa això per a vostè? Així sscanf espera un argument, en aquest cas anomenat línia, que és una cadena. A continuació, especificar, entre cometes, molt similar a printf, Què és el que s'espera veure en aquesta cadena? El que estic dient aquí és que esperem veure un nombre decimal i pot ser un personatge. I anem a veure per què aquest és el cas en un moment. Resulta que aquesta notació és ara una reminiscència de coses vam començar a parlar d'alguna cosa més d'una setmana. Quin és & N i & c fent per nosaltres aquí? [Respostes dels estudiants, inintel · ligible] Sí >>. M'està donant la direcció de n i la direcció de c. Ara, per què és tan important? Bé, ja saps que amb les funcions en C sempre es pot tornar un valor o cap valor en absolut. Vostè pot tornar un int, cadena, un flotador, char a, el que sigui. Podeu també tornar buida, sinó que només pot tornar una cosa al màxim. Però aquí volem sscanf per a mi tornar potser un enter, un nombre decimal, i també a. char, i vaig a explicar per què el char en un moment Així que efectivament volen f per tornar dues coses, això no és possible en C. Així que vostè pot evitar que en aprovar en 2 direccions, perquè quan et lliuren una funció de dues direccions, el que pot ser que la funció de fer amb ells? Es pot escriure en aquestes direccions. Vostè pot utilitzar l'operació * i "anar allà" per a cadascuna d'aquestes direccions. És una espècie d'aquest mecanisme de porta del darrere, però molt comú per canviar els valors de les variables en més de només 1 lloc, en aquest cas 2. Ara, notin que estic comprovant == a 1, i després tornar n si això és així, de fet, s'avaluen com true. Llavors, què està passant? Bé, tècnicament, tot el que realment volem que succeeixi en getInt és això. Volem analitzar, per dir-ho així, volem llegir la cadena "1 2 3", i si sembla que hi ha un nombre allà, el que estem dient sscanf de fer és posar aquest nombre, 1 2 3, en aquesta variable n per a mi. Per què, llavors, tinc això així? Quin és el paper de la també dient: sscanf, també pot ser que aconsegueixi un personatge aquí. [Parla l'estudiant, inintel · ligible] >> No - un punt decimal podia treballar. Anem a celebrar que va pensar per un moment. Què més? [Estudiant, inintel · ligible] >> Així que, bon pensament, podria ser el caràcter NULL. En realitat no és, en aquest cas. Sí? [Estudiant, inintel · ligible] >> ASCII. O bé, permetin-me generalitzar encara més. El% c no és només per a la comprovació d'errors. No volem que hi hagi personatge després del número, però el que això em permet fer és el següent: Resulta que sscanf, a més d'emmagatzemar els valors de N i C, en aquest exemple aquí, el que també fa és que retorna el nombre de variables de posar els valors cm Així que si només escrius 1 2 3, llavors només el% d va a coincidir i només s'emmagatzema n amb un valor com 1 2 3 i res es posa en c; c segueix sent un valor escombraries, per dir-ho. Escombraries, ja que mai s'ha inicialitzat com un valor. Així que en aquest cas, sscanf retorna 1, perquè poblada un dels punters, en aquest cas, genial. Tinc un int, de manera que alliberar la línia per alliberar la memòria GetString que realment assignat, i després torno núm. Si no, si t'has preguntat on reintent declaració que ve, ve d'aquí. Si, per contra, de tipus I en 1 2 3 foo, només alguna seqüència aleatòria de text, sscanf veurà, ooh, nombre, ooh, nombre, ooh, nombre, ooh - f. I es posarà la 1 2 3 núm. Es posarà la f en c, i després tornar 2. Així que tenim, simplement usant la definició bàsica de la conducta de scanf, una manera molt senzilla - bé, complex a primera vista, però al final de la dia, mecanisme bastant simple de dir, hi ha un int, i si ho és, que l'únic que he trobat? I l'espai en blanc aquí és deliberada. Si llegeix la documentació de sscanf, ella li diu que si s'inclou un tros d'espai en blanc al principi o al final, sscanf també permetrà a l'usuari, per qualsevol raó, per colpejar la barra d'espai 1 2 3, i que serà legítim. No crida en l'usuari només perquè prémer la barra espaiadora al principi o al final, que és només una mica més fàcil d'utilitzar. Qualsevol pregunta, llavors, en GetInts? Sí? [Pregunta Estudiant, inintel · ligible] >> Bona pregunta. Què passa si vostè acaba d'escriure en un char, com f, i prem enter sense haver de teclejar 1 2 3; què et sembla el comportament d'aquesta línia de codi seria llavors? Així sscanf que pot cobrir també, perquè en aquest cas, que no va a omplir n oc, sinó que tornarà en lloc 0. En aquest cas, també estic captura d'aquest escenari, ja que el valor esperat que vull és 1. Només vull una, i només una cosa per ser omplerts. Bona pregunta. Altres? Molt bé, així que no anirem a través de totes les funcions d'aquí, però la que sembla, potser, l'interès restant es GetString perquè resulta que GetFloat, getInt, GetDouble GetLongLong tot punt gran part de la seva funcionalitat a GetString. Així que donem una ullada a la manera com es porta a terme aquí. Aquest sembla una mica complex però utilitza els mateixos fonaments que comencem a parlar de la setmana passada. Així que en GetString, que no té en argument com pel buit fins aquí, i retorna una cadena, de manera que estic declarant una cadena anomenada buffer. Realment no sé el que serà utilitzat per encara, però ja veurem. Looks like capacitat és, per defecte, 0; sense saber ben bé a on va això. No estic segur que n serà utilitzat per encara. Però ara s'està tornant una mica més interessant, pel que en la línia 243, declarem 1 int c, això és una espècie d'un detall tonto. Un char és de 8 bits, i 8 bits pot emmagatzemar quants valors diferents? 256. El problema és que si vostè vol tenir 256 caràcters ASCII diferents, que hi ha, si vostè pensa de nou, i això no és una cosa per memoritzar. Però si penses en aquesta taula ASCII gran que vam tenir setmanes enrere, hi va haver, en aquest cas, 128 o 256 caràcters ASCII. Utilitzem tots els patrons de 0 i 1 que passa. Això és un problema si vostè vol ser capaç de detectar un error. Perquè si vostè ja està utilitzant 256 valors per als seus personatges, que en realitat no planificar el futur, perquè ara no hi ha manera de dir: "Això no és un personatge de fiar, el que és cert missatge erroni". Llavors, què fa el món és, utilitzar el valor més proper; una mena int perquè tingui un nombre boig de bits, 32 per 4 bilions de valors possibles, de manera que només ha de acaben usant, essencialment, 257 d'ells, 1 dels quals té un significat especial com un error. Així que anem a veure com funciona això. En la línia 246, tinc aquest gran bucle while que està trucant fgetc, de f significat, getc, a continuació, stdin. Resulta que aquesta és només la forma més precisa de dir "llegir l'entrada des del teclat." Teclat estàndard mitjà d'entrada, la sortida estàndard significa pantalla, i l'error estàndard, que veurem en pset 4, significa que la pantalla, però una part especial de la pantalla de manera que no està fusionat amb una producció real que es pretén imprimir, però més sobre això en el futur. Així fgetc només significa llegir un caràcter del teclat i emmagatzemar-on? Guardi'l en c, i després comprovar, així que estic fent servir algunes conjuncions booleans aquí, comprovar que no és igual a \ n, de manera que l'usuari ha arribat a entrar. Volem deixar en aquest punt, al final del bucle, i també volem comprovar per la constant especial, EOF, el que si sap o endevina - què significa? Final de l'arxiu. Així que això és una cosa sense sentit, perquè si estic escrivint en el teclat, no hi ha realment cap arxiu involucrats en això, però això és només una espècie del terme genèric utilitzat per a referir- que només ve dels dits de l'humà. EOF. Final de l'arxiu. Com acotació al marge, si mai t'has colpejat el control d en el teclat, No és que vostè tindria encara, vostè ha colpejat control c. Però el control d enviar aquest especial EOF constant anomenada. Així que ara només ens queda una mica d'assignació de memòria dinàmica. Així que si n + 1> la capacitat, ara explicaré núm. n és simplement quants bytes es troben actualment en el buffer, la cadena que s'està construint en l'actualitat per part de l'usuari. Si vostè té més personatges en la memòria intermèdia del que té la capacitat de la memòria intermèdia, intuïtivament, el que hem de fer llavors és assignar més capacitat. Vaig a passar fregant algunes de les operacions aritmètiques aquí i centrar-se només en aquesta funció aquí. Saps el que malloc és, o almenys familiaritzats general. Endevina el que realloc fa. [Resposta Estudiantil, inintel · ligible] Sí >>. I no és prou l'addició de memòria, sinó que reassigna la memòria de la següent manera: Si encara hi ha espai a l'extrem de la corda perquè duri més que la memòria del que originalment li dóna, llavors vostè aconseguirà que la memòria addicional. Així que vostè pot posar les cadenes de caràcters esquena amb esquena a esquena amb esquena. Però si aquest no és el cas, ja que va esperar massa temps i té alguna cosa aleatori es va deixar caure en memòria allà, però no és extra memòria aquí, això està bé. Realloc farà tot el treball pesat per a vostè, moure la cadena ha llegit fins ara d'aquí, el va deixar allà, i després li donen la pista una mica més en aquest punt. Així que amb un gest de la mà, deixa dir que el que està fent GetString s'està començant amb un buffer petit, potser un sol caràcter, i si l'usuari escriu en 2 caràcters, GetString acaba trucant realloc i diu: "Oh, un personatge no era suficient. Dóna'm 2 caràcters. Llavors, si vostè llegeix a través de la lògica del bucle, que dirà, 'Oh, l'usuari va escriure en 3 caràcters. Dóna'm ara no 2, sinó 4 caràcters, llavors dóna'm 8, llavors dóna'm 16 i 32. El fet que estic doblant la capacitat cada vegada significa que el buffer no creixerà lentament. Creixerà molt ràpid, i el que podria ser l'avantatge d'això? Per què estic doblant la mida de la memòria intermèdia, encara que l'usuari només pot ser que necessiti un personatge extra del teclat? [Estudiant resposta inintel · ligible]. >> Què és això? Exactament. No ha de créixer amb tanta freqüència. I això és només una espècie de - vostè està de cobertura seves apostes aquí. La idea és que vostè no desitja trucar realloc molt, ja que tendeix a ser lenta. Cada vegada que li demana al sistema operatiu per a la memòria, com aviat veurem en un conjunt de problemes en el futur, es tendeix a portar el seu temps. Així que minimitza la quantitat de temps, fins i tot si vostè està perdent una mica d'espai, tendeix a ser una bona cosa. Però si llegim a través de la part final del GetString aquí, i de nou, la comprensió de cada línia aquí no és tan important avui en dia. Però cal notar que finalment crida a malloc nou, i l'assignació al exactament tants bytes com necessita per a la cadena i després llença a les escombraries trucant lliure, la memòria intermèdia excessivament gran, si de fet he doblat diverses vegades. En fi, així és com GetString ha estat treballant tot aquest temps. Tot el que fa és llegir un caràcter alhora una i altra vegada i una altra i cada vegada que necessita una mica de memòria addicional, li demana al sistema operatiu perquè en cridar realloc. Alguna pregunta? Està bé. Un atac. Ara que entenem els punters, o almenys estan cada vegada més familiaritzats amb els punters, anem a considerar com el món sencer comença a esfondrar- si no arribes a defensar contra els usuaris contradictori, persones que estan tractant de tallar al sistema. Les persones que estan tractant de robar seu programari eludint un codi de registre que en cas contrari podria haver d'escriure polz Fes un cop d'ull a aquest exemple aquí, que és només el codi C que té una funció principal a la part inferior, que crida a una funció foo, i què és el que passa a foo? [Estudiant] Un sol argument. Solter >> argument. Així que argv [1], el que significa la primera paraula que l'usuari va escriure en la línia d'ordres després de a.out o el que s'anomena el programa. Així foo, a la part superior, porta en un char *, char *, però és el que? String. No hi ha res de nou aquí, i aquesta cadena és arbitràriament ser anomenat bar. En aquesta línia aquí, char c [12], en una mena de semi-Anglès tècnic, el que està fent aquesta línia? Matriu de -? Personatges. Dóna'm una matriu de 12 caràcters. Així que podríem anomenar això un buffer. S'anomena tècnicament c, però en un tampó de programació només significa un munt d'espai que vostè pot posar algunes coses polz A continuació, finalment, memcpy, no hem usat abans. Però que és fàcil endevinar el que fa. Còpia de la memòria. Què fer? Bé, pel que sembla còpia bar, la seva entrada, al c, però només fins a la longitud de la barra. Però hi ha un error aquí. Bé, per la qual cosa tècnicament hauria de fer strlen (bar) x sizeof (char), això és correcte. Però en el pitjor dels casos aquí, anem a suposar que això és - així, està bé. Llavors hi ha dos errors. Així sizeof (char), està bé, farem això una mica més. Així que ara que encara hi ha un error, que és el que? [Resposta Estudiantil, inintel · ligible] >> veure per què? Bé, pel que ha de comprovar NULL, perquè les coses dolentes succeeixen quan el punter és NULL, Com que vostè pot ser que acabi sobre de anar-hi, i no sempre es va a NULL per eliminació de referències amb l'operador *. Així que això és bo, i què més farem? Lògicament hi ha un error aquí. [Resposta Estudiantil, inintel · ligible] Per tal de comprovar si >> argc ≥ 2? Bé, de manera que hi ha tres errors en aquest programa. No estem comprovant si l'usuari realment escriure en res a argv [1], bé. Quin és l'error tercera? Sí? [Resposta Estudiantil, inintel · ligible] >> Bé. Així que ens registrem un escenari. Hem comprovat implícitament no copiar més memòria que s'excedeixi la longitud de la barra. Així que si la cadena que l'usuari va escriure en és de 10 caràcters de longitud, això ens diu: "Només copiar 10 caràcters. I això està bé, però què passa si l'usuari va escriure en una paraula en l'indicador com una paraula de 20 caràcters, el que és, dient còpia 20 caràcters de barra en què? c, també conegut com el nostre buffer, el que significa que acabes d'escriure dades a 8 llocs byte que vostè no és propietari, i no els tenen en el sentit que mai se'ls assignen. Així que això és el que es coneix generalment com l'atac de desbordament de memòria intermèdia, o buffer overrun atac i atac, en el sentit que si l'usuari o el programa que està trucant a la seva funció està fent això amb malícia, el que realment passa a continuació podria ser molt dolent. Anem a fer una ullada a aquesta foto aquí. Aquest quadre representa la pila de memòria. I recordar que cada vegada que es crida a una funció, rep aquest petit marc a la pila i després una altra i després una altra i una altra. I fins ara hem només una mica abstret aquestes lluny com rectangles o bé hi ha a la pissarra oa la pantalla aquí. Però si ens centrem en un d'aquests rectangles, quan es crida a una funció foo, resulta que hi ha més a la pila dins d'aquest marc i rectangle que que amb prou feines x i i i a i b, com ho vam fer parlant de swap. Resulta que hi ha alguns detalls de nivell inferior, entre ells la direcció de retorn. Així que resulta quan principal diu foo, el principal ha d'informar foo quina és la direcció principal està en la memòria de l'ordinador. Perquè si no, tan aviat com foo es fa executar, com en aquest cas aquí, una vegada que arribi a aquest claudàtor prop al final de foo, com diables se sap foo on el control del programa se suposa que ha d'anar? Resulta que la resposta a aquesta pregunta és en aquest rectangle vermell aquí. Això representa un punter, i li toca a l'ordinador per emmagatzemar, temporalment, a la pila de trucada de la direcció principal, de manera que tan aviat com foo es fa executar, l'equip sap on i quina línia principal per tornar. Saved punter marc relaciona de manera similar a això. Bar Char * aquí representa què? Bé, ara aquest segment blau aquí és foo marc, quin és bar? Bé, per bar és només l'argument de la funció foo. Així que ara estem de tornada en el quadre familiar. Hi ha més coses i més distraccions a la pantalla però aquest segment de color blau clar és el que hem estat dibuixant a la pissarra per a alguna cosa com swap. Aquest és el marc per foo i l'únic que en aquest moment és bar, que és aquest paràmetre. Però el que més hauria d'estar a la pila, d'acord amb aquest codi aquí? Char c [12]. Així que també hem de veure 12 quadres de la memòria, assignat a una variable anomenada c. I, de fet hem de a la pantalla. La part superior hi ha c [0], i llavors l'autor d'aquest diagrama no es va molestar a dibuixar totes les places però en realitat hi ha 12 hi perquè si ens fixem en la part inferior dreta, c [11], si comptem des de 0, és de 12 bytes mateixes. Però aquí està el problema: En quina direcció es c creixent? Ordenar de dalt a baix, no? Si s'inicia a la part superior i creix cap al fons, no sembla que ens va deixar la pista molt aquí en absolut. Hem classe de nosaltres mateixos pintat en una cantonada, i que c [11] és just contra bar, que està just en contra punter del marc de pila, que és just en contra la direcció del remitent, hi ha espai més. Llavors, ¿quina és la implicació, llavors, si fiques la pota, i està llegint 20 bytes en un buffer de 12 bytes? On són aquests 8 bytes addicionals anirà? Dins de tota la resta, alguns dels quals és súper important. I el més important, potencialment, és el quadre vermell aquí, l'adreça del remitent. Perquè suposo que vostè és ja sigui accidental o de contradicció sobreescriure aquests 4 bytes, que s'ocupen de punter, no només amb les escombraries, però amb un nombre que passa a representar una adreça real a la memòria? Quina és la implicaiton, lògicament? [Respostes dels estudiants, inintel · ligible] >> Exactament. Quan torna foo i èxits que claudàtor, el programa es procedirà per no tornar al menú principal, que tornarà al que la direcció està en aquesta caixa vermella. Ara bé, en el cas del registre de programari eludir, Quina és l'adreça que està sent retornat a la funció es que normalment es diu després d'haver pagat pel programari i els introdueix el teu codi de registre? Vostè pot ordenar truc de l'ordinador en no anar aquí, però en el seu lloc, anar aquí. O, si ets realment intel · ligent, un adversari realment pot escriure en el teclat, per exemple, no és una paraula real, els personatges no 20, però suposo que ell o ella en alguns tipus de caràcters que representen el codi? I no serà el codi C, que serà els personatges que representen els codis binaris de màquines, 0 i 1. Però suposem que ets prou intel · ligent com per fer això, per enganxar d'alguna manera en l'indicatiu GetString una cosa que és essencialment el codi compilat, i els últims 4 bytes que sobreescriure la direcció del remitent, i quina direcció ho fa d'entrada? S'emmagatzema en aquest rectangle vermell la direcció del primer byte de la memòria intermèdia. Així que cal ser molt intel · ligent, i això és un munt de prova i error per a la gent dolenta per aquí, però, si es pot saber què tan gran és aquest tampó de manera que els últims bytes de l'entrada que s'inclouen amb el programa passar a ser equivalent a la direcció d'inici de la memòria intermèdia, vostè pot fer això. Si diem, en general, hola, i \ 0, això és el que acaba en la memòria intermèdia. Però si ets més intel · ligent, i omplir el buffer amb el que genèricament anomenarem codi d'atac, A, A, A, A: Atacar, atacar, atacar i atacar, quan això és una cosa que fa una cosa dolenta. Bé, què passa si ets realment intel · ligent, aquí teniu com: En el quadre vermell aquí és una seqüència de nombres: 80, CO, 35, 08. Recordeu que que coincideix amb el nombre que està aquí dalt. Està en ordre invers, però més d'això en un altre moment. Tingueu en compte que aquesta direcció de retorn s'hagin modificat per igualar la direcció d'aquí, no l'adreça de la principal. Així que si el dolent de la pel · lícula és súper intel · ligent, ell o ella va a incloure en aquest codi d'atac una mena, 'Elimina tots els arxius de l'usuari. O 'Copiar les contrasenyes ", o" Crea un compte d'usuari que podeu entrar en. Res en absolut, i això és alhora el perill i el poder de la C. Com que té accés a la memòria a través de punters i per tant es pot escriure el que vulgui en la memòria d'un ordinador. Vostè pot fer que un equip fer el que vulguis amb només haver saltar dins del seu propi espai de memòria. I així, fins ara, de manera que molts programes i llocs web internacionals de tants que estan compromesos es redueixen a les persones que prenen avantatge d'això. I això pot semblar un atac super-sofisticada, però no sempre comença d'aquesta manera. La realitat és que el que la gent dolenta sol fer és, si es tracta d'un programa en una línia d'ordres o un programa d'interfície gràfica d'usuari o una pàgina web, S'acaba de començar a proporcionar una tonteria. Vostè escriu en una paraula molt gran en el camp de cerca i premeu enter, i esperar a veure si es bloqueja el lloc web. O esperar a veure si el programa es manifesta algun missatge d'error. Perquè si tens sort, ja que el dolent de la pel · lícula, i proporcionar alguna entrada boig que bloqueja el programa, això vol dir que el programador no va preveure el seu mal comportament el que significa que probablement pugui, amb el suficient esforç, suficient judici i error, trobar la manera de lliurar un atac més precís. Així que una part tan important de la seguretat no és només evitar aquests atacs del tot, però la seva detecció i en realitat mirant logs i veure el que la gent boja entrades teclejades al seu lloc web. Quins termes de cerca i la gent escriu a la seva pàgina web amb l'esperança d'algun desbordament buffer? I tot això es redueix al bàsic senzilles del que és una matriu, i què significa per assignar i utilitzar la memòria? I relacionat amb això, també, és la següent. Així que anem a fer una ullada a l'interior d'un disc dur nou. Pel que recordo d'una o dues setmanes enrere, que en arrossegar arxius a la paperera de reciclatge o pot d'escombraries, què passa? [Estudiant] Res. >> Sí, absolutament res. Finalment, si s'executa sota espai en disc, Windows o Mac OS començarà a eliminar arxius per vostè. Però si arrossega alguna cosa allà, llavors no és pas segur. Tot membre del seu company de quart, un amic o familiar ha de fer és doble clic, i llest. No tots els arxius incomplets que van tractar d'esborrar. Així que la majoria de nosaltres si més no saber que vostè ha de fer clic dret o control clic i buidar les escombraries, o alguna cosa per l'estil. Però fins i tot llavors, que no acaba de fer el truc. Perquè el que passa quan es té un arxiu en el disc dur que representa algun processador de text o JPEG poc? I això representa el disc dur, i diguem que aquesta estella aquí representa aquest arxiu, i es compon d'un munt de 0 i 1. Què passa quan vostè no només arrossegar el fitxer a la paperera o paperera de reciclatge, però també buidar? Una espècie de res. No hi ha absolutament res ara. Ara és simplement res, perquè una mica d'alguna cosa que passa en la forma d'aquesta taula. Així que hi ha una mena de base de dades o taula dins de la memòria d'un ordinador que essencialment té 1 columna per als noms de fitxers, i una columna per a la ubicació de l'arxiu, on això podria ser la ubicació 123, un nombre a l'atzar. Així que podríem tenir quelcom x.jpg i la ubicació 123. I què passa llavors, en buidar la paperera? Que se'n vagin. Però el que no desapareix és del 0 i l'1. Llavors, què és, llavors, la connexió al conjunt de processadors 4? Bé, amb el conjunt de processadors 4, només perquè hem esborrat accidentalment la targeta flash compacta que tenia totes aquestes fotos, o simplement perquè la mala sort es va corrompre, no vol dir que el 0 i el d'1 no estan encara allà. Potser alguns d'ells s'han perdut perquè alguna cosa es corromp en el sentit que alguns de 0 convertir en 1 i la d'1 es va convertir en 0. Les coses dolentes poden succeir a causa de programari defectuós o maquinari defectuós. Però molts d'aquests bits, potser fins i tot el 100% d'ells encara hi són, el que passa és que l'ordinador o la càmera no sap on va començar JPEG 1 i on JPEG 2 va començar, però si vostè, el programador, saps, amb una mica de sentit comú, on els arxius JPEG o el que semblen, vostè pot analitzar els 0 i els 1 i dir, 'Ooh. JPEG. Ooh, JPEG. Vostè pot escriure un programa amb essencialment un bucle for o while que recupera tots i cada un d'aquests arxius. Així que la lliçó llavors, és començar "segura" esborrant els seus arxius si vols evitar això del tot. Sí? [Pregunta Estudiant, inintel · ligible] >> Tenir més memòria que abans - Oh! Bona pregunta. Per què, llavors, després de buidar les escombraries, L'ordinador li dirà que vostè té més espai lliure que abans? En poques paraules, perquè està mentint. Més tècnicament, vostè té més espai. Perquè ara que has dit, pots posar altres coses en aquest arxiu un cop va ser, però això no vol dir que els bits desapareixeran, i això no vol dir que els bits s'estan canviant tots els 0, per exemple, per a la seva protecció. En canvi, si "segura" esborrar arxius, o destruir físicament el dispositiu, que realment és l'única manera, de vegades, al voltant d'això. Així que per què no ens anem en aquesta nota semi-por, i ens veiem el dilluns. CS50.TV