ALTAVEU 1: Hola a tots. Anem a començar. Crec que la gent encara va per ser filtrat a. No obstant això, en nom del temps, pel que podem aconseguir nois d'aquí a temps, anem a començar. Així que benvinguts a la CS50 Qüestionari 0 opinió. Per a aquells de vostès que no han realitzat però, vostè té una pregunta per al Dimecres. Woo-Hoo. Si no ha començat a estudiar encara o No s'han adonat que això existeix, però, concursos anteriors i tota la informació sobre el seu concurs estan en cs50.net/quizzes. Hi ha una mica de coses molt bones allà, concursos passats des de l'últim 10 anys, així com informació sobre aquesta prova i temes que seran coberts. Així que anem a començar. Així que vostès poden recordar, la primera dia de classe David tenia aquestes llums a. Així que, essencialment, tot el que passa sota el capó d'un ordinador és fet en binari. Binari significa el que sona com, 0 i 1s. Té dos valors que pot ser representada. Així com en el primer dia de la secció quan David va encendre una llum bombeta per representar a, o 1, el nostre ordinador entén binari com 0 i de 1 de, encès o apagat. Fonaments de la binària. Cada lloc està representat en base dues. Així s'agrega 2 a 0 al 1 a la 2 tot el camí cap amunt. Per calcular el que el seu binari és decimal, només has de seguir aquesta equació tipus de cosa. Si vostè té un 1 en qualsevol d'aquests llocs, el multipliques per qualsevol basar és en, afegir cap amunt, i a obtenir el decimal. Així que aquesta és la forma d'explicar a 5 en binari. Igual que el que estàvem fent en el última diapositiva, així és com ho faria representar 1 a 5. De la mateixa manera, igual que vostè pot afegir i restar en decimal o en base 10, o Realment qualsevol base, sobre pot afegir i resta en binari. Exactament el que es pot esperar quan es afegir els dos a dalt, si és igual a major que 1, vostè porta un 1, el converteixen en un 0, i fer l'addició d'aquesta manera, només com era d'esperar amb regularitat decimal o qualsevol altra base. Refredar. Així que com he dit abans, tot el que que passa sota el capó del nostre ordinador es fa en de 0 i 1 de, o binari. Llavors, ¿com ens expressem, per exemple, lletres o números o caràcters? I la resposta a això és ASCII. ASCII és un mapeig entre caràcters que normalment veuríem al Idioma Anglès com a doctors, B, De C, de subratllat, guions i res d'això. I és que els mapes d'un valor ASCII. Un valor ASCII és només un número que pot ser entès per l'ordinador. I igual que pot fer la suma i resta amb nombres, es pot fer amb valors ASCII. Així que en aquest exemple, el que serà aquesta imprimir? Sí, de manera que només un espai espai espai B C D. A on va ser el meu ratolí? Noteu que podeu definir un int a 65. I a imprimir que utilitzant cent C, que interpretarà això com un caràcter i s'imprimirà A. De la mateixa manera, es pot declarar com un char. I quan ho imprimeixi utilitzant cent C, que interpretarà això com cent D. I igual que es pot afegir un nombre, vostè pot afegir caràcters són Valors ASCII, en aquest cas. Així que una mica de punter per a tothom. 5, com una cadena, no en realitat equivalen a 5. Així que com podem convertir el cadena 5 al sencer més 5? Alguna idea? Sí. Així que si tenim 5 com a una cadena, podem restar 0. I això ens donarà 5. I de la mateixa manera, si tenim 5 com a sencer, afegir que a la cadena de 0. I això ens dóna la cadena 5. Refredar. Ara, recordar de nou a donar una conferència en una parlem d'algorismes. Llavors, com és el que realment volem un ordinador per fer coses interessants? Ja saps, només sumar i restar nombres i coses fora d'impressió no és que emocionant. En general, volem que el nostre ordinador per realitzar algun tipus d'algorisme. Cosa una mica més complex que només l'aritmètica simple. Un algorisme és només un pas a pas conjunt d'instruccions de com realitzar una certa task-- igual que una recepta. Potser recordi el primer dia de classe on David havia explicar-nos una habitació de les persones i quantes persones estaven a l'habitació. Vostè podria estar acostumat a recompte un per un. 1, 2, 3, 4. En aquest cas, un algorisme de temps lineal. Però David va introduir un algoritme per que expliquis les persones a l'habitació on tothom es posa dret, vostè diu que el seu nombre a una altra persona, afegir que nombre, i una persona se senti. I repeteixes això. Això és un tipus d'algorisme. Podem analitzar una manera eficient algorisme es basa en que és temps d'execució. Però anem a parlar una mica més sobre això més endavant. Així que tots els algoritmes també pot escriure en pseudocodi. Pseudocodi és només un anglès com sintaxi utilitza per representar un llenguatge de programació. Per exemple, si volíem demanar un usuari d'endevinar el meu número favorit, que podria tenir pseudocodi com a tal. Obtenir un usuaris endevinin. Si la suposició és correcta, digui'ls si és correcta, en cas contrari els dic no són correctes. I pseudocodi és una manera de fàcil que representa una idea o un algoritme. Així que ara el que es vol realment escriure això en el llenguatge que l'ordinador podria entendre. Així que podem escriure el nostre pseudocodi i interpretar que en el codi font. Fins ara, el codi font ha de complir a una certa sintaxi un llenguatge de programació. I fins ara, al CS50, tenim estat usant majoritàriament c. Així que això podria ser el codi font de c. Més tard, en el curs, s'arriba la nit en contacte amb altres programes llenguatges com PHP. O si vostè fins i tot prendre altres classes, que podria fer Java, Python, o fins i tot OCML. Però en el nostre llenguatge de programació C, és a dir com podríem escriure el codi font de l'algorisme de pseudocodi que Que acabo de descriure anteriorment. Llavors, ¿com l'equip en realitat entendre això? Com he dit abans, en realitat només es entén zeros i uns. Llavors, ¿com arribar de la font codi per a alguna cosa que pot ser entès? Bé, tenim alguna cosa anomenat un compilador. Si vostè recorda de nou a la major part de la seva conjunts de processadors, que tenia algun tipus de programa escrit en un arxiu de punts c. I llavors hauria d'escriure make. Llavors, què està fent fer? Podeu escriure make per compilar el programa perquè algú-- qui va escriure el seu conjunt p; probablement David-- creat un arxiu make. I que diu saber per executar el seu compilador, anomenat so metàl · lic, que la voluntat a continuació, compilar el codi font d'objectar codi, que és zeros i uns que l'ordinador entén. Però una mica més tard, ens dirigirem més a fons sobre els compiladors. Així recordar pset 0, dónde-- sí, vostè té una pregunta? AUDIÈNCIA: [inaudible]? ALTAVEU 1: Si. Crec que en realitat ha d'estar en línia. Sí. AUDIÈNCIA: És com [inaudible]? ALTAVEU 1: No ho és. L'estan a cs50.net/quizzes. AUDIÈNCIA: concursos de Slash, slash 2013, slash 0 i, simplement feu clic a través de concursos 2013 i concurs 0, Revisi la secció de diapositives. ALTAVEU 1: Sí, així que si vostès volen tiri cap amunt i mirar el seu propi ordinador, això està bé també. Digues-ho de nou. AUDIÈNCIA: [inaudible]. ALTAVEU 1: Sí, [inaudible] és la variable dummy. Ah, sí? AUDIÈNCIA: [inaudible]? ALTAVEU 1: No, vagues no estan en l'examen. Ho sentim, la pregunta era, era vagues en l'examen. I no ho és. Així pset 0, vostès ha de tenir tota implementat alguna cosa amb zero. I vam aprendre una mica de programació bàsica blocs de construcció que utilitzen les ratllades. Així que donem una ullada a alguns d'aquests blocs de construcció que conformen un programa. En primer lloc és l'expressió de Boole. Les expressions booleanes són estimats i 0 d'o tot el que té dos valors possibles. En aquest cas, vertadera o falsa, dins o fora, i si o no. Un exemple d'un simple, molt simple, programa que utilitza un booleà expressió aquí. Així que perquè les expressions booleanes a ser útil, tenim operadors booleans. Aquests són els operadors que es poden utilitzar per comparar certs valors. Així que tenim i o no igual a, menor o igual que, més gran que o igual a, i menys de o major que. No obstant això, aquests operadors no són molt útils llevat que puguem combinar-los en condicions. Així que vostès podrien recordar a partir de zero i de la seva p estableix que tenia condicions. Ells són, en essència, com forquilles en la lògica del seu programa que executa depenent de si es compleix una condició. Així que una de les condicions que teníem utilitzat moltes vegades en aquest curs és el if, else, si, i les condicions la resta. Heus aquí un exemple de com vostè pot utilitzar això. Algú sap la diferència entre simplement usant les sentències if tots el camí cap avall versos if, else, si, i més combinat? Sí? AUDIÈNCIA: [inaudible]. ALTAVEU 1: Exactament. Així que si tingués si tot el camí fins a aquest manera, encara que aquesta condició torna veritable, encara seguirà provar els dos següents. Atès que, amb una cosa-si, una cosa declaració, si el que retorna true, els altres no es posen a prova. Una pregunta sobre això? Refredar. Així que utilitza una persona si-d'una persona declaració si vostè sap que només pot ser un d'aquests casos. Així que sabem que si x és menor que 0, és definitivament no serà més gran que 0. A continuació, un altre bloc de construcció que hem après són bucles. Tenim tres tipus de bucles. Per bucles, els bucles while, i fer bucles while. I, en general, quan et sentis a escriure alguna cosa, vostè ha de decidir quin dels tres que voleu utilitzar. Així que com decidir quina d'elles? Generalment fem servir un bucle for si sabem quantes vegades volem repetir a través d'alguna cosa o quantes vegades volem realitzar una tasca. Utilitzem bucles while si necessitem alguna condició de ser fidels a seguir corrent. I utilitzem fem bé és molt similar a la temps, però volem que el nostre codi s'executi en almenys una vegada. Així que fer, mentre que, el que està en el fer la voluntat sempre córrer almenys una vegada. Atès que, amb el temps, es poden no funcionar en absolut si la condició no es compleix. Qualsevol pregunta amb això? Així l'estructura d'un bucle for. Tot el que vostès han vist això. Vostè s'inicialitzi. Vostè té algun tipus de condició. Així, per exemple, podríem inicialitzar com per a i és igual a 0. i és menor de 10. I i ++. Molt senzill que hem fet. Per a un bucle while, de manera similar, vostè té tenir algun tipus d'inicialització, algun tipus de condició, i algun tipus d'actualització. Així que podem implementar el nostre bucle for també com un bucle durant l'ús d'aquest. I de manera similar amb un do while, podríem tenir una mica d'inicialització, executar alguna cosa, actualitzar-lo, i a continuació, comproveu l'estat. Així que ara les funcions. Vam posar tot junts. Podríem voler escriure alguna cosa tipus de funció. Funció comú que et poden han vist ja és principal. Principal és una funció. Té un tipus de retorn, int. Té un nom de funció, principal. I té arguments, argc i argv. Així principal és només una funció. Altres funcions que hi pugui haver utilitzat, printf printf-- és un function-- GetInt, ToUpper. Però aquests resulten haver estat implementat per a nosaltres per algun tipus de biblioteca. Si vostès recordin incloent aquesta biblioteca CS50.h o la I / S estàndard biblioteca. Sí, la pregunta? AUDIÈNCIA: És just principal inherent a c? Ho fa només una mica de [inaudible]? ALTAVEU 1: La pregunta és si principal és inherent a c. I sí, totes les funcions tenir una funció principal. És una espècie de necessari per a l'ordinador a saber per on començar executar el codi. AUDIÈNCIA: Així que no ho faria [inaudible]? ALTAVEU 1: No Alguna altra pregunta? Refredar. Així com vostè pot utilitzar una funció que està escrit per a vostè, també pot escriure la seva pròpia funció. Aquesta és una funció que algú podria han escrit per calcular el volum d'un q, per exemple. Hi ha un tipus de retorn aquí, en aquest cas int, el nostre nom i la nostra funció q llista de paràmetres. I tingui en compte que vostè ha d'escriure les dades tipus del paràmetre que desitja utilitzar o bé la funció no saber quin tipus de paràmetre he acceptarà. Així que, en aquest cas, volem un enter com la nostra entrada. Llavors per què podríem voler utilitzar funcions? En primer lloc, ideal per a l'organització. Ajuden a trencar el codi més organitzada trossos i fer més fàcil de llegir. Simplificació. Això és bo per al disseny. Quan vostè està llegint un fragment de codi i la funció principal és realment, molt llarg, podria ser més difícil de raó sobre el que està passant. Així que si ho desglossem en funcions, pot ser que sigui més fàcil de llegir. I reutilitzar-capacitat. Si vostè té un tros de codi que està sent trucada o executar diverses vegades, en lloc de tornar a escriure el codi 10 vegades en la seva funció principal, que et poden volen tornar a utilitzar-lo. I llavors cada vegada que necessita utilitzar aquest peça de codi, truqui a la funció. Així que ara si recordem de nou a zero, també parlem d'alguns conceptes, un dels quals està roscat. Tema és el concepte de múltiples seqüències de codi executar a la vegada. Així que pensin en el primer dia en què David tenia vostès Compti el nombre de persones a l'habitació. En essència, el que es va sobretot és de vostès eren córrer fils separats. I aquests fils s'uneixen per obtenir algun tipus de resposta. De la mateixa manera, en Scratch, quan es té múltiples sprites, que et poden tenir un gat i un gos. I estarien simultàniament la gestió dels seus propis guions. Aquest és un exemple de roscat. I l'altre concepte que va ser introduït en zero era esdeveniments. I quan els esdeveniments són múltiples parts el seu codi es comuniquen entre si. En Scratch, això va ser quan va usar el control de difusió i el Quan Rep blocs. I també, en problemes 4, vam una mica dels esdeveniments també. Vostès podrien haver utilitzat la biblioteca GEvent. I hi havia una funció waitForClick en què estaves esperant perquè l'usuari faci clic. I el clic, en aquest cas, seria l'esdeveniment i esperar que Click és el seu controlador d'esdeveniments. I també, mitjançant la publicació dels seus conjunts de processadors i treballant en els seus conjunts de processadors, que podria haver entrat en contacte amb alguns d'aquests comandaments. Això és el que ha escrit al seu finestra de terminal o el que sigui finestra que apareix en la seva edició en g, essencialment, navegar pel seu ordinador. Així, per exemple, les llistes de la LS contingut d'un directori. Fes directori crea una nova carpeta. CD, canvi de directori. RM, eliminar, s'elimina un arxiu o algun directori. I a continuació, eliminar el directori Elimina un directori. AUDIÈNCIA: [inaudible]? ALTAVEU 1: Sí, és clar. Ho sentim, la pregunta era si suggeriria posar aquest en el full de trucs. Podria ajudar. Si té espai, pot posar-se'l. També és a generalment prou bo de recordar, perquè quan l'utilitza és possible que vulgueu simplement té memoritzat. Això va a fer la seva vida molt més fàcil. He respost a la seva pregunta? Així que ara, parlem una mica breument sobre les biblioteques. Però els dos principals que hem estat utilitzant fins ara en el curs són I / S estàndard i CS50. Quin tipus de coses s'inclouen a la llibreria estàndard d'E / S? Sí, fins ara hem fet servir printf. En CS50, hem utilitzat getInt i GetString. I la cadena de tipus de dades també passa per a ser declarat en aquesta biblioteca CS50. Parlarem una mica més en profunditat sobre com les biblioteques funcionen i com interactuar amb la resta del seu codi. Però aquests són els dos principals que haver estat en contacte amb el que va d' el curs. Tipus. Aquests són bons per recordar el molt cada tipus està representat per o com molts bytes cada un de tipus requires-- int, 4 bytes; char, 1 byte. Float és de 4 bytes. Què és un doble? AUDIÈNCIA: [inaudible]. ALTAVEU 1: Sí, de manera que un flotador però doblar la mida. Què hi ha d'un temps? AUDIÈNCIA: [inaudible]. ALTAVEU 1: OK. Què és un temps? AUDIÈNCIA: [inaudible]. ALTAVEU 1: Sí, el doble d'un int. Sí. AUDIÈNCIA: [inaudible]. ALTAVEU 1: Long [inaudible]. I després d'un llarg temps és el doble. AUDIÈNCIA: No, no. Una llarga és només un int. Depèn de l'arquitectura abans de la [inaudible] int i tenen la mateixa mida. [Inaudible]. ALTAVEU 1: Així que una llarga i 1 int són els mateixos. I després d'un llarg temps és el doble de la int. Refredar. I llavors, ¿quin és l'últim tipus? AUDIÈNCIA: Punter. ALTAVEU 1: Sí, així que va aprendre una mica sobre els punters. I sense importar el que un punter és assenyalant A-- que podria ser una estrella de carbó o int star-- sempre 4 bytes per a un punter. Preguntes sobre això? Sí? AUDIÈNCIA: [inaudible]? ALTAVEU 1: Així que un llarg i un int són el mateix en aquest aparell CS50. AUDIÈNCIA: L'aparell està completament intercanviables. ALTAVEU 1: Si. Així que un llarg, llarg és el doble d'un int. AUDIÈNCIA: Aquest és el de 32 bits? ALTAVEU 1: 32 bits, si. AUDIÈNCIA: Així que [inaudible]? ALTAVEU 1: Sí, si no ho fa dir de forma explícita, que ha d'assumir una mica 32. AUDIÈNCIA: Seria dir alguna cosa com assumir una arquitectura com l'aparell. Per 64 bits, l'únic que canvi són llargs i punters. Tots dos [inaudible]. ALTAVEU 1: Sí? AUDIÈNCIA: Pregunta. Així que en una de les proves de pràctica, es pregunta sobre un int sense signe. Llavors, ¿com hauria de determinar d'un int [inaudible]? ALTAVEU 1: Un signe a és també 4 bytes. Però el que és diferent sobre una signatura int i un int sense signar? AUDIÈNCIA: [inaudible]. ALTAVEU 1: així. Un pot representar valors negatius. Però com es fa això? AUDIÈNCIA: [inaudible]. ALTAVEU 1: Sí, s'estalvia 1 bit per representar el signe. La firma té un bit que representa el signe. I sense signe només és de tots els positius. AUDIÈNCIA: OK. Així que vostè diu que és un doble dues vegades la grandària d'un flotador? ALTAVEU 1: Feu doble és dues vegades la grandària d'un flotador, si. AUDIÈNCIA: Com funciona un punter per a un llarg temps [inaudible]? ALTAVEU 1: Llavors la pregunta és: com el punter a una llarga long-- com és que només quatre bytes quan un llarg, llarg dels seus 8 bytes. Així que recorda el que és un punter, essencialment, en el valor molt base. AUDIÈNCIA: [inaudible]. ALTAVEU 1: Sí, així que un punter és només una posició de memòria. Així que no importa la quantitat d'espai aquest punter està apuntant. Només necessita 4 bytes per realitzar un seguiment d'aquesta ubicació de memòria. Alguna altra pregunta? Refredar. Així que l'última cosa que tinc és la sortida estàndard. Vostè ha d'utilitzar amb freqüència prou per tu per recordar. Però això és quan fem servir printf, per exemple. I tenim aquests marcadors de posició que van ser cridats codis de format. Així cent c char, cent i per int, i també podem utilitzar el percentatge d. És la mateixa cosa. Però, en general, en què CS50 tractar d'utilitzar el percentatge de i. F Percentatge de flotador. Ld Percentatge de llarg de llarg i cent s per cadena. De la mateixa manera, hem estat utilitzant alguns d'aquestes seqüències d'escapament. Per exemple, la barra invertida n per a la nova línia. Això és només per quan estàs de formatar el seu codi per a la impressió f. Sí? AUDIÈNCIA: Quin és el percentatge de d? ALTAVEU 1: tant el dubte és el que és cent per d? Percentatge d és per sencers. Percentatge di cent i són els mateixos. AUDIÈNCIA: Quina és la diferència entre barra invertida n i barra invertida r? ALTAVEU 1: Llavors la pregunta és quin és el diferència entre N i reacció r contraatac? Crec barra invertida r és-- AUDIÈNCIA: Així barra invertida r només implica torna al principi de la línia sense haver d'anar a una nova línia. Així que si imprimeix una barra invertida r i tornar al principi de la línia a continuació, s'imprimeix més coses, es sobreescriu el material que ja està en [Inaudible]. Atès que, en realitat n va a una nova línia i va a [inaudible]. ALTAVEU 1: Bé, alguna altra pregunta? Bé. Vaig a donar-ho fora de Donen qui continuarà. [Aplaudiments] DAN: Molt bé. Així que vaig a estar parlant d'una altra àmplia gamma d'idees de la classe que siguin representant d'aproximadament dues setmanes i el començament de la setmana tres partint amb la fosa, que és només una forma de el tractament d'un valor d'un cert tipus com un valor d'un tipus diferent. Així que podem fer això amb caràcters a ints, flotadors per ints, i longs llargues duplicar. Totes aquestes coses poden ser utilitzats com a formes de tractar algun valor numèric Char menys com algun altre valor numèric. Així que hi ha alguns problemes amb això, de Per descomptat, que ve quan llances coses com float a ints. Així que això és una mica estrany. Tenim un flotador que és de 1.31. Ens multipliquem per 10.000. I llavors ho imprimim com un int. Què significa aquest resultat? 10.000 vegades 1.31. Així que 13.000, és que la conjectura? AUDIÈNCIA: Crec que és de 10.000. DAN: Així que estic multiplicar per 10.000 abans que em llançar. AUDIÈNCIA: Oh. No hauria setembre 1 i alguns números de 0? DAN: Vostè podria tenir alguns dígits estranys. Així bé, és 1,3 vegades 10.000. Així que això és 13.000. I això weird-- addicional AUDIÈNCIA: 13100. DAN: 13100. Gràcies, Rob. I això weirdness-- addicional aquest 9,9-- és simplement perquè aquest càsting va acabar arrodonint on que no hauria de tenir. Sí. AUDIÈNCIA: El càsting succeeix després de tota la resta? DAN: Així que ja tinc això en impressió, fa aquesta multiplicació abans que es fa aquest càsting. AUDIÈNCIA: [inaudible]. DAN: Crec que projectaria primer, sí, el que seria de 10.000. Una mica més? Refredar. Així que això és 13.099. Per què passa això? La imprecisió. Els flotadors no són perfectes. Només poden representar els nombres a un cert nombre de xifres significatives. Així que si imprimim 8 sig figues a aquest flotador, obtenim una espècie de nombre lleig aspecte. I això és perquè 1.31 no pot amb precisió ser representat per simples potències de dos a la màquina. Pel que acaba tenint el més proper Suposo, que acaba ser una mica baix. Té sentit? Okay. Ara, amb commutació són una forma diferent de fent sentències condicionals on tots els que ens importa és una sola variable. Així que en aquest exemple en particular, estem obtenir un nombre enter d'usuari. I llavors estem veient el que és sencer. Presumiblement, és el nombre entre un i quatre. Això és el que estem demanant. Així ho fa un interruptor de el nom de la variable. Després de configurar els casos de possible valora que podria ser. Així cas que un, diuen que és baix. I després es trenca per sortir de la condició de l'interruptor de manera no seguir endavant. En la següent cas-- així que cas dos i cas tres-- si és el cas de dos que només baixa a la primera línia de codi que veu com amb cas, tres, fins que veu un descans. Així que la raó s'obté cas que un només impressió baix és perquè tenir aquest descans aquí. Si jo, per exemple, ignorat aquest break-- si em vaig llançar aquest breakaway-- seria imprimir baix, i llavors seria imprimir mitjà, i després es trencaria. Així descansos són una part important de canviar les condicions i haurien d'estar-hi. Els casos que no figuren explícitament són manejades pel defecte cas l'interruptor i sigui fet fora. AUDIÈNCIA: So 1, 2, 3, i 4 seria n? DAN: Valors que n pot ser. Sí. Sí? AUDIÈNCIA: Així que quan vostè té que [inaudible]? DAN: Vostè imprimiria baixa, i després seria imprimir mitjana i a continuació, es trencaria. AUDIÈNCIA: Per què seria imprimir mitjà si [inaudible]? DAN: Així que tot sota un cas abans d'un descans cau sota. Així cas una còpia d'impressió és el cas per sota de un com és aquest següent impressió. Sí? AUDIÈNCIA: [inaudible]? DAN: Així que aquest nombre és només un particular, valor que aquesta variable pot prendre, no? Té això sentit? Sí. AUDIÈNCIA: [inaudible]? DAN: Sí, el cas de dos imprimiria mitjà i després trencar. AUDIÈNCIA: [inaudible]? DAN: Crec que qualsevol? Quins altres tipus de dades es pot canviar de nou? AUDIÈNCIA: Vostè pot canviar sobre qualsevol tipus de dades. Però només significa alguna cosa més caràcters i ints i coses per l'estil, ja que si vostè està canviant més d'un punter que en realitat no té sentit, commutació de càrregues, si és que anem a vostè fa això, perquè de punt flotant en la precisió, no ho faries realment vull fer això de totes maneres. Així que més o menys, a sencers i caràcters i coses per l'estil. DAN: Sí, és quan tens explícita valors que vostè sap, crec, pot ser que un canvi és realment útil. Bé? Okay. Abast és el rang que un declarat la variable s'estén. Així que en aquest petit tros de codi que tinc, que estaria ple d'errors. I la raó és que vaig declarar això int i dins l'abast d'aquest bucle. I llavors jo estic tractant de fer referència a aquest i fora d'aquest àmbit de bucle. Així que, bàsicament, es pot pensar en l'abast com tot el que es declara amb l'interior d'un conjunt de claus només hi ha dins d'aquestes claus. I si es tracta d'usar aquesta variable fora d'aquestes claus, podràs obtindrà un error del compilador. Sí? AUDIÈNCIA: Així que aquest no funciona? DAN: Això no funciona, si. Cordes. String a char *. Són exactament el mateix. Ells són només punters a caràcters. I qualsevol cadena que té han d'acabar amb barra invertida zero, que és just una convenció c. Es diu el terminador NULL. I NULL-- N majúscula, capital d'U, el capital L, de capital L-- no és el mateix que el Terminador NULL. Això és un punter. Aquest és un personatge. Són molt diferents. Recorda. Serà en el qüestionari, probablement. No he vist la prova. Sí? AUDIÈNCIA: Així NULL és, per exemple, el punter? DAN: Si. AUDIÈNCIA: Què fa [inaudible]? DAN: Si, diuen, malloc es diu quan vostè no tenen prou memòria per obtenir sigui quina sigui la mida que vostè està demanant, malloc tornarà NULL. És, bàsicament, cada vegada que una funció és suposa que tornar un punter, de comprovar contra NULL perquè NULL és un Bueno-- bastant és, més o menys, el valor de les escombraries. És un zero en la mesura com punters van. Cada vegada que es crida a una funció, que retorna un punter. Vostè va a voler comprovar que Segur que aquest punter no és NULL perquè NULL és molt comú. És una espècie d'un retorn de les escombraries. Així que si alguna cosa no anava bé, simplement tornar NULL en el seu lloc. AUDIÈNCIA: [inaudible]? DAN: Sí, i això és això. AUDIÈNCIA: [inaudible]? DAN: Spell com aquest. És el terminador NULL. És minúscules N-O-L-L si està lletrejant ella. AUDIÈNCIA: I em vaig anar esquena i provat. I si tractes de posar un punt flotant valor en un interruptor, que va a cridar a vostè dir, declaració requereix l'expressió de tipus sencer. DAN: Cal anar. Però sí, ho era la pregunta? AUDIÈNCIA: [inaudible]? DAN: Així de capital N, O majúscula, el capital L, L majúscula és una cosa real c. És el punter NULL i voluntat només ser tractats com a tals. Vostè mai va a tractar d'explicar el Caràcter nul i veure qualsevol altra manera que això. Sí? AUDIÈNCIA: Així que tornant a char màxim o alguna cosa en les notes, oi encarnar la mateixa funció com [inaudible]? AUDIÈNCIA: Així que et refereixes tornar max caràcters de getchar, o sigui el que sigui? AUDIÈNCIA: Si. AUDIÈNCIA: Sí, en general termini per a totes aquestes coses són valors sentinella. Així com tornar int max de getInt i truita màxim de getchar, és suposa que és igual, d'acord, si aquestes coses estan tornant a nosaltres, alguna cosa va sortir malament. Per als gossos, només passa que té aquest valor sentinella que tothom convé. I això és el que torni quan les coses van malament. Així max char és el que estem utilitzant per representar alguna cosa com NULL o getchar. AUDIÈNCIA: Així que si vostè està provant getchar, podria vostè acaba de posar NULL? Seria això una diferència? DAN: No podies comprovar NULL. Caldria revisar caràcters màxim pel fet que el valor de retorn de la funció és un caràcter no un punter. Sí? AUDIÈNCIA: Aquesta pregunta per a la longitud de la cadena. Això inclou el caràcter NULL? DAN: No I això és en realitat la forma de longitud de sèrie sap de parar perquè es passa per la matriu de caràcters fins es veu un caràcter NULL. I llavors és com, tot bé, he acabat. AUDIÈNCIA: [inaudible] de cinc? DAN: Hola seria 5. Sip. Així arrays són contínues blocs de memòria. Ells tenen accés immediat al dir que el nom de la matriu i, a continuació, a arrissat suports, qualsevol que sigui l'índex que vol anar a, que estan indexats a partir de zero a la longitud de la matriu almenys 1. I estan declarats pel tipus de la El que vostè està emmagatzemant al matriu, el nom de la matriu, i després qualsevol que sigui la mida és d'aquesta matriu. Així que aquesta és una matriu de caràcters de longitud sis que té aquests valors. Sí? AUDIÈNCIA: [inaudible]? DAN: Si. AUDIÈNCIA: [inaudible]? DAN: Si vostè té el que està passant en la matriu ja feta. Així que es podria especificar aquesta vegada com, per exemple, char, qualsevol que sigui el nom de la seva matriu és, claudàtors buits és igual arrissat preparar H I coma coma coma L L comes O coma caràcter NULL i clau de tancament. Això també funciona com una declaració. AUDIÈNCIA: [inaudible]? DAN: Llavors cal tenir la mida ja va fer. AUDIÈNCIA: [inaudible]? DAN: Si. Molt bé. Arguments de la línia d'ordres són una forma de obtenir l'entrada de l'usuari com arguments a principal. Principal té dos arguments. El nombre d'arguments que s'està passat al llarg de la línia d'ordres i un vector cadena o una matriu de cadenes de tots els arguments. Així que si, per exemple, vaig trucar a una funció com un punt a 1 plaça, 2 plaça, tres, argc seria 4. I el argv 0 seria un punt fora. Argv1 seria 1. argv2 seria 2. argv3 serien 3, en aquest cas particular. Sí? AUDIÈNCIA: [inaudible]? DAN: L'últim element de la matriu perquè la matriu és la longitud argc més un argb, l'últim element és el punter NULL. És més argc 1. Així que en el cas que acabo de dir, que es argv 0 és un punt fora. argv 1 és 1 argv2 és 2. argv 3 és 3. argv 4, que és un més gran que argc seria NULL. I això és el punter NULL. Sí. I això és perquè la cadena és un estel char és un punter. Així que ha de ser del mateix tipus. Sí? AUDIÈNCIA: Dues preguntes. Així que un, ¿quina és la diferència entre això i GetString altra d'un tipus en el motor d'usuari? I dos, que s'emmagatzema en seva història recent? Així com, GetString faria ser [inaudible]? DAN: On s'emmagatzema? No sé on s'emmagatzema. AUDIÈNCIA: Així que, en realitat, ja saps com qualsevol funció que crida als seus arguments s'emmagatzemen a la pila? Així argc i argv són arguments a principal i estan a la pila, o realment just per sobre del que vostè pensa com el començament de la pila. Quina era l'altra part de la pregunta? AUDIÈNCIA: Quina és la [inaudible]? DAN: Sí, és només una manera diferent d'aconseguir la entrada de l'usuari. Lleugerament més eficient i d'aquest un és més pràctic per als scripts perquè només pot passar arguments al seu principal funció en lloc d'haver d'esperar per als usuaris que no té cap usuari. AUDIÈNCIA: I sí, aconseguir cadenes seria [inaudible]. Seria emmagatzemar les coses que necessita. DAN: Sí? AUDIÈNCIA: [inaudible]? DAN: Sí, argv 0 sempre inclou la punt slash de la crida a la funció. Sí? AUDIÈNCIA: [inaudible]? DAN: Sí, cada un dels arguments són va acabar en caràcter NULL perquè són cadenes. AUDIÈNCIA: [inaudible]? DAN: Sí, argc argv és un punter NULL. AUDIÈNCIA: [inaudible]? DAN: Ah, sí. Sí, ho sento. AUDIÈNCIA: Així que [inaudible]? DAN: tant el dubte és si vostè tingués la punt de línia d'ordres slash un punt a terme 1, 2, faria el número de línia d'ordres arguments siguin dos o haurien de ser tres? AUDIÈNCIA: Crec que no fa realment importa. Tendeixo a dir, oh, que no va passar qualsevol argument de línia d'ordres quan, òbviament, que va cridar a la funció. Així que tendeixo a excloure vocalment la funció des de la línia d'ordres arguments, encara que és inclòs en argv. DAN: Però si era al test-- Sí-- i també si vostè diu alguna cosa com argc és igual a 3, vostè està a la caixa forta de peu. Sí? AUDIÈNCIA: [inaudible]? DAN: Crec que si en lloc de cridar a aquest en argc i argv cadena entre parèntesis però va mantenir els mateixos tipus i acaba de cridar ells alguna cosa diferent com un i b, seguiria treballant? I no per això deixa treballar, vostè sol-- en lloc d'utilitzar argc-- haurà d'utilitzar a i b. Sí? AUDIÈNCIA: [inaudible]? DAN: tant el dubte és GetString és va a emmagatzemar la memòria en el munt perquè GetString és char *. Emmagatzema la memòria en el munt, ja que demana ara malloc al real aplicació de GetString. Acceptar, seguir endavant. Seguretat. Així que perquè sigui realment segur, vostè confia en no un i permets que ningú l'accés a qualsevol de la seva informació, que és la raó per cadascun construeix les seves pròpies màquines, els seus propis sistemes operatius, tota la seva programes a partir de zero, i, òbviament, no connecti a qualsevol altra màquina a través d'Internet. Així que els ordinadors són insegures. Ells realment són. Hem de confiar en altres persones. I la idea de la seguretat és que ets tractant de limitar la quantitat de la confiança que vostè necessita. I un dels mitjans que fa que és a través de la criptografia. La criptografia és, en essència, tenim secrets. A vegades hem de passar els nostres secrets al llarg a través, per exemple, l'Internet o altres coses. I no volem que la gent conèixer aquests secrets. Així que xifrem els nostres secrets en un camí que esperem que ningú pot imaginar. Així que used-- a través del curs d'aquest class-- coses com xifrat César i [Inaudible], que són alhora molt, molt formes insegures de l'encriptació de les coses. Són fàcils d'esbrinar el que són i quins són els seus secrets són. El món real utilitza molt més esquemes de xifrat complicats. I no entrarem en molt més que això. Depuració. GDB és el millor. Vaig a insistir en això una altra vegada. Utilitzeu GDB tot el temps cada vegada que tingui un problema. Les comandes que són útils en el BGF són trenques, el que passa, ja sigui una línia nombre, un nom de funció, essencialment on en el codi que desitgi detenir, i ser capaç de prendre el control. Imprimir pren una variable i imprimeix qualsevol que sigui aquesta variable és en aquest moment de la seva execució. Següent mou la seva execució al llarg d'un sol pas. I pas passos dins d'una funció en la seva execució. Altres coses s'executen, que és com en realitat s'executa el codi. Continuar pren totes les mesures necessàries per arribar al següent punt de ruptura. I n'hi ha molts, molts altres. Busca'ls. Són excel · lents. Sí? AUDIÈNCIA: [inaudible]? DAN: Sí, que és un depurador. Així que un depurador és un programa que li permet comprovar el programa. No és un programa que troba errors per que, però, que seria gran. I finalment, per a mi és la recerca. Així que els tipus de cerca que parlem sobre aquesta classe són recerca lineal, que és just que es mira a través de cada element de l'espai de recerca, un element a la vegada, fins trobar el que vostè està buscant o fins que arribi Al final del seu espai de recerca en el qual assenyala que dius que no es podia trobar l'element que estaves buscant. I això porta temps, en el millor constant, que és 0 d'1 i en el pitjor lineal temps, que és 0 de n. Hi binària, que necessita elements sòrdids. Vostè va a la meitat dels seus elements, veure si l'element que està buscant és més o menys que l'element que estàs en el medi. És que és més gran, es diu que el fons de la seva recerca d'espai és la seva ubicació actual, el medi, i reiniciar el procés. Si és menor, es mira diuen que ell-- sí, què passa? AUDIÈNCIA: [inaudible]? DAN: Si. Qualsevol tipus d'espècie que s'ha ensenyat en la classe és un joc just per a la prova. [Rialles] DAN: I el fet que vostè no ha tingut que ho faci per una sèrie de problemes, que és just joc per a la prova. AUDIÈNCIA: Podem anar-hi com A-- DAN: S'ha anat una altra vegada. ALTAVEU 2: El codi real per [Inaudible] és a study.cs50.net. Així que si ens fixem en el problema la pràctica a la pàgina de combinació de tipus de study.cs50.net, no és el codi per a la implementació de fusionar espècie. Així que vostè no ha de posar en pràctica vostè mateix aquesta nit. Però assegureu-vos que entén que en lloc que simplement memoritzar-la. AUDIÈNCIA: [inaudible]? ALTAVEU 2: La pàgina de combinació de tipus de study.cs50.net, hi ha una pràctica problema que, si fa clic a través de la problema, al final hi ha una solució, que és la combinació aplicació espècie. Però assegureu-vos que entén que i no només memoritzar o copiar cap avall. AUDIÈNCIA: I una perfectament vàlid problema per a l'examen seria una cosa així aquí hi ha una llista. Què fa aquesta llista sembla després un pas de seleccions tipus o ordenació per inserció o el que sigui. Una iteració completa de la llista. Així que encara que no acaba damunt de necessitar codi per a això, cal comprendre que suficient per saber com va que la modificació d'aquesta matriu. DAN: Això és tot per a mi. [Aplaudiments] LUCAS: Hola a tots. El meu nom és Lluc. Vaig a parlar de la recursivitat, tot les classes que hem après, i un mica de tots els punters. D'acord? Així que primer de tot, la recursió. Què significa dir que és una funció recursiva? AUDIÈNCIA: Trucades en si. LUCAS: OK, diu a si mateix, si. Així que t'agrada aquesta foto, per exemple. És com la imatge a l'interior d'una imatge i així successivament. Així, per exemple, pot tener-- com Dan que parlava de cerca binària. Una manera en què la recerca binària és recursiu és el fet que ets tractant de trobar un nombre. Així que anar al centre. I a continuació, comprovar si els números allà a l'esquerra ia la dreta. I llavors si vostè descobreix que el nombre és serà de l'esquerra, que és la mateixa cosa com fer la recerca de nou, però només a l'esquerra de la llista. Així que així és com sona com que és recursiu. Així que és per això que vostès tenen recursiva solució per merge sort. OK, així que aquí està un exemple. Així que diguem que jo vull triar tots els números d'1 a n. Puc adonar-me que la suma dels n nombre és n més n menys 1-1. Però llavors, si miro n almenys 1 més n almenys 2 més 1, que és el mateix cosa com nombres la suma fins n menys 1. Així que puc dir que la suma d'una quantitat igual és igual a n més la suma de n almenys 1. Té això sentit? I jo també tindria una mica més anomenat el cas base, que és que la suma dels nombres fins a zero seria zero. Així que tan aviat com arribi al nombre zero, d'aturar el recompte. Té això sentit? Així que aquí està un exemple de com Puc aplicar això. Així que tinc aquesta funció en alguns. Per això es necessita un enter n. Així que aquí primer comprovo si n és menys o igual a zero. Així que si és menor o igual a zero, I tornar zero, que és el nostre cas base. En cas contrari, només pot tornar n més la suma dels números de un a n menys un. Té sentit? Okay. Així que aquí està el que sembla. Té suma de 2 parells 2 més la suma d'1. I alguns 1 és 1 més l' suma 0, que és 0. Té sentit? Així que si ens fixem en la pila de la seva programa, això és el que sembla. En primer lloc, tenim la funció principal. I a continuació, la funció principal anomenada suma 2. I a continuació, suma 2 que va a dir, oh, suma 2 és igual a 2, més la suma d'un. Així que afegeixo suma d'1 a la pila. I la suma d'1 va a cridar suma 0, que també serà afegit a la pila. I llavors cadascun d'aquests els que estan a la part superior d'un altre haver de tornar abans que els altres poden seguir endavant. Així, per exemple, aquí, suma de 0, en primer lloc, es va a tornar 0. I a continuació, escolliu suma d'1. Després suma d'1 va a retorna 1 a la suma de 2. I finalment, suma de 2 va per tornar a la principal 3. Té això sentit? És molt important entendre com la pila està treballant i tractar de veure si té sentit. Acceptar, de manera que la classificació. Així que per què és important la classificació, abans de res? Per què hauria d'importar? Algú? Dóna'm un exemple? Sí? AUDIÈNCIA: [inaudible]. LUCAS: Sí, està bé. Així que vostè pot buscar de manera més eficient. Això és una bona manera. Així, per exemple, tenim una gran quantitat de coses, en realitat, en les nostres vides que s'ordenen. Per exemple, els diccionaris. És molt important tenir tota la paraules en algun tipus d'ordre que pot accedir fàcilment. Així que això és el que estava dient. Vostè pot buscar de manera més eficient. Penseu en el difícil que seria tenir un diccionari en el qual les paraules estan en ordre aleatori. Vas a haver de veure, més o menys, cada paraula fins que trobi el paraula que vostè està buscant. Si utilitzeu Facebook També, quan el que busques en els teus amics, ets veurem que Facebook posa a la seva amic més proper és al cim dels que no parla amb tant. Si vostè va tot el camí fins a la part inferior de la llista d'amics, vas a veure persones que probablement ni tan sols recordi que vostè és amic de. I això és perquè les classes de Facebook seus amics en funció de com a prop està d'ells. Així que l'organització de les dades. També Pokémon. Així que ja veus que tots els Pokémons tenir números. I això és com un fàcil forma d'accedir a les dades. AUDIÈNCIA: Accés a Pokémon. LUCAS: Si. AUDIÈNCIA: [inaudible]. LUCAS: Yep. Acceptar, de manera que la selecció de classificació. Selecció tipus va a seleccionar el menys valor sense ordenar d'una llista cada temps en cada iteració. És una mica com el tipus que ho fa en el seu cap quan vostè està tractant de ordenar una llista a la mà. Bàsicament, tot el que fem és mirar per al número més petit. T'ho poses a la llista ordenada. I després busca la següent nombre més petit. I després segueixes fent que i així successivament. Així que la selecció espècie és, bàsicament, que seleccionar cada vegada que el més petit valor sense classificar. Poseu al final de l'ordenada part de la llista. I seguir fent això. Així que anem a veure ràpidament el que això s'assembla. Així que aquí està l'ordenada i la llista sense ordenar. Així que per l'ordenada de la llista, és inicialment buida. I després vaig a seleccionar el menor nombre aquí, que és 2. Així que tinc el número 2 i poso a la part davantera de la llista. I llavors miro a la immediata inferior element, que és 3. Així que el vaig posar al final de la llista ordenada. I després segueixo fent això. Trobada 4 i el vaig posar al final. Trobar 5 i el va posar al final. I mira com tots aquests moments que Estic dient el va posar al final és, bàsicament, el canvi de dues valors. D'acord? I després l'última, que acaba de tenir un element més. Així que ja està solucionat. Acceptar, de manera que l'ordenació per inserció. L'ordenació per inserció que tindrem també aquesta cosa de tenir un ordenat i una llista sense ordenar. L'únic és que cada vegada que va a afegir un element a l'ordenada llista, que acaba de recollir l'element que està al davant de la llista sense ordenar. I després vas a trobar el posició en què ha d'estar en l'ordenada part de la llista. Anem a veure què això és així això té més sentit. Així que al principi, per exemple, estic intentant per inserir el número tres de la part ordenada de la llista. Així que la llista no té res. Així que només puc posar el número 3. Ara, vull afegir el número 5 a la part ordenada de la llista. Així que miro el número 5. M'adono que és més gran que 3. Així que sé que ha de ser després de les 3. Així que vaig posar 3 i 5. Llavors vull inserir el número 2. M'adono que el nombre 2 és en realitat durar llavors tots dos 3 i 5. Així que en realitat he de posar tot l' camí en el principi de la llista. Així que he de fer, classe d', traslladar tota la elements en la llista ordenada de manera que pugui fer espai per al número 2. Llavors veig el número 6. Veig que hauria de ser després de les 5. Així que el vaig posar aquí. I, finalment, em veig en el nombre 4. I m'adono que hauria estar entre 3 i 5. I llavors em vaig posar aquí i canvi tots els altres elements. Té sentit? La classe de bombolla. Així ordenament de bombolla és bàsicament el que està va a fer-- en diem bombolla espècie, perquè vostè va a través de la llista-- en realitat és millor que em mostro t'agrada esto-- i vas a comparar nombres adjacents. I vostè va a canviar la seva posicions si no estan en l'ordre correcte. Així que, bàsicament, el que va a passar és que aquí, per exemple, Té 8 i 6. Vostè sap que l'ordre de classificació serà en realitat ser de 6 i 5, oi? Així que vas a canviar les ordres. Llavors veig 8 i 4 aquí. I jo faig el mateix. Em canviaré de nou. I, finalment, 2 i 8. També els swap. Es diu la classe de bombolla perquè després cadascuna d'aquestes iteracions, en realitat, el major número a la llista rep tota el camí fins al final de la llista. Té això sentit? Perquè manté intercanviar i movent cap a la dreta. OK, així que aquesta és la segona iteració. Seria el mateix. Vaig a fer un intercanvi i a continuació, l'últim. I que no hi ha swaps i la llista està ordenada. Així que a la classe de bombolla, que bàsicament mantenim anar a través de la llista i l'intercanvi coses fins que m'adono que jo no vaig fer qualsevol swaps fent aquesta iteració, que significa que la llista ja està ordenat. Té sentit? Anem a parlar una mica sobre el temps de funcionament. Així que és el que vostès recordin Gran O, Omega, i Theta? Sí? Bé, què és Big O, en primer lloc? AUDIÈNCIA: [inaudible]. LUCAS: Sí, es diu el pitjor cas temps d'execució, la qual cosa només vol dir que és quant espera el programa prendre per funcionar. Igual que, en termes de-- en aquest cas-- n. El nombre d'elements en la llista en el pitjor dels casos. Igual que, en el pitjor dels casos possibles. Així que per a la classe de bombolla, per exemple, tenim Big O de n quadrat. Per què hem de? Per què és la classe de bombolla Big O n quadrada? AUDIÈNCIA: [inaudible]. LUCAS: Sí, de manera que el pitjor dels casos serà que vaig a haver de fer n iteracions. Així que cadascuna de les iteracions es va a portar l'element més gran fins al final de la llista. Així que el pitjor dels casos és que tinc per fer aquesta cosa n vegades. I per a cada un d'aquests moments, he de fer n swaps perquè he de comparar cadascun dos elements. Així que per això està n al quadrat perquè és n vegades n. Llavors, la selecció de gènere és també n quadrada perquè, per a cada iteració, he de mirar cada element individual a la llista. I després trobar el més petit, el que significa que he de mirar a través de n elements. I he de fer que n vegades perquè He de seleccionar tots els elements n. Una ordenació per inserció és també n quadrada pel fet que el pitjor dels casos ho farà ser, un, he de inserir n nombres, oi? Així que ja sé que vaig tenir n iteracions. Però per a cadascun d'aquests nombres, si tingués per mirar a tots els números en la llista ordenada i el va posar tot el camí a la part davantera, que serà n quadrada perquè serà n vegades n de nou. Té sentit? Què passa amb omega? AUDIÈNCIA: [inaudible]. LUCAS: És el millor dels casos. Així és com, en un munt de vegades per classificació, el millor dels casos és quan la llista ja està ordenat. Així que vostè realment no té de fer res. La classe de bombolla té la millor dels casos de n. ¿Coneix usuaris per què? AUDIÈNCIA: [inaudible]. LUCAS: Sí, si vostè no perd de si la ració de dades tenia cap swaps o No, si vostè té una mena s'estableix a veritable si hi havia una iteració, si el llista ja està ordenat, bàsicament, el que passarà és que vaig a intentar canviar cada dos elements adjacents. Vaig a veure que no hi ha swaps. I jo acabo de tornar immediatament. Així que això significa que jo només havia de anar a través de la llista una vegada. Així que és n perquè em veig en n elements. Per què la selecció tipus n quadrar? Sí, encara que la llista està ordenada, per cada iteració de l'ordenament per selecció, em de seleccionar l'element mínim. Així que això significa que he de sortir a buscar en tots els elements en el sense classificar llistar i trobar el mínim per a cada iteració. Té això sentit? I l'espasa d'inserció està n perquè al cas que estic tractant d'inserir el nombres i tots els números, quan em intentar inserir, veig que estan en la posició correcta. Jo no he d'anar a veure tots els altres números de la llista sense ordenar. Així que per això serà n. Té sentit? I el que és theta? AUDIÈNCIA: [inaudible]. LUCAS: Què, ho sento? Digues-ho de nou. AUDIÈNCIA: [inaudible]. LUCAS: Exactament. Així es pot veure que només la selecció emmagatzemada en Merge sort tenir theta. I això és perquè només tens theta si tots dos Big O i Omega són la mateixa. Okay. I, finalment, fusionar és un gènere en el registre n. I llavors, com Dan estava dient, Merge sort és una espècie de la mateixa manera que vostè fa una recerca binària. Així s'obté la llista. I vostè va a tallar per la meitat. I després d'haver-los tallat en meitats més petites. I després combinar-los. Vostès recordes, oi? Acceptar, com ell deia. Acceptar, punters. Llavors, què és un punter? AUDIÈNCIA: [inaudible]. LUCAS: Una adreça. Okay. Sé que David mostra un munt de videos de Binky i coses que apunten L'un a l'altre. Però m'agrada pensar de punters simplement com una adreça. Així que és una variable que es va per emmagatzemar una adreça. Així que és només aquesta variable especial és a dir, quatre bytes de longitud. Recordeu, que per res és punter sempre de quatre bytes de longitud per al nostre 32 bits màquina perquè el cas amb l'aparell. I que només té la ubicació d'una variable dins de la mateixa. OK, així que hi ha aquesta memòria, bàsicament. Així que cada bloc de memòria té en realitat un etiqueta, que és la direcció de la memòria Slotty. Així que això significa que puc tenir un punter que apunta a qualsevol d'aquestes adreces. Així que la raó per la que utilitzarem punters és si he de recordar la ubicació que una variable específica és un record. I vostès recorda que un dels casos era si tinc una funció que si tinc realment vol intercanvi de reals, en realitat d'enviar un punter. No és la variable. Vostès es recorden? El between-- diferència ¿Com es diu? Trucant per valor i cridar per referència, no? Bé, sí. Així que truqui per valor. Quan vostè acaba d'enviar una variable funció que està enviant un valor. Així que en realitat estàs enviant una còpia de la variable. I el seu programa no podria importar menys sobre si la mateixa variable en realitat fa una còpia. I trucant per referència vol dir que En realitat estic enviant una còpia de la punter a aquesta variable. Així que això significa que estic enviant la ubicació d'aquesta variable. Així que sentir que tinc la ubicació de la variables, quan truco a la funció amb punters, sóc capaç de realitat canviar les dades que eren a la principal. Té sentit? Encara que, el punter és una còpia, l' punter encara té l'adreça real de la variable que vull canviar. Té sentit? Així que la creació de punters. Recordeu, el punter sempre tenen el tipus que s'està apuntant i després a un estel. I a continuació, posar el nom. Així que recordi que cada vegada que tingui qualsevol que sigui l'estrella, que és un punter a que qualsevol que sigui la variable escrigui que vostè tenia. Així que aquí a estrella, per exemple, és un punter i un enter. I llavors estrella char és un punter Char estrella i així successivament. Sí? AUDIÈNCIA: Què passa si tenim un punter a n x a l'estrella. Sé que crea un punter a x. També declarem x un nombre enter? LUCAS: OK, així que quan vostè diu n estrella x, no crearà un punter a una x variable. Estàs creant un punter anomenat x. AUDIÈNCIA: [inaudible]. LUCAS: Així que quan dic n estrella x, estic dient, hey, en la memòria, vaig a aconseguir una d'aquestes tres caixes. I jo vaig a dir que això serà x, que és serà un punter. I alguna cosa interessant de punters és que ens diuen que tenen 4 bytes per a una màquina de 32 bits. I la raó d'això és perquè 4 bytes són 32 bits. I màquines que són 64 bits en realitat tenir adreces punters que són 64 bits de longitud. Pel que només significa que la mida de la adreces de la màquina és diferent. Així que fer referència i Desreferenciar. Hi ha dos operadors que vostès han de recordar. La primera és ampersand. La segona és l'estrella. No confongui per aquesta estrella i això estrella, perquè recordar que, en aquest cas, vostè té n l'estrella. És com una cosa sencera junts. No hi ha espai estrella n. Així que això significa que és el tipus. Recordeu que quan vostè té l'estrella variable, ets parlant sobre el tipus. Quan vostè acaba d'estrelles i després el nom de la variable, vol dir que estàs eliminació de referències al punter, que vol dir que vostè està buscant en el punter, la recerca de la direcció és assenyalant, anar a aquesta direcció, i mirant sempre que tens aquí. Així que els dic als meus estudiants que quan es té estrella, cal pensar que és l'abreviatura dels continguts d'. Així que si vostè té un punter i fer indicador de l'estrella, que és la contingut del punter. Així que anar al que està assenyalant i mirar el contingut constant. I el signe és el mateix El que la direcció de. Així que si tinc una variable un-- com, anem a dir que em vaig fer un int és igual 3-- si vull trobar la direcció d'aquest una memòria de variables, només puc fer ampersand a. Així que és la direcció d'un. Té sentit? Així que aquí està un exemple. Aquesta manca int b i c int. Així int a és igual a 3 vol dir que Vaig a anar a la memòria. I vaig a trobar una ranura i posar el número 3 aquí. I llavors int b és igual a 4. Vaig a fer el mateix. Anar a la memòria i posar un nombre 4 en una de les caixes. I int igual a 5. Troba una altra caixa i posar un número 5. Llavors, què és aquesta línia fent fora? pa n estrella és igual a un signe. Així que primer de tot, n pa estrella. Què està fent? AUDIÈNCIA: [inaudible]. LUCAS: Sí, així que n pa estrella, primer, declara un punter anomenat pa. I després hi ha l'assignació del valor que sigui punter a la direcció d'una. Així ampersand a. Llavors, si ho faig pb estrella, el que és un pb estrella? Oh, ho sento. Això també ha desaparegut. pb estrella n. Vull dir pc estrelles. Ho sento molt. És la mateixa cosa. Però ara estic bé ar la creació d'un punter ab i després un punter a c. Sí? AUDIÈNCIA: [inaudible]? LUCAS: Sí. Així que si vas a la memòria i que vagi a la caixa que és el designador de pa, realment vas a veure l'adreça d'un. D'acord? Sí? AUDIÈNCIA: [inaudible]? LUCAS: Sí, el punter és una adreça. Mai ho oblidis. És com el més important part dels punters. Hi emmagatzemar i direcció a alguna variable. Una mica més? Alguna altra pregunta? Okay. Així Punters i matrius. Recordeu que quan faig int matriu de 3, Bàsicament, el que estic fent és que sóc, bé d', declarant en un punter. Així matriu és com un punter a una lloc específic en la memòria en la qual assignat tres ranures per a enters. Té això sentit? Així que quan ho faig int matriu de 3, el que estic fent, bàsicament, és la creació de tres ranures en la memòria. Així que em trobo tres ranures de memòria. Així que si ho faig, llavors, una matriu d'estrelles, bàsicament vol dir que el contingut de la matriu, el que significa que esborro el punter, vaig a aquest lloc que està assenyalant, i vaig posar el número u. I després, si ho faig array estrella més 1, això és el mateix que fer array suports d'un, que només vol dir que em vaig a el lloc que està apuntant a. I llavors el més gener marques em moc una posició. Així que vaig a aquesta posició, en realitat, i posar el número dos. I llavors, per fi, quan ho faig gamma més 2, vaig a on senyalador de matriu en. I llavors em mut a blocs de memòria. I llavors em vaig posar el número tres aquí. Sí? AUDIÈNCIA: array Així estrella és simplement dient que el primer punt. I vostè pot afegir 1, només perquè només estem realment referència a aquesta primera direcció. LUCAS: Si. Per què, per exemple, diem array 0, 1 camp, i la matriu 2? Que dic, per què fas 0, 1, 2, 3 en lloc d'1, 2, 3? Una de les raons és, un, equip programadors prefereixen començar comptant des de 0. Dos és perquè quan fas matriu 0, és el mateix que fer array més de 0, el que significa que vaig a aquesta posició, i no ho faig ometre qualsevol bloc de memòria. Així que no em moc de qualsevol bloc de memòria. Sí? AUDIÈNCIA: [inaudible]? LUCAS: Així que ella està demanant el que és la diferència entre fer això o fer malloc. Una de les diferències és que int sèrie 3 és la creació d'un matriu a la pila. I quan ho faci malloc, que crea en el munt. Té això sentit? Llavors, com funciona malloc realitat? Llavors, per què necessitem utilitzar malloc? El seu compilador tipus de figures tot les variables que es declaren. I es crea un espai per a tots d'ells a la pila. Així que totes les variables es van estar en algun lloc a la pila. Així que aquí està les variables d'entorn. Així que, bàsicament, l'espai per a les variables en la memòria s'assigna a temps de compilació. Així que això significa que l'equip té conèixer totes les variables per endavant. No necessita saber quin valor vostè va a posar-hi. Però cal saber com quantitat de memòria que necessita. Però ara anem a dir que, per exemple, està creant una matriu o prendre una cadena que vostè està prenent l'usuari. No sap quant temps la cadena serà, per exemple. Així que vostè no sap exactament quants blocs de memòria s'assignen, oi? Així que no té molt sentit per que diguis posar 100 caràcters. I llavors què passa si l'usuari escriu 150? Vostè serà fotut. Així que, bàsicament, no es pot estar segur de com quantitat de memòria que necessita assignar en compilar el programa. Vostè acaba de saber que el temps d'execució. Així que és per això que vostè té el munt. Així que el munt es tindrà memòria que vostè està assignant durant el durada del programa en execució. Així que, bàsicament, quan ho fa malloc, el que estàs fent és l'assignació de memòria en temps d'execució, el que significa que vostè és decidir just en aquest moment que haurien de tenir aquest record. Així que això és quan estàs assignació. Té això sentit? Així que recorda, la pila té variables que es creen en temps de compilació. I llavors el munt té variables que es creen sobre la marxa amb malloc, per exemple. AUDIÈNCIA: [inaudible]? LUCAS: així GetString Trucaré a malloc. Permetin-me parlar de malloc, i Vaig a explicar GetString. Així malloc és la mateixa cosa com l'assignació de memòria. Així que va a assignar memòria en el munt. I es va a tornar un punter a on la memòria es va assignar al. Així que quan vostè fer-- aquí per exemple indicador de l'estrella n. I llavors el punter és igual a malloc grandària de 10 polzades vegades. Estic creant un punter. I llavors estic assignant aquest punter a el valor del punter que malloc m'està donant. Malloc Així que estic demanant que vostè pot assignar espai per a 10 nombres enters. Això és el que està dient. I malloc produeix una punter a aquest lloc. Té sentit? Okay. I jo GetString està, bàsicament, fent un trucar a malloc perquè pugui assignar memòria en temps d'execució. Recordeu sempre comprovar nul perquè malloc tornarà null si no es pot assignar memòria. Diguem que vostè demana un ridícul quantitat de memòria. El seu equip no serà capaç d'assignar tant. Així malloc és només va a retornar null. Així que sempre recordi verificar si l' punter que vostè va rebre de malloc és nul · la o no, perquè, si ho és, que et poden dereferencing ser un punter i causant errors secundaris. I, finalment, no us oblideu seva memòria lliure. Malloc està creant la memòria en el munt. I vostè ha de alliberar la memòria abans que el programa acaba. OK, això és tot per a mi. Ho sentim, Rob. Gràcies. [Aplaudiments] LUCAS: Unes últimes preguntes abans que Rob ve? No? Sí? AUDIÈNCIA: no vaig veure aquesta línia. Ha pujat encara? LUCAS: Crec que Dave és pujar aviat. DAVE: Serà publicat. LUCAS: Serà en línia. AUDIÈNCIA: Depèn. LUCAS: Depèn? Okay. Sí? AUDIÈNCIA: [inaudible]? LUCAS: Sí, ha d'alliberar tot el memòria que es va posar en el munt. AUDIÈNCIA: [inaudible]? LUCAS: Sí. Cada vegada que vostè té un malloc cultura, vostè ha de tenir una cultura lliure després de deixar d'usar aquesta variable. Així malloc i lliure són sempre junts. Els seus millors amics. Sí. Rob? ROB: Vaig a anar ràpidament. I també el vídeo serà posat. Tinc el micròfon en. OK, així que la setmana 5 coses. El primer que tenim és la pila. Així que recorda que només hi ha una pila quadre per crida a la funció activa. Veurem això en un segon. I també recordar el que en realitat va en cada marc de pila seran les variables locals de les nostres funcions, els arguments que es passen al nostre funcions, juntament amb un parell altres coses que realment no hagi de preocupar. Així que aquí està un exemple de programa que, avís, principal printfing el retorn valor de foo 4. foo és només va a tornar el valor de la barra de 4 coma juny. I la barra es va a establir alguns locals n variable igual a 4 vegades juny. I després tornar n. Així que donem una ullada a la pila al llarg la iteració actual d'aquest programa. Així que la part inferior de la nostra pila. Recordeu que la pila creixi. Així que en la part inferior de la nostra pila, que tenir un marc de pila per a les principals. En iniciar el programa, el principal sempre va a estar a l' part inferior de la nostra pila. I el que està dins la nostra apilar marc de main? Així que, encara que no existeixen locals variables al principal, com he dit abans, hem argc i RGV ocupar espai interior del bastidor principal pila. Així principal ara es va a truqui a la funció foo. I això vol dir que foo va a obtenir el seu propi marc de pila. Així que ara estem a l'interior de la funció foo. ¿I què ha d'anar a marc de pila de foo? Bé, foo té un argument n. I n és igual a 4, ja que això és el que principal per a l'argument de foo. Així que ara foo va a cridar bar. Què és la barra tindrà a l'interior del seu "marc de pila? Té x igual a 4 i igual a sis. Això no és tot el que tindrem en el marc de pila perquè la barra també té una variable local n. I n que establirem igual a 24. Així que ara la barra va a tornar n. Així barra 24 està tornant a el foo marc de pila. I a causa bar torna ara, que vol dir que estem fent esclatar el marc de pila per a la barra fora de la pila. Així que tota la memòria que havia estat bar usant ara és de la pila. Ara, foo també va per tornar a 24 principal. Així que ara que foo està tornant, la memòria foo que estava usant en el seu ' marc de pila també s'ha anat. I ara, la principal va a trucar a printf. Així printf és només una altra funció. Quan cridem a printf, que serà un altre marc de pila per al printf crida a la funció. Què estem passant printf? Això és el que va a anar en el seu marc de pila. Si més no, estem passant que cent i barra invertida n i l'argument 24. Podria tenir més en és marc de pila si printf passa a ser l'ús d'alguns variables locals. No sabem. Però tot el que passa a la printf apilar marc. Es va a executar el printf. Llavors printf que està fet. Tornarà. Finalment, la principal està fet. Principal tornarà. I llavors el nostre programa està fet. Sí? AUDIÈNCIA: Estàs sortint amb [inaudible] arguments [inaudible] paràmetres? ROB: Així que hi ha una subtil diferència entre els arguments i paràmetres. I realment, en argot comú, la gent tendeix a només barrejar tot el temps. Però paràmetres són els formals nom de les coses. Així argc i argv són el paràmetres a principal. Els arguments són el que realment Va esdevenir que aquests paràmetres. Així que quan em truqui foo de 4, 4 és l'argument que estic passant. I el paràmetre n, a l'interior de foo, pren el valor 4 des 4 va ser l'argument. AUDIÈNCIA: [inaudible]? ROB: n és una variable local a la barra. n segueix sent local per foo, però és un paràmetre a foo. No és una variable local. Sí? AUDIÈNCIA: [inaudible]? ROB: bar foo és simplement trucar i retornar qualsevol retorns de barres. AUDIÈNCIA: [inaudible]? ROB: Sí, només per veure múltiples marcs de pila. Sí? AUDIÈNCIA: Per què es diu foo abans printf? ROB: Per què es diu foo abans printf? Així que podria tenir, en canvi, fer alguna cosa com int x és igual a foo de 4 i després impresa x. Però en canvi, he combinat la funció posar en l'argument de printf. Però noti que no podem realment executar la crida a printf fins que esbrinar el foo de 4 és. Així que anem a avaluar això. I només un cop que s'han fet van tornar i avaluar això. Sí? AUDIÈNCIA: Atès que tant la barra [inaudible] valor, per què nosaltres no té [inaudible]? ROB: Ells totalment han de ser int. Això no va ser capturat a múltiples passades. Així ha de ser int bar i int foo ja que tots dos dels estan tornant sencers. Buit és només si no van per tornar valors reals. Sí? AUDIÈNCIA: Si tinguessis una línia per sobre el retorn, [inaudible]? ROB: Una línia per sobre de la rendibilitat? AUDIÈNCIA: Si. Igual que si ho fessis printf i [inaudible], hauria d'imprimir dues vegades? ROB: Així que dins de foo? Si tinguéssim un printf aquí? AUDIÈNCIA: Si. ROB: Així que si teníem dret printf aquí, seria imprimir després. Des que estem cridant foo vegada dret aquí, a continuació, anem a colpejar el printf. Llavors anem a trucar bar. I llavors foo tornaran. I això és tot. Només alguna vegada trobem el printf vegada. Sí? AUDIÈNCIA: [inaudible] printf cridar foo, perquè som els primers trucar a printf i després estem passant els arguments. ROB: Així que en teoria, no és printf cridar foo? Així no. Només la finalitat que c va a executar aquestes coses és, abans que puguem cridar a una funció, tots els arguments a la funció que ser completament avaluats. Així és aquesta completament avaluada? Sí, és només una cadena. És només un valor. Llavors hem de completament avaluar això. Un cop fet això, ara tots s'avaluen els seus arguments. I ara podem fer que el trucar a printf. Sí? AUDIÈNCIA: Una pregunta. Si vostè té una funció void, ha vostè té retorn i coma? ROB: No fer un punt i coma retorn si té una funció void. Okay. Així que ara algunes coses munt. Així munt és com anem a tractar amb la gestió de memòria dinàmica. I això contrasta directament amb la pila que anomenaríem automàtica la gestió de memòria. Així que a la pila, mai s'ha per fer front a com les variables locals estan sent empès i fet esclatar fora de tot aquests marcs de pila i totes aquestes coses. Vostè no ha de preocupar per això. És automàtic. Així que el munt és manual. I la [inaudible] prové d'aquestes funcions malloc i lliure. Així que aquí està un altre programa. Tot el que estem fent és mallocing un enter. Estem emmagatzemar-lo en estrella x. Per descomptat, hem de comprovar a veure si x és nul. Llavors anem al que acaba d'establir x està apuntant a un 50. Imprimiu el que x està apuntant a, print x, i després lliure de x. Llavors, ¿com és això en realitat va a veure si ens fixem en la nostra pila i el munt? Així que anem a començar de nou. La part inferior de la nostra pila com abans. Recorda que et feu servir directament s'oposa a la pila? Així que anem a tenir la la part superior del nostre patrimoni allà. Així que la part inferior de la nostra pila, tenim nostre marc de pila per a les principals. Té l'espai per argc, argv, i ens ara tenim una variable local x, que és un int estrelles. Així que anem a recórrer a través d'aquest programa. El primer que tenim és una crida a malloc. Així que estem fent una crida a malloc. Malloc és una funció. Es va a aconseguir un marc de pila. Què estem passant a malloc? Això anirà dins d' del marc de pila. Estem passant de mida n, que és 4. Així que es passa a malloc. Què fa malloc? Ens agafa una mica d'espai en el munt. Així que anirem a la pila. I anem a prendre 4 bytes de la pila. Així que anem a donar que una adreça arbitrària. 0x123 Només fingir que és un direcció que està al heap. Llavors, què és en realitat dins d'aquest regió de memòria a la direcció Ox123? Garbage. Així que no hem guardat res en ella. Així que pel que sabem, podria ser qualsevol cosa. Vostè no ha d'assumir que és zero. És més probable que no és zero. Així que ara torna malloc. I què fem quan es restableixi el malloc? Ens vam proposar el que retorna. Fixem x igual al que que està tornant. Així que què és el tornava? Està tornant 0x123 ja que és el direcció del bloc de memòria que acaba de ser assignat en el munt. Així que tornar 0x123 x ara serà establert igual a 0x123 que, il · lustrat, que sovint dibuixem com X que tingui un real fletxa apuntant a aquest bloc. Però x és simplement emmagatzemant aquesta direcció. Així que ara hem de comprovar si x és nul. No és nul. Pretenem que aquesta malloc succeir. Així que ara estrella de x és igual a 50. Així estrella recorda que significa anar a aquesta direcció. Així 0x123 Anem a anar a aquesta direcció. Així que això ens porta fins allà. Què estem fent en aquesta direcció? Estem emmagatzemant 50. Així que després d'aquesta línia, que és el que les coses seran similar. Així que ara que ja no és escombraries allà. Ara sabem que el 50 és en aquest en particular perquè la direcció ens vam posar a això. D'acord? Així que ara anem a imprimir f. Així que primer anem a imprimir estrella x. Llavors, què és l'estrella x? Un cop més, l'estrella x significa anar a la cosa que x està apuntant. Així que x és l'emmagatzematge de 0x123 Anar a això. Rebem 50. Així que imprimir f. I això vol dir que va a imprimir 50. I després que retorna. I després tenim el segon printf. Ara estem per cent p. Si no ho has vist, això és com s'imprimeix un punter. Així que tenim per cent i, cent f, i tots els que ja. Així cent p, imprimir un punter. Així que x és un punter. Així que si anem a imprimir x si mateix, estem imprimint el que és en realitat dins x, que és 0x123 Així que la primera print f voleu imprimir 50. La segona impressió f va imprimir 0x123 Sí? AUDIÈNCIA: Utilitza cent x per imprimir un punter? ROB: Així que utilitzes cent x per imprimir un punter? Així que es pot, però per cent x és just, en general, per com si té alguna sencer i que voleu imprimir com un hexadecimal. Així és com es fa això. Atès que, per cent d faria imprimir com decimal. Aquí és on obtenim cent d. i és simplement sencer. cent p és específicament per als punters. Així que x és un punter. Volem utilitzar el percentatge p. Però per cent x podria funcionar. Sí? AUDIÈNCIA: [inaudible]? ROB: Si. Almenys per a aquest call-- així que no incloure aquí. Però aquests dos arguments són necessàriament dins d'aquest marc de pila juntament amb les variables locals printf passa a estar usant. I a continuació, la següent crida a printf ara dins el marc de pila és printf cent p barra invertida n i sigui quin sigui el valor de x és, que és 0x123. Sí? AUDIÈNCIA: [inaudible]? ROB: Es va a imprimir alguna cosa que són aquestes. AUDIÈNCIA: [inaudible]. ROB: Així que la imprimeix en format electrònic. S'assembla a una adreça. Sí? AUDIÈNCIA: [inaudible]? ROB: Per què és què? AUDIÈNCIA: [inaudible]? ROB: Per què és aquest punter de 4 bytes? Així que hi ha un munt de 0 de davant d'aquesta. Així que és realment 0x0000000123. En un sistema de 64 bits, no hi hauria un munt de més zeros. Sí? AUDIÈNCIA: [inaudible]. ROB: Així que el primer printf va a print-- AUDIÈNCIA: [inaudible]. ROB: Sí, es va a imprimir el que x està assenyalant. Star diu el que és aquest el que apunta. N .. Així que què és el que apunta? 50. N .. Això és el que anem a imprimir. Atès que, en el següent, estem simplement imprimir x si mateix. Què hi ha dins de la f? 0x123. Okay. I llavors, per fi, tenim el lliure. Què estem passant a alliberar? Estem passant x. Aquest temps realment exhibició en el marc de pila. Així que estem passant el valor 0x123 per alliberar. Així que ara gratis sap, està bé, He d'anar fins el munt i lliure que la memòria. Ja no feu servir el que és en la direcció 0x123. Tan lliure va a alliberar que del munt. Ara la nostra pila està buida altra vegada. No tenim pèrdues de memòria. Ara lliure tornarà. Observi que x és encara 0x123. Però això no és ara de memòria vàlida. Ja no hem d'eliminar la referència de x. Sí? AUDIÈNCIA: És tornar 0 redundant? ROB: És returen 0 redundant? Sí. Acabem de posar que hi ha perquè tenim un retorn d'un d'aire. Així és com, sí, anem a incloure el retorn 0. Sí? AUDIÈNCIA: [inaudible]? ROB: Així que després de x gratis, què passa si tractem d'eliminar la referència al punter? És possible que no surti malament. És possible que encara ens vam aconseguir 50. És possible, també, que aquesta memòria és que ara s'utilitza per a una altra cosa. Així que és un comportament indefinit. I indefinit significa res pot succeir. Sí? AUDIÈNCIA: [inaudible]? ROB: No, pel que si vostè assigna x a una altra cosa. Així que si aquí vam dir x és igual a alguna cosa malloc else-- Mida malloc event-- llavors que bloc original de la memòria no s'allibera. I hem perdut oficialment. Això és una pèrdua de memòria. Hem perdut totes les referències a aquest bloc de memòria. Així que no hi ha manera que mai puguem alliberar-la. OK, així que després torni 0 significa fet. Molt bé, així que el desbordament de pila. Quina és la idea aquí? Així que recorda, munt està baixant. Pila està pujant. Així que aquest va ser l'exemple de la conferència, Crec que, en el seu principal només va a cridar a aquesta funció foo, que va dir recursivament 1 i una altra vegada. Així s'apilen les trames es van a treballar exactament de la mateixa. Així que anem a començar amb la principal com el marc de pila inferior. Després principal va a trucar a foo, que es va a aconseguir un marc de pila. Llavors foo va a cridar foo de nou, que es posarà un altre marc de pila. I després una altra vegada, i una altra, i una altra, i una altra vegada fins que, finalment, es corre en el munt. Així que aquesta és la forma en què obtenim un desbordament de pila. I en aquest punt, vostè SEG culpa. O vostè realment seg taca davant aquest punt però sí. AUDIÈNCIA: És un bolcat del nucli del mateix que falla seg? ROB: Així que vostè veurà la segmentació nucli falla deixar. Vostè obté un bolcat de memòria quan vostè SEG culpa. I és com un bolcat de tota la contingut de la memòria actual, de manera que es pot tractar d'identificar per què SEG criticat. Sí? AUDIÈNCIA: [inaudible]? ROB: Així que un mitjà de fallada de segmentació hi ha un desbordament de pila. Així que no necessàriament. Un error de segmentació vol dir que ets tocar la memòria d'una manera vostè no ha de ser. Així que una manera de que això passi és, quan vostè desbordament de pila, vam començar tocant memòria d'una manera que no hem de ser. Sí? AUDIÈNCIA: [inaudible]? ROB: Així que dins d'un bucle infinit. Igual, això és com una infinita recursiva bucle i així tenim una altra pila emmarcar cada vegada. Però just a l'interior d'un habitual infinit mentre un-- bo, anem ni tan sols imprimir F-- fer alguna cosa. El que sigui. No estarem rebent un altre marc de pila. Només anem a mantenir looping sobre aquesta única instrucció. La pila no està creixent. És el fet que cada recursiva anomenada ens està donant un marc de pila. És per això que tenim un desbordament de pila. Sí? AUDIÈNCIA: Així que si vostè diu que obtenir el while i després [inaudible]? ROB: Així que si dins el bucle while hi va haver un printf, tot i això culpa no seg. Jo simplement no vull confondre les coses. Seria bucle. Obtindria una sola pila emmarcar per al printf. Llavors printf tornaria. Llavors serà bucle de nou. Obtindria una sola pila emmarcar per al printf. Seria tornar. Marc de pila individual. Així que vostè no està aconseguint aquest infinit apilant marcs de pila. AUDIÈNCIA: [inaudible]? ROB: Si. Així que aquest desbordament de pila passa perquè cap d'ells trucades a foo estan tornant. Així que si tornem, llavors ho faríem començar a perdre els marcs de pila. I llavors no tindríem desbordament de pila. I és per això que vostè necessita un cas base per a les seves funcions personals. Sí? AUDIÈNCIA: És la mida potencial i la apilar per el munt de la mateixa per tots els programes? ROB: Aproximadament. És la mida potencial de la pila i el munt de la mateixa per a tots els programes? Aproximadament. Hi ha alguna cosa de l'aleatorització fins on comença la pila i on comença el munt. Si li passa que té una gran quantitat de variables i coses globals, és possible que treure una mica d'espai per a la seva munt. En un sistema de 64 bits, que pràcticament tenir memòria infinita. Hi ha tantes coses. Entre 32 bits i 64 bits, que és una diferència significativa. Vostè va a aconseguir molt més apilar i espai d'emmagatzematge dinàmic en una de 64 bits sistema perquè no només més Les adreces que es poden utilitzar. Però en un sistema individual, ho farà ser més o menys la mateixa quantitat de pila i espai d'emmagatzematge dinàmic. Bé. Així que l'últim és la compilació. Així que vostè ha de saber aquest procés. Hi ha quatre grans passos. Així que el primer ha ser fàcil de recordar. Pre-processament. Compta amb el prefix pre en el mateix. Així que es tracta abans de tota la resta. La cosa a recordar és el hash. Així defineix haixix i haixix inclou en tots aquells. Aquests són tots els pre-processador directives. Aquestes són les coses que els pre-processador s'encarrega de. Llavors, què fa un pre-processador? És una cosa molt ximple. Tot el que és capaç de fer són tots ells còpia i de tall, i enganxar operacions. Així de hash estàndard inclou dot i0 h. Què és això que fa? Es va treure la norma i0 punt h presentar i enganxant a la part superior on sigui que diu haixix inclou estàndard dot h i0. I qualsevol hash de definir que hem veu, el que es fer? El seu copiant el valor que el hash definit es defineix com i enganxar que allà on estigui utilitzant el valor. Així que el preprocessador simplement fa realment operacions basades en text senzill. No fa res intel · ligent. Així que tota la resta és més complicat. Així que ara que és preprocessador fet, en realitat compilem. Així que, què significa la compilació? Estem passant de codi c al codi assemblador. Sí? AUDIÈNCIA: [inaudible]? ROB: Sí, vam agafar això. Així que la compilació. Anem de c per al muntatge. Així que això és un canvi d'idioma actual. Compilació de si mateix significa passar d' un llenguatge d'alt nivell per un llenguatge de nivell inferior. I C és un llenguatge d'alt nivell en comparació amb el muntatge. Quin és el muntatge? Les seves instruccions, que són bastant molt, feta per a la seva CPU. Però l'ordinador segueix No entendre el muntatge. Només s'entén uns i zeros. Així que el següent pas és el muntatge, que ens porta d'aquestes instruccions que seva CPU entén i realitat els tradueix, a els uns i zeros. Així C per a muntatge en binari. Però jo no tinc un executable encara. Així que pensa a la biblioteca CS50. Nosaltres li proporcionem un binari per aquesta biblioteca CS50, que té GetString i getInt i tot això. Però el CS50 library-- i de itself-- no és executable. No té una funció principal. És només un munt de binari que es pot utilitzar. Així que la vinculació és com reunir a tots d'aquests diferents arxius binaris en un arxiu executable real. Un que pot escriure dot retallar un punt fora. Així que això és com l'arxiu que escriure, - sigui quina sigui la seva programa és-- Ceaser punt c. Però ara que ha estat compilat a binari. Així que o punt Ceaser. I aquesta és la nostra CS50 biblioteques binari. I estan sent combinats en un sol executable. Sí? AUDIÈNCIA: [inaudible]? ROB: Així que primer inclou, recorda, el hash incloure és en realitat un etapa de pre-processador. Però això és a part. Si vostè no està utilitzant cap funció que estan fora del seu arxiu sol llavors, no, no cal vincular res ja que tens tot. Dit això, printf està sent vinculat a. Si alguna vegada utilitza printf, això és una cosa que necessita ser vinculat a perquè vostè no va escriure això. I, de fet, printf és automàticament vinculada a. Vostè sap com en la línia d'ordres o quan escriviu make, veure-ho té tauler l CS50, que té enllaç a la biblioteca CS50? Printf, i coses per l'estil, es va estar vinculat automàticament. Alguna altra pregunta sobre alguna cosa? AUDIÈNCIA: [inaudible]? ROB: Vinculació? Tenim un munt de diferents arxius binaris. Aquest és l'exemple canònic que utilitzem és la biblioteca CS50. Hem recopilat i que li ha assignat el binari per aquesta biblioteca CS50. Voleu utilitzar GetString en el seu programa. Així que veu i utilitza GetString. Però sense el meu codi binari per GetString, al compilar el codi baix, no pugui executar el seu programa perquè GetString cordes és encara no completament definit. És només quan es vincula al meu binari que conté GetString que ara, tot dret, que pugui realment executar GetString. El meu expedient està complet. I puc executar aquest. Sí? AUDIÈNCIA: El que convertir vinculant el binari executable a? Així que encara que no té altra biblioteques, no seguiria sent necessari traduir la [inaudible]? ROB: Així que un executable encara està en binari. És que la combinació d'un conjunt munt de binaris. AUDIÈNCIA: Moltes gràcies. ROB: Cap problema. Alguna altra pregunta? En cas contrari, estem preparats. Bé. Gràcies. [Aplaudiments] AUDIÈNCIA: Gràcies. ROB: Si.