JASON Hirschhorn: Benvingut a A5, tothom. Tenim una setmana emocionant per davant de nosaltres, sobretot perquè hi ha molts nous s'enfronta en aquesta habitació. És meravellós. Molts de vostès són aquí per accident, que és encara millor. Així que espero que vostè guardarà acompanyar-nos. Aquesta setmana anem a gastar el gruix de la secció la preparació per a l'examen. Així que pel nostre programa, parlarem una mica sobre els recursos per a la classe, però també per a la prova i, a continuació, de nou, passar la major part de la classe de conversa sobre les preguntes. Un cop hem acabat de contestar la seva preguntes, o si les seves preguntes naturalment ens porten a una mica de codi, jo tenir problemes de mostra d'exàmens parcials passat que anem a codificar en directe a la secció junts que també aparegui algun altre bons temes a cobrir. Així que en primer lloc, com hem passat pel últim parell de setmanes per recordar nois, hi ha un munt de recursos disponible per a aquest curs. Molts d'ells seran molt útils a vostè com vostè continua estudiar per prova 0, perquè És dimarts a la tarda. Així que tots vostès han estat estudiar una mica. Hi ha notes de classe i de la font codi que ha sens dubte la sortida. Mira els pantalons curts. Fes una ullada a study.cs50.net. I llavors, s'enumeren a continuació, un nombre d'altres recursos. Un cop més, el concurs és demà 0 en un. Si no ho ha fet, comproveu Sobre la Prova 0 document sobre la pàgina d'inici del curs per esbrinar on vostè està prenent l'examen. El concurs comença a les 1:10 i acaba 70 minuts després. Així que si vostè es presenta després de la 1:10, ets aconseguirà que molts menys minuts del 70 per prendre la prova. Així que assegura't que estàs a temps. Si vostè és un estudiant d'extensió o tenir algunes altres consideracions de prova, es podria no estar en un matí. Però, de nou, comproveu el Quiz 0 document per a assegurar-se que vostè sap quan vostè està prenent l'examen. Vaig escriure 75 minuts aquí. Crec que això és correcte, no 70. Cobreix tot el material d'una setmana 0 a la conferència de la setmana passada, dimecres. I de nou, per a aquest concurs, perquè document, s'obté una doble cara i 8 1/2 per 11 full de paper que s'obté per utilitzar com notes durant l'examen. Molta gent, si no la majoria de les persones, tenen trobat que la manera més útil només per estudiar per l'examen és fer un full d'estudi, un un-sider, dels seus. Així que busqui en els últims si vostè ha vist els passats. Arribar als amics per veure el que que estan posant en el seu. Però, de lluny, la millor manera possible estudi és anar a través de tot i reduir gradualment cap avall al que han o no pertany a aquest full de paper, perquè això és només una realitat manera útil per tu per assegurar-se vostè va a través de tot i tenir certa familiaritat amb ell. La majoria de la gent, ens trobem, tot i que tenen el full de paper assegut just al costat d'ells en el qüestionari, no encengueu a ella, perquè, de nou, que molt procés d'anar a través de la informació ha ajudat a que l'hi aprenguin. Algú té alguna pregunta sobre concurs de 0? Té a tothom - Jo no faré a mà alçada. No importa. Jo anava a preguntar qui començar a estudiar. Però jo no vull fer-te tot no aixequin la mà. Així que com he dit - si, Avi, endavant. AVI: Quin seria una cosa útil per posar en el d'un localitzador? ESTUDIANT: Això depèn de vostè. JASON Hirschhorn: Vostè rep utilitzar el seu judici. Coses útils per posar en el d'un localitzador, si vostè està confós sobre la gran O temps d'execució de diferents tipus de cerques i tipus, que posen en allà en un gràfica excel · lent pràctic. D'aquesta manera, si se li demana que en el concurs, que no és necessari per tractar de la figura cap a fora o la raó a través del temps d'execució. Vostè pot simplement copiar cap avall. Si ens fixem en els concursos passat, una gran quantitat de vegades, no funciona qüestions de temps. Així que seria un exemple d'una bona cosa que posar en el seu un-pager. Altres coses bones de posar, si ets confosos sobre com declarar una funció o el que les diferents parts de la declaració de la funció són, escriure que allà, una versió genèrica i després potser un exemple. Si vostè està confós sobre els punters, un diagrama de com punters treball és probablement de gran ajuda. Si vostè està confós sobre la recursivitat, 1 degustar funció recursiva allà També podria arribar a ser realment útil. Això li dóna algunes idees? AVI: Cal comprendre la procés de compilació de tot, igual que com funciona tot? JASON Hirschhorn: Tot que ha estat cobert podria aparèixer en el qüestionari. Preguntes - però de nou, algunes coses seran ponderada fortament que altres. Algunes coses han arribat de nou i una altra vegada a classe, en conferència, i la secció. Altres coses que no tenen arribar a aquesta freqüència. Hem parlat molt sobre # include i -L alguna cosa i el que significa en els el procés de compilació. Hem parlat molt sobre GDB, s'aferren, els diferents indicadors que utilitzem quan compilem alguna cosa, i el que make15, per exemple, de veritat significa i realment ho fa. No hem parlar tant sobre cada pas individual a el procés de compilació. Encara hem parlat. Així que és una cosa que encara li ha d'estar familiaritzat. Però de nou, no serem - les coses que es presenten amb més freqüència en la classe tenen més probabilitats d'arribar a més sovint i ser més fortament ponderada en el qüestionari. Genial. Alguna altra pregunta sobre concurs 0? Acceptar, de manera que posar una llista de temes a la pissarra. Vaig anar a través del pla d'estudis. Vaig anar a través de la secció de revisió de ahir a la nit i els tobogans per arribar amb una llista no exhaustiva de temes que hem cobert fins ara a CS50 i les coses que podrien aparèixer en el qüestionari. Així que no vaig a anar a través d' tots i cada un d'ells. Això prendria molt més temps del que tenim ara. Però poso això aquí amb l'esperança de jog seva memòria pel que fa a les coses que poden o no ser tan familiar amb vostè. I m'encantaria que passar la major part de secció de respondre les seves preguntes sobre aquests temes, temes que no estan coberts aquí. Podem escriure pseudocodi. Podem escriure codi real per assegurar-se que - Jo puc respondre a la seva pregunta i ajudar Qualsevol persona pot entendre fonamentalment un Molts d'aquests temes perquè et sentis preparat i còmode anar a matí qüestionari. Així que llegiu la llista. Vostè tant de bo hagi arribat a la secció de amb algunes preguntes. Quan estigui llest, aixequi la mà i anem a començar. Tingueu en compte, les preguntes que tenen, no hi ha preguntes estúpides. Hem sentit parlar molt d'això. I les preguntes que tingui, estic disposat apostar, moltes altres persones, tant aquí assegut i veient línia tenen també. Pel que només pot ajudar a la gent fent preguntes. Marcus. MARCUS: Entre la pila i el munt, hi ha un pre-assignat percentatge de memòria que es defineix com això és per a la pila oa la pila? O com funciona això, exactament? JASON Hirschhorn: Molt bona pregunta. Vaig a donar suport rastrejar una mica. Té tot el món - si us plau sigui honest aquí. Sé que t'estic demanant que aixequin la mà davant dels seus companys. Però hi ha persones que se senten incòmode amb la pila i el munt i li agradaria anar una altra vegada que i el que els vol dir? Aixequin la mà si - D'acord. Gràcies. Així que anirem a la pila i el munt molt ràpidament i després passar a respondre a la seva pregunta. Així que si dibuixem una caixa per representar memòria a l'equip, quines són algunes coses que van en aquest quadre? Principal. Una funció principal. A on va principal? ESTUDIANT: [inaudible]. JASON Hirschhorn: Així que anem a posat principal aquí. Quina altra cosa va en aquesta caixa? ESTUDIANT: Les funcions a què flama. JASON Hirschhorn: Les funcions que anomenem. I a on van? ESTUDIANT: A la pila. JASON Hirschhorn: Ells anar a la pila. Així que anem a trucar a aquest cosa aquí baix la pila. I a sobre de la tapa, tenim el munt. Així, la memòria no és un quadre com aquest. Però en realitat és bastant similar. Hi haurà un munt de caixes de més de i una altra, depenent de com de gran és el seu ordinador és o què tan gran és la seva memòria. Al entre cometes "de baix" és la pila. I hi ha diverses coses que van a la pila. I aquells depenen de les funcions que té en el seu codi. Vostè sempre té una funció en la seva codi flama principal, així que sempre hi ha una secció aquí al apilar dedicat a la principal. Aquestes seccions de la pila s'anomenen marcs de pila. Quan es diu a una altra funció, diguem principal crida a una funció de cerca binària, posem un altre marc a la pila. Més concretament, anem a donar un tros de memòria en la nostra equip per emmagatzemar de recerca binària locals variables i per executar el binari codi de cerca. Així que cridem a la recerca binària. En aquest tros de memòria, anem per emmagatzemar les seves variables locals. Anem a emmagatzemar les seves trucades printf. Passi el que passi, que la funció és serà emmagatzemat allà. Hi binària va a executar. Es va a completar l'execució. Quina és la paraula en C que significa que una funció ha de completar la seva execució? ESTUDIANT: Retorn. JASON Hirschhorn: Return. Així que cada vegada que vegi una sentència return, els extrems de funció quan arribi a això. Així que la recerca binària arribarà a la seva devolució. Aquesta part de la memòria serà essencialment ser alliberat. I principal tornarà a la seva execució. Així principal farà una pausa on era, truqui al recerca binària, aconseguir alguna cosa de valor de retorn, i continuar l'execució. Aquest marc de pila s'anirà. Si cridem a una funció recursiva, que és una funció que crida a si mateix sobre i una altra, pot ser que aconseguim - diem que van fer de recerca binària recursiva. Podríem arribar recerca binària versió un, recerca binària 2, recerca binària 3, recerca binària 4, recerca binària 05:00. I a continuació, aquesta final de recerca binària de cinc arribarà el cas base, i la pila marcs tornaran i mantenir el tancament fins que tornem a principal. Podem repassar la recursivitat en una estona. Però tot això és a dir, si vostè és cridar a múltiples funcions alhora, haurà múltiples pila marcs de la pila. El munt, d'altra banda, fins aquí, no és per a funcions, no per a les variables locals. És per assignar dinàmicament variables. Així que aquestes són variables que poden ser inicialitzat en ja sigui principal o un funció que principals trucades. En qualsevol part del seu codi, que pot ser inicialitzat. I per inicialitzar una forma dinàmica la variable assignada. Quina funció en C fem servir? ESTUDIANT: malloc. JASON Hirschhorn: malloc. Vostè crida a malloc. Vostè obté un espai de memòria. I que l'espai de memòria està en el munt. I aquest espai de memòria es queda allà fins que truqui de forma gratuïta. Així les variables assignades dinàmicament en heap hi durant tot el temps que volem que hi hagi, i no ho faran desapareixerà fins que explícitament dir-los que es vagin. Pot crear en una funció. Pila d'aquesta funció marc s'anirà. Però aquesta variable seguirà existint en el munt fins que s'allibera, potencialment per la funció que va cridar recerca binària o el que sigui. Així que aquestes variables munt queden allà durant el temps que vostè desitja que es quedin allà. I ells aconsegueixen llocs aquí. I després el següent es va posar al seu lloc. Segueixen sent emplenat, i quedar-s'hi fins que truqui de forma gratuïta. I, essencialment, la pila i la pila, arribar a la pregunta de Marcus, créixer un cap a l'altre. I si es troben un a l'altre, que hi hagi utilitza tota la memòria en el seu computador, i el seu programa es tancarà perquè no té més memòria esquerra a utilitzar. Entre ells, hi ha potencialment altres coses. No obstant això, per l'abast d'aquest curs, no cal que et preocupis per això. Així que aquesta va ser la resposta a la seva pregunta. No es preocupi. Però aquesta era la resposta llarga. Tot el que necessites saber és el heap i la pila va - un comença a la part inferior. La pila de paper no. El munt està allà dalt. Ells creixeran més a prop l'un a l'altre. I si el que toquen, això és un problema. T'has quedat sense memòria. Però també, a més de saber on que estan, el que s'emmagatzema tant en el pila i el munt. Curtis. CURTIS: Quan xoquen, és que un desbordament de pila? JASON Hirschhorn: Quan xoquen, això no és un desbordament de pila. Un desbordament de pila és una àrea diferent que podem anar si vols. Bé, anem a tornar a això en un moment. ESTUDIANT: Quina és la paraula anomenada quan xoquen entre si, el pila i el munt? JASON Hirschhorn: Per ara, no et preocupis. Només has de saber - Vaig a respondre a aquesta pregunta després de la classe. Si es troben amb els altres, que es va quedar sense de la memòria, perquè no hi ha més espai allà. ESTUDIANT: Ho sento, el que és un error segons? JASON Hirschhorn: Un segment falla pot ser cridat per - depèn per què es diu de la falla seg. De vegades, el desbordament de pila, que va a dir segons decisió com l'error. ESTUDIANT: Què hi ha d'eliminació de referències una variable nul? És que una falla segons? JASON Hirschhorn: Desreferenciar un punter nul - OK, així que si vostè té un punter que fixa igual a null, punters, el record, adreces de memòria store com els seus valors. I un punter nul és essencialment emmagatzemar 0, el 0-th abordar en aquesta variable. Així 0x, 0, 0, 0, 0, etcètera. Aquesta adreça 0-th en la memòria que no és en la nostra imatge, això és allà dalt en algun lloc, que està reservat per a l'equip. No se'ns permet tocar-lo. Així que quan el programa s'està executant, si alguna cosa està tractant d'anar a la memòria direcció 0, sap que que és un valor buit. No sap res hauria d'estar allà. Així que si vostè tracta de fer servir alguna cosa allà i tractar alguna cosa com allà o tractant d'anar a aquest lloc, vostè és va a obtenir un error de segment o un error. Respon això a la seva pregunta? I ara anem a tornar a desbordament de pila. Les coses a la pila, ja que vostès tenen vist abans, en - anem a dibuixar una estreta d'un marc de pila. Tots poden veure això? Així que tenim el nostre marc de pila. Estem estalviant una matriu en un local de variable en aquesta funció. Així que dir que la nostra matriu té cinc punts. Els cinc dels quals s'emmagatzemarà en aquest marc de pila. Si comencem a escriure més enllà del límits d'aquest conjunt - així que si comencem a escriure en, diguem que és 0. Aquests són els cinc índexs de la nostra matriu. Si comencem a escriure en l'índex 5, que no tenim quan tenim una matriu de mida 5, vam començar a escriure en índex 6, 7, 8, 9, podem obtenir una pila Error de desbordament. Generalment no és - és probable que es ficarà en problemes si vostè es passa per un. Però, en general, s'arriba a la més problemes si vostè es passa per una gran quantitat i et vas fins a la data més que escrigui sobre l'adreça de retorn d'aquesta funció, que es troba a la part inferior del marc de pila. Perquè, ¿no? Vostè - al - ho sento. No ", perquè la dreta." En el marc de pila, que té seves variables locals. A la part inferior de la pila marc és la direcció de retorn. Aquí és on la funció passa quan s'acaba. I si sobreescriu aquest retorn direcció, i després quan aquest marc de pila, quan vostè va a través de la pila enquadrar i execució de cada línia, ets anirà a la seva nova adreça de retorn que està escrit allà en comptes de la un de real. I així és com hem vist algunes fallades de seguretat pot succeir amb els ordinadors. Així desbordament de pila, en una paraula, és quan sobreescriu la part de la pila se suposa que has de fer servir, el local variable que se suposa que has de fer servir, i en particular, quan s'inicia la sobreescriptura coses importants com el remet. I aquí és on vostè obtindrà un error. O potser fins i tot podria començar fins i tot escriure en - diuen cerca binària va ser just a sobre de principal. Si heu sobreescrit molt, va poder escriure en el principal. Però, en general, es produeix un error abans de llavors, pel fet que l'ordinador sap vostè està fent alguna cosa que et no s'ha de fer. Sí ESTUDIANT: Quina és la diferència entre un desbordament de pila i un buffer overflow? JASON Hirschhorn: Desbordament de memòria intermèdia és un tipus més genèric de el que acabo de descriure. ESTUDIANT: Llavors un desbordament de pila és un exemple d'un desbordament de memòria intermèdia. JASON Hirschhorn: Exactament. Aquest és un arranjament que podem pensar com un tampó, un espai perquè les coses surtin polz Es tracta d'un desbordament de la memòria intermèdia de pila. Podríem tenir un desbordament de la memòria intermèdia de pila. Si hi havia un tampó, que hi ha sovint és una matriu del munt, i nosaltres sobrescribía aquests límits, llavors ho faríem tenir un desbordament de la memòria intermèdia de pila. I més enllà de l'abast d'aquest curs, que estan detectar una mica diferent. El compilador té especial formes de detectar cadascun. Però un desbordament de memòria intermèdia és una més genèrica tipus del que he descrit, que era un desbordament de la memòria intermèdia de pila. Això respon a la seva pregunta? Sweet. Hi va haver alguna altra pregunta relacionada a la pila o el munt? Sí ESTUDIANT: Sé que tens a cadenes gratuïtes perquè estan en el munt i no vol perdre memòria. Però vostè ha de alliberar les variables globals i coses per l'estil? O són ​​alliberats de forma automàtica? JASON Hirschhorn: Bona pregunta. Així que en CS50.H, vam crear aquesta cosa perquè vostè va anomenar una cadena. Una cadena és realment el que? ESTUDIANT: Caràcter estrelles. JASON Hirschhorn: Una estrella de xerrades, un punter a un caràcter, un punter a una matriu de caràcters. Això és el que la cadena és. Així que hem de alliberar, perquè getString, que utilitzem molt - nom de la cadena és igual a getString - que mallocs per a nosaltres una mica de memòria en la s'amuntegaran i després retorna un punter a la primer caràcter d'aquest cadena, un estel caràcters. Així que aparentment, si no ha estat escrit lliure en qualsevol de les seves cadenes que vostè ha anomenat fins ara, vostè té estat filtrant mica de memòria. Per descomptat que no hem parlat de que, pel que ningú ha ficat en problemes per fer-ho. Però en el futur, si. Quan es diu a getString, ets mallocing una mica d'espai en el munt. I si vostè no crida lliure després que cadena, té una pèrdua de memòria. Això respon a la seva pregunta? Sí ESTUDIANT: Així que per fer això, fem servir dret lliure abans del retorn? Igual que, en el marc de, suposo que si diem, com, int principal, dins de la abast del codi que està dins dels claus, just abans - vostè sap el lloc on vol sol posar de retorn. Poses lliure abans d'això? JASON Hirschhorn: Així que vostè pot posar lliure on sigui que vol posar lliure. Com que aquests s'assignen de manera dinàmica les variables, ja que poden viure més enllà de l'abast d'un particular, funció, si es diu a malloc en un funció separada, per exemple, getString, pot trucar gratis a main. No cal dir- en la funció específica on es diu malloc. Però sí cal trucar abans de principals retorns. I el que realment depèn. Depèn de per què malloced que espai en el primer lloc. Algunes persones li digui alliberar molt ràpidament. Algunes persones no cridar gratis fins el final del seu programa. I van a anar a través d' i tot de forma gratuïta. Depèn de què vas trucar malloc. ESTUDIANT: I ​​què li diries si es diu ús getString? Diries lliure, què? JASON Hirschhorn: Així que la sintaxi de forma gratuïta és simplement lliure, parin obertes, prop Parin, i el nom del punter. Així que si vostè escriu name cadena és igual a getString, poses el nom aquí. Aquest és el nom del punter. I sap que per alliberar memòria. ESTUDIANT: Així que quan s'allibera aquesta memòria, el punter segueix apuntant a aquest lloc en la memòria? O és el punter també buidada de la direcció que apunta. JASON Hirschhorn: Hem de tractar que. Hem codificar això. Tornem en arribar a codificació, i anem a codi que. I si vols descobrir la resposta d'això, també es pot codi que en el interí. Però aquesta és una gran pregunta. ESTUDIANT: És possible alguna cosa lliure massa aviat? Així que encara ho necessita per al seu programa, i t'alliberaràs d'aquest espai de memòria? JASON Hirschhorn: Si. És possible, si alguna cosa gratis i després d'usar-lo de nou, ho faràs trobar-se amb un error. Però això és en tu, perquè tu vas alliberar alguna cosa i després el va anomenar més tard. Així que aquest va ser l'error d'un programador. Però si. Es pot escriure això. Alguna pregunta més sobre - Sí ESTUDIANT: Llavors, si se suposa que només alliberar en general abans de la programa acaba, significa que si el programa acaba i no alliberar-lo, que la memòria encara està assignat? JASON Hirschhorn: Si el programa acaba i s'oblida de alliberar, llavors que la memòria es va assignar al llarg la vida útil del seu programa. Quan el programa es tanca completament, que la memòria no va quedar-s'hi per sempre. L'equip és prou intel · ligent com per saber que quan el programa es tanca, es ha de desfer de tota la memòria que es va associar amb aquest programa. No obstant això, hi ha eines que es poden executar en un programa per detectar si, quan el programa acabat, se li va oblidar per alliberar memòria. I per al seu pròxim conjunt de problemes on que utilitzarà i l'ús de malloc punters, vostè va a córrer aquest programar en el programa per veure si, quan els principals retorns, tenies certa coses que van quedar unfreed. Així que no van a romandre malloced sempre en l'equip. Això seria un malbaratament, perquè molt ràpidament, els ordinadors es quedi sense memòria. Però si es queden fins al final de la seva programar i no estan alliberats i la seva programa surt, això segueix sent un problema que aquesta eina l'ajudarà a tractar. ESTUDIANT: Això és Valgrind? JASON Hirschhorn: És anomenat Valgrind. I estaràs - ESTUDIANT: Però no hem de saber que durant la prova, però? Vull dir, es va parlar de una mica en la conferència. JASON Hirschhorn: Així Valgrind és el nom d'aquesta eina. Saber el que fa és suficient per resoldre el qüestionari. Però vostè no ha utilitzat encara en la seva conjunt de problemes perquè no hem tingut una conjunt de problemes que ha tractat de forma explícita amb malloc o usant malloc. Així que vostè no ha utilitzat Valgrind encara. Però ho va a utilitzar abans que tard. ESTUDIANT: Pot repetir el Valgrind és? JASON Hirschhorn: Ho sents? ESTUDIANT: Pot repetir el que el propòsit de Valgring és? JASON Hirschhorn: Valgrind és el nom - com GDB ajuda a depurar el programa, Valgrind ajuden a determinar si les coses no han estat alliberats quan el programa es tanca. Pel que vostè executa en el seu programa. I el seu programa surt, i que dirà el seu programa anomenat malloc això molts vegades per aquesta quantitat de bytes, i que només diuen lliure moltes vegades. I així ho va deixar aquests molts bytes si no són alliberats. O dirà que has alliberat tot. Bon treball. ESTUDIANT: OK. I es diu Valgring? JASON Hirschhorn: V-A-L-G-R-Me-N-D. ESTUDIANT: Una pregunta sobre els punters. Així que diguem que n han star x és igual a alguna cosa. Això equival, el que vostè està posant allà, és que el que s'està posant en l'interior el que x fa referència, o el punter de x? JASON Hirschhorn: Pot vostè repetir la pregunta? Podem extreure mentre es diu? ESTUDIANT: En el qüestionari, en realitat, la un que ens va enviar, va ser com, carbó de llenya veritat estrelles és igual a roques CS50, oi? Significa això que que bressola CS50 és el que la veritat està assenyalant? JASON Hirschhorn: Així que vostè està parlant les estrelles del caràcter en una cadena, com això funciona? Sí D'acord. Dibuixem això aquí. [CONVERSA SIDE] JASON Hirschhorn: Així que aquesta variable serà de tipus char estrelles. Què tan gran és una variable de l'estrella de tipus char? Quants bytes? ESTUDIANTS: Quatre. JASON Hirschhorn: Són quatre bytes. Quants drets és una variable de tipus int estrella? ESTUDIANTS: Quatre. JASON Hirschhorn: Quatre bytes. Si es tracta d'un punter, llavors sempre és 04:00 bytes, ja que els punters, el seu valor és una adreça de memòria. I les adreces de memòria en el CS50 aparell són quatre bytes de longitud. Així que quan cridem a getString, o quan diguem, stringname és igual, i després en cometes dobles van posar una cadena, estem posant - bé, això és una mica diferent. Què anem a getString com l'exemple. O estrelles Char alguna cosa és igual a la cadena. Ho sentim, dóna'm l'exemple que llegeixi? ESTUDIANT: la veritat estrelles caràcters és igual "Roques CS50" en cometes dobles. JASON Hirschhorn: Així que aquesta estrella, aquesta anomenarem a aquesta variable x per a la nostra fins genèrics. Hem creat una variable anomenada x. És tipus char estrelles. És un punter a una sèrie de caràcters. Així que aquí baix - Així que així és com aquesta faria treballar en la memòria. Això emmagatzemar una adreça de memòria. Seria emmagatzemar la direcció de memòria de el primer caràcter de la matriu. I després, quan vas seguir el punter, ho faria obtenir el primer caràcter. I si estàs llegint això com una cadena, l'equip és intel · ligent n'hi ha prou amb saber, llegir tot això fins que arriba a una reacció 0. Però si estàs llegint un caràcter en un temps, així que estàs iteració mitjançant aquesta cadena, a continuació, només llegirà un caràcter alhora fins que arribi a barra invertida 0. Això no va poder respondre a la seva pregunta, però. ESTUDIANT: Sí, però no ho ha fet malloced que l'espai però, per a aquest punter. JASON Hirschhorn: Així que no estic molt segur exactament el que estàs veient, perquè jo no vaig fer aquest examen. Se suposava que havia de ser una eina recursos d'un altre TF. Si crearà una cadena a la apilar o com una variable local, que va a acaba de ser gamma de càrregues en lloc de en general, un estel carbó assenyalant altra cadena. Però jo no ho sé. Això podria ser un punter a una altra cadena a la pila també. Sí ESTUDIANT: Sé que vostè necessita assignar memòria si el punter està sent declarada dins d'una altra funció. És necessari fer el mateix si es tracta de està declarada dins del principal, vostè ho està utilitzant a l'interior del principal? JASON Hirschhorn: Així que si. Pot declarar un punter a qualsevol direcció de memòria a la memòria. Pot ser l'adreça de memòria d'un local de variables, encara que moltes vegades, persones no declaren les adreces de memòria a les variables locals, ja que van desaparèixer una vegada que la funció retorna, que és per això que generalment malloc coses. Però sí, es podia declarar un punter a una altra variable local. És que en general no es fa. Però puc fer una ullada a què cosa específica després de la classe. Sí ESTUDIANT: Crec que això és una espècie del que se li demana. Sembla estrany estar inicialitzar un punter no com un direcció, sinó com el sembla com un valor. Sembla que l'CS50 és el que hi ha dins el que s'apunta i no l'adreça real, oi? JASON Hirschhorn: Així que això és no és el cas, però. Això no és el que està passant. Quan es declara un estel char, és una adreça de memòria. Els punters són totes les adreces de memòria apuntant a una altra cosa. Aquest una mica més podria ser al pila, però gairebé sempre es troba a la s'amuntegaran en el camí veurem el que solia. Però stringname és igual de cometes dobles "GetString", podem veure que i ens pot mirar a través d'això i codificar això. cadena getString no s'està guardant en aquesta variable, o el que sigui la cadena nom no s'està guardant en aquest variables, no perquè així és com punters funcionen. Això té sentit? ESTUDIANT: Sí JASON Hirschhorn: OK. Amb sort, això no era confús per a qualsevol persona. Però si ho fos, podem mirar de nou en una mica, perquè en realitat estem passant per codificar una cosa que s'espera que treballar amb cadenes i ajudar a sentir- més còmode amb ells. Qualsevol altra pregunta relacionada amb aquests temes o altres temes que Vaig a posar una còpia de seguretat? I - en aquests moments. Sí, Alden. ALDEN: Així que això és totalment sense relació, però podem anar més molt ràpidament el que necessitem saber sobre la diferència entre un 32 i Equip de 64 bits? JASON Hirschhorn: Si. Així que 32 bits és la quantitat de bytes? ALDEN: Són quatre bytes. JASON Hirschhorn: Són quatre bytes. I 64 bits és la quantitat de bytes? ESTUDIANT: Vuit. JASON Hirschhorn: Vuit bytes. Així que de nou, vuit bits és un byte. El seu aparell CS50 és una màquina de 32 bits. Així que les adreces de memòria són 04:00 bytes de longitud. Hi ha 2 al 32 adreces de memòria. 0 a 2 a la 32 almenys 1. I jo no sóc positiu, però això és probablement l'abast del que vostè necessita sé que és un equip de 32 bits, que la memòria adreces són, de nou, quatre bytes de longitud, i aquesta és la quantitat màxima d'adreces de memòria. A més, els tipus de dades - això podria ser una cosa tan bé això és digne de menció. La mida d'un tipus de dades depèn la màquina que vostè està treballant. Així que un char, un sol caràcter, és com molts bytes en el nostre dispositiu CS50? Un byte. I en realitat és un byte com bé en una màquina de 64 bits. I la majoria dels tipus de dades són el mateix nombre de bytes en ambdues màquines. No obstant això, alguns tipus de dades seran diferents en ambdues màquines. Així que seria potencialment la L'únic que vostè necessita saber. Però fins i tot això, crec, està més enllà dels límits - Estic gairebé segur, si un mira cap enrere en concursos d'edat, diu, per assumir problemes que està utilitzant la codificació de una màquina de 32 bits. Però hi ha, per anar juntament amb el de Per si t'interessa, hi ha tipus de dades que són els mateixos grandària en totes les màquines. Si has vist alguna cosa així uint32_t, que pot o no ser no he vist això. Això és un tipus de dades. Això diu, serà de 32 bits sense importar quina màquina és el. Així que quan la gent està escrivint portàtil codi, probablement no utilitzaran ints. Lloc Faran servir aquests altres dades tipus que saben que seran els mateixos La mida de cada màquina. Madhu. Madhu: Jo tenia una pregunta sobre el procés de compilació. Així que si vostè està escrivint un programa que utilitza una biblioteca com CS50 o alguna cosa així, jo sé que aquesta biblioteca ha de, en algun moment, ser compilat i vinculat polz Però, quant d'això passa durant l'elaboració del seu programa? Quina part d'aquest procés biblioteca passa quan estàs compilar el vostre programa? JASON Hirschhorn: Així que anem a repassar en general els passos d'aquest procés. Vostè escriu la seva columna c .. A l'arxiu de c., Que inclou la seva # biblioteques de capçalera, per exemple, cs50.h. Què té això aguda inclouen line facis al teu programa? Akchar. AKCHAR: Afegeix els prototips de les funcions de la capçalera els arxius de les biblioteques. JASON Hirschhorn: Exactament. Afegeix els prototips de funcions al seu codi. Així que quan s'està compilant el codi les primeres etapes, el compilador sap que realment existeixen aquestes funcions, i que en algun lloc que s'han definit. Els arxius. H no inclouen l' definicions per a aquestes funcions o com treballen realment. Cs50.h només inclou una cosa que diu getString és una cosa real que pot succeir. I standardio.h diu printf és una cosa real que li pot passar. Pel que el seu llenguatge c amb això. Capçalera arxiu es va convertir en una mica de codi llegible per la màquina, el que finalment aconsegueix convertit en binari codi, de 0 i 1. I aquest és el codi que en última instància s'executa. El CS50-l línia - per exemple, quan estàs escrivint Clang - i després d'incloure-l CS50, escriu que polz I veus això. Quan escrius fer, vostè veure que la línia aquí. I veurem que en un segon quan codifiquem o més endavant, quan el codi. Però això-l línia CS50 fa alguna cosa una mica diferent a els # include cs50.h. Què fa la línia que-l CS50? Avi? AVI: Vull dir que es vincula la biblioteca a la funció cridar, igual que els arxius. o. JASON Hirschhorn: Així que és molt a prop, si no és el lloc. El CS50-l pren l'arxiu binari i es fusiona amb l'arxiu binari. Així cs50.h, no té sentit en la transformació de cs50.h del llenguatge C a binari cada una sola vegada s'està utilitzant. Això seria una ximpleria, perquè això es perd molt de temps. Per tant, ja s'ha compilat i es va convertir en un executable. I ara que va a combinar amb el seu arxiu al final. Així que els de 1 i 0 de van fusionar-se amb els seus éssers i 0 en l'extrem. Així que ara que vostè realment té el real 1 i 0 del que defineixen com getString, per exemple, les obres, o com printf, per exemple, les obres. I per a més informació, hi ha una compiladors curts que Nate dóna que vostè ha de comprovar que va a través d'aquests passos. Però - Sí ESTUDIANT: Són sempre els arxius o. quan estan en forma de biblioteca, llest per combinar, vinculat - com que estan en el codi binari? JASON Hirschhorn: OK. El que - ESTUDIANT: Això és sempre el cas per les biblioteques quan es vinculen? JASON Hirschhorn: Si. Així que hi ha. S arxius, que seran codi de màquina, que també serà críptica a vostè. Vostè no ha de preocupar per això. Però en general, si, van a estar en format. o arxius llestos per anar. ESTUDIANT: Llavors, quan vostè envia a una biblioteca, no només s'envia la. h i. o? No envieu el. Co el. S. JASON Hirschhorn: So - i això és en aquest curt i, si aquesta informació sembla estar arribant a poc ràpid. No obstant això, el curt de compiladors parla d'això també. Quan vostè envia una biblioteca, si vostè envia la. h, l'arxiu de capçalera, els prototips de funcions, i l'1 de i De 0, això és tot el que té per donar. No cal per donar forma en què el L'opció funciona, l'arxiu c .. Com que el punt d'extracció, o la assenyalar les API, el punt en el SPL, la biblioteca portàtil de Stanford, és perquè vostè no es preocupi per com les noves GRect funciona, o com es mouen les obres, o com afegir obres. Tot el que necessites saber és afegir és una funció que pugui utilitzar, i ho fa. Així que realment no necessita saber com està escrit en C. Només necessites saber, aquí hi ha les funcions, la qual cosa fan, i aquí hi ha les d'1 i 0 quan realment voleu utilitzar. Genial. Alguna pregunta més sobre els compiladors o altres temes del fòrum? ESTUDIANT: Tinc una pregunta d' la implementació de les funcions recursives. Una pregunta sobre la recursivitat. Vaig tenir la sensació que es plantejaran. Així que anirem ràpidament a través de recursivitat amb una específica exemple, una funció factorial. Com que aquest és un exemple que sorgeix amb freqüència o que s'utilitzin per il · lustrar la recursió. Així «4!" es llegeix com 4 factorial. I què vol dir 4 factorial? Què vol fer? Com es calcula abril factorial? 4 vegades 3 vegades 2 vegades 1. Així que una altra manera d'escriure 4 factorial és escriure això. 4 Temps 3 factorial. A causa 3 factorial és 3 vegades 2 vegades 1. Així que 4 vegades 3 factorial és 4 vegades 3 vegades 2 vegades 1. Aquesta és la raó factorial és una gran candidat a la recursivitat, perquè és clar que hi ha quelcom que succeeix una i altra vegada i una altra en un menor nombre de coses fins arribar a la final. En arribar a 1, 1 factorial és 1. No pot anar molt més enllà. 0 factorial també es defineix com 1. Així que quan s'arriba a 1 o 0, ets al final, i que pugui començar a anar amunt. Així que si volíem escriure una recursiva funció per calcular un factorial, anem a escriure algunes pseudocodi per això ara. Abans que escrivim que pseudocodi - Vaig a donar vostès un parell de minuts per escriure el codi de pseudo o simplement pensar en això - hi ha dues coses cada funció recursiva necessita. Quines són aquestes dues coses? JACK: Ha de cridar-se a si mateixa. JASON Hirschhorn: Noè? Oh, Jack. Endavant. JACK: Ha de cridar-se a si mateixa. JASON Hirschhorn: Així que un recursiu funció necessita una crida recursiva, un cridar a si mateix. Aquesta és una. I quina és l'altra cosa? JACK: Un cas base. JASON Hirschhorn: un cas base. Un cas base és, aquí és quan ens aturem. Pel que la seva funció es diu. El cas base és el primer. Vols saber si ets al final. I si no estàs a la final, fer la seva crida recursiva. I vostè va a través d'aquesta funció de nou, comprovar la seva hipòtesi de base de nou. Si no és el final, es fa altra crida recursiva, et cetera, et cetera. És per això que les funcions recursives sempre necessitar aquests casos base i els crides recursives. Si no té una crida recursiva, es no seria una funció recursiva. Si no té un cas base, vostè aniria per sempre i no hi hauria final. I el cas base és sempre el primer, perquè sempre es vol comprovar si estàs al final primera. Així que abans de fer una mica de pseudocodi, per què Per què no et prens un minut per pensar en com una funció factorial recursiva s'escriuria? A més, totes les que estan fent, per escrit cap a fora en un full de paper és el que vas a haver de fer en l'examen de demà. Així que probablement una bona pràctica fer Assegureu-vos que el codi que està escrivint cap avall en el full de paper - o es pot fer això. Saps on són els punts i comes. Te'n recordes de la sintaxi. Perquè vostè no està capaç de tenir una compilador diu que vostè va fer un error. També, al llarg d'aquestes línies, demà, quan que hi hagi problemes de codificació, si es va precipitar pel temps, o si vostè és molt confós pel que fa a com se suposa que has escriure la cosa particular en C, li tocaria escriure pseudo-codi i escriure comentaris a també. Perquè no hi ha crèdit parcial per a un Moltes de les preguntes en el qüestionari. Així que vostè pot estar apurat, o vostè només podria ser confós. Escrivint en els comentaris o pseudo-codi sovint són maneres que vostè pot obtenir crèdit parcial. Així que no deixi alguna cosa en blanc en el qüestionari. No hi ha sancions per posar les coses polz De fet, posant en pseudocodi o comentaris ajudarà a la motoanivelladora esbrinar si realment sap el que que està parlant, i potser premi que alguna cosa de crèdit parcial per això. També al llarg d'aquestes línies, escriure amb claredat. Si no podem realment el que estem escrivint, no anomenarem a la mitjanit de demà amb la figura el que vas escriure. Només anem a enlairar punts. Escriure amb claredat perquè puguem escoltar, o millor dit, podem llegir el que vas escriure. I si diu dues frases, no escrigui un paràgraf. Seguiu les instruccions. Escriure amb claredat. I escriure en aquests comentaris o pseudocodi per a les preguntes que podrien concessió de crèdit parcial. OK, anem a anar a factorial. Així que tenim una funció factorial. Si hagués d'escriure realment això en C, Què he de posar davant del nom de la funció? El tipus de retorn, que, en aquest cas, anem a donar-li int. I després, dins de les claus, és el que passa dins de les claus per una funció? ESTUDIANTS: Tipus d'argument. JASON Hirschhorn: els seus arguments. Així factorial probablement tenir una discussió. Va probablement només tenen un argument. I direm que prendrà un nombre enter anomenat x. I de nou, en escriure el prototip de una funció o escriure la funció en el codi abans de definir-la, es escriure el tipus de dades i el nom de aquesta variable només per a aquesta funció. Així que vostè pot passar algun número en aquesta funció, que serà referit com x internament. Tenim la nostra funció factorial. Necessitem dues coses, un cas base i una crida recursiva. Quin és el cas base per al factorial? Algú que ho va escriure i que no té encara es parla, quina és la base cas factorial? ESTUDIANT: Si n és menor de 2, retorna 1. JASON Hirschhorn: Si n és menys de 2, retorna 1. M'agrada això, perquè això s'encarrega de 0 i 1. Així que farem x <2, retorna 1. Si ens creuem 0, si aconseguim passat 1, aquesta funció es tornar immediatament gener. Si ens passem un nombre més gran que o igual a 2, anem a tenir la nostra crida recursiva. I llavors, com és que funcionarà? Pot algú que va treballar en aquest que no ha parlat encara em donen la crida recursiva per a aquesta funció en pseudocodi? Si ens passem d'un nombre x i és més gran que 2, el Què volem fer? També hem d'exemple escrit en la secundari que li podria donar una pista. ESTUDIANT: Truqui x vegades l' factorial de x almenys 1? JASON Hirschhorn: Exactament. Anem a tornar x vegades el factorial de x almenys 1. I això, tot i que he escrit a dalt, bàsicament, el que va dir en anglès, aquesta funció factorial es dirà de nou. Es va a executar en x almenys 1. Tornarà amb algun sencer, i llavors va a multiplicar aquests dos junts, i aquest valor serà tornat al que sigui cridat a aquest funció factorial, el que podria ser un altre exemple de aquesta funció factorial. Així que és un exemple d'un recursiva funció, una molt funció recursiva simple. Però la majoria d'ells serà així. Si vols un bon recursiva lluitar per la prova, tracti de codificació recerca binària recursiva. Perquè si ho fessis de cerca binària per problema va fixar tres, probablement ho va fer iterativa en un bucle while. Però també pot ser escrit de forma recursiva. Vas a haver de escriure la seva pròpia funció separada que porta algun diferents arguments de línia d'ordres - o no els arguments de línia d'ordres, alguns diferents arguments només regular. Però es podria escriure de recerca binària de forma recursiva així. ESTUDIANT: Així que també podria haver escrit, en comptes de x menys 1, que també podria haver escrit x menys menys, ja que podria tenir escrit minus minus x. Pots explicar molt ràpidament per què aquestes serien les coses diferents, com quina és la diferència entre x menys menys i menys menys x? JASON Hirschhorn: No, no estic entrarà en això. Però vaig a parlar amb vostè sobre ell després d' classe. x menys menys, menys, menys x disminuir x en 1. Però ho fan una mica diferent. Però jo no vull entrar en això. Altres preguntes sobre la recursivitat o aquesta funció? Això no és realment fins i tot pseudocodi. Això és bàsicament el codi en C escriviu per això. OK, qualsevol altra pregunta sobre els temes fins aquí? Sí ESTUDIANT: Tinc un petit repàs a la punt i flotant de precisió. JASON Hirschhorn: Flotant punt i precisió. Pot algú realment ràpid em fa un resum de punt flotant i precisió? Tots vostès que havies de fer això per a la seva problema establert, pel que estem tots familiaritzat amb ell. O potser no tots vostès. Algú? Doneu-me un punt de començar. Punt flotant i precisió. Quin és el problema? Sí Victòria? VANESSA: Vanessa. JASON Hirschhorn: Vanessa. Ho sento. VANESSA: Només hi ha un nombre finit de nombres que poden ser representats perquè estàs en una, en la nostra cas, un sistema de 32 bits. Així que tipus d'haver de compensar alguns números. JASON Hirschhorn: Així que això és exactament correcte. Hi ha només una certa quantitat de nombres que poden ser representats. Si es multipliquen dos nombres molt grans, podria desbordar la quantitat dels espais que ha de representar un nombre sencer. És per això que de vegades s'utilitza un long long en lloc d'un int. Això té més espais. Pot contenir un nombre més gran. Punt flotant de precisió té a veure amb això, sinó que també té a veure amb la fet que els nombres decimals són no sempre representat. Ho sento. Permetin-me dir-ho d'aquesta còpia de seguretat. El nombre decimal 1.0 no és sempre representat com és d'esperar, 1,000000000. A vegades es representa com 1,000000001 0,999999999 o. Es podria fins i tot 89 llançat en algun lloc. Així que els nombres decimals no són representat exactament igual que ho faria esperem que siguin representats. Així que en conjunt de problemes - va ser dues? - problema va fixar dos, on ens topem amb Els nombres de punt flotant, quan volíem que representen exactament el que volíem que representen, el nombre de monedes d'un cèntim, o el nombre de centaus, multipliquem per 100 d'ells. Les envoltem. I després li tallem tot darrere del punt decimal. Això era per assegurar-se que ho farien realitat és igual exactament el que volíem que igualen. Perquè quan es pren una cosa que és Un flotador i fer-ne un int, que tallar tot a la dreta de la coma decimal. Com que hi ha una mica de punt flotant imprecisió, 100.000 podrien ser representats com 99,999999999. I si el que va tallar tot per la dreta immediatament, anem a obtenir el nombre equivocat. Sí ESTUDIANT: Jo tenia una pregunta sobre el càsting. En quin ordre se li ocorre entrar? Si ho fa surar, suports, 1 dividits per 10, és el que fa 1 dividit per 10, a continuació, obtenir 0,1, després gireu en un flotador? JASON Hirschhorn: Si ho fa surar 1 dividit per 10 - ESTUDIANT: Sí, i llavors és igual a - així, ho faria normalment tenir igual - Sí Vols fer un flotador, oi? JASON Hirschhorn: OK, així que anem a utilitzar això per ramificar a esbrinar les respostes a aquestes preguntes a través de la codificació. Com que és probable que tingui una gran quantitat de aquestes preguntes minuts, i una bona manera per resoldre'ls és a través de la codificació. Així que anem a codificar això en aquest moment, i després anem a tornar enrere i codificar la pregunta que tenia. Així que la primera línia - No hauria d'haver escrit - el que és el primer que volem fer quan obrir un nou arxiu en gedit? ESTUDIANT: Include. JASON Hirschhorn: Inclogui què? ESTUDIANT: biblioteca CS50. JASON Hirschhorn: OK. Què més hem d'incloure? Només anem a comprovar el que succeeix quan llances alguna cosa a un flotador. Però, què necessitem per incloure si estem va a escriure un programa en C? ESTUDIANT: E / S estàndard JASON Hirschhorn: stdio.h. En realitat no necessitem, per a aquest programa, cs50.h, encara que és Sempre és útil incloure. Però nosaltres sempre necessitem stdio.h. ESTUDIANT: Quan es codifiquen en C? JASON Hirschhorn: En programar en C. Així que m'ho guardo com l'arxiu c .. Tinc algunes bones ressaltat de sintaxi. Vaig escriure buit interior principal. Què significa el buit? ESTUDIANT: No prendre cap arguments de la línia d'ordres. JASON Hirschhorn: mig buit, en aquest cas, el principal no es fa arguments de la línia d'ordres. En altres casos, vol dir que la funció no pren arguments de la línia d'ordres. O la funció, si jo hagués d'escriure void main (void), que dirien principals no tornar res. Així buit només significa res. Què faria jo escric si hagués de prendre arguments de línia d'ordres? ESTUDIANT: int c arc arc cadena de v JASON Hirschhorn: int argc argv cadena. És això cert? ESTUDIANT: És claudàtors argv estrella característiques. JASON Hirschhorn: Així que vostè podria escriure suports argv cadena o argv estrelles caràcters claudàtors, però que necessita els claudàtors. A causa argv és un array de cadenes, recorda. No és només una cadena. Així argv cadena és, aquí està una cadena crida argv. Suports argv cadena és, aquí està una matriu de cadenes. Suports argv cadena argc Així int seria una cosa que em probablement escriure. Així que volia guardar en un sencer? ESTUDIANT: Sí, sencer. O en un flotador. JASON Hirschhorn: En un flotador? Igual que, float x és igual a 1 dividit per 10. JASON Hirschhorn: OK. Com puc imprimir un flotador a printf? Què? ESTUDIANT:% f. JASON Hirschhorn:% f. Què és un nombre enter? d o i. Què és una cadena? ESTUDIANT: s. JASON Hirschhorn: s. Com puc obtenir una nova línia? ESTUDIANT: backslash n. JASON Hirschhorn: Què he de fer per tornar si s'executa correctament principals? ESTUDIANT: 0. He de escriure aquesta línia, però? ESTUDIANT: No Bé, no anem a escriure, llavors. Tots poden llegir això? S'assembla una mica petita. Tots poden veure, o hauria Ho faig més gran? Crec que per a la càmera, farem és una mica més gran, però. JASON Hirschhorn: Si vull convertir aquest . C presentar en un arxiu executable, el que Per què escric? ESTUDIANT: Feu la prova. JASON Hirschhorn: Ho sents? ESTUDIANT: Feu la prova. JASON Hirschhorn: Feu la prova. Estàvem parlant de aquesta línia abans. Clang. Què hi ha so metàl · lic? El nom del compilador. Quina és aquesta línia? ESTUDIANT: Estableix que per a la utilització de GDB. JASON Hirschhorn: Conjunts cap amunt per a ús de GDB. Aquesta línia, què és això? ESTUDIANT: El codi font. JASON Hirschhorn: Aquest és el arxiu d'origen, l'arxiu c .. Què fan aquestes dues línies? O aquests dos no línies. ESTUDIANT: Anomena ho prova. JASON Hirschhorn: Així que el guió o diu, nomenar alguna cosa diferent. I aquí estàs cridant prova. Si jo no he de, Quin seria el nom d'aquesta? ESTUDIANT: a.out. JASON Hirschhorn: a.out. Què fa això? ESTUDIANT: Vincula la biblioteca matemàtica. JASON Hirschhorn: Vincula a la biblioteca de matemàtiques. No incloem la biblioteca matemàtica, però ja que és tan comú, que han make escrit per incloure sempre la biblioteca matemàtica. I de la mateixa manera, el que inclou la biblioteca CS50. Acceptar, pel que si enumerem, ara tenim un executable anomenat prova. Per executar-lo, escric prova. Veig que el meu punt flotant, com era d'esperar, és igual a 0. Això - de manera que - ESTUDIANT: Llavors, si vostè posa surar ara, com ho llances com float - JASON Hirschhorn: Cast la 1 a un flotador? ESTUDIANT: No, tiri la cosa completa - si. Si vostè acaba de fer això, Això ho fa un 0,1? JASON Hirschhorn: OK, així que molt ràpid, 1 dividit per 10, aquests són sencers es divideixen. Així que quan es divideix nombres enters, són 0, i que està estalviant que 0 en un surar, perquè la barra és només la divisió entera. Així que ara estem convertint quelcom en un flotador. Anem a veure què passa. Anem a fer la prova. Així que ara veiem que aquesta barra no era divisió entera, que estava flotant divisió de coma. Com que un dels seus arguments havia estat tirat a un flotador. Així que ara que estava dient, el tractament d'aquesta divisió com que estem tractant amb punts flotants, no amb nombres enters. I així obtenim la resposta que esperem. Anem a veure el que passa - Ui. Si volgués imprimir més decimals llocs, com podria fer-ho? Punt f Point, o com molts: ESTUDIANT decimals que desitgi. JASON Hirschhorn: Així que imprimeixo 10 llocs decimals. I ara veiem que estem rebent algunes coses rares. I això va tornant a la teva pregunta sobre de coma flotant imprecisió. Hi ha coses rares emmagatzemat aquí. Bé, això respon a la teva pregunta? Què més vols per codificar ràpidament? ESTUDIANT: Jo només volia veure si No, si t'alliberes una mica de punter, si aquest punter encara hi havia emmagatzemat en que la direcció del que havia estat assenyalant prèviament. JASON Hirschhorn: OK, pel que farem això. Caràcter ptr estrella, això crea una variable anomenat ptr de tipus char estrelles. Com escric malloc? Alden? ALDEN: Just malloc. Però llavors ha de ser la mida de, i en aquest cas, suposo que s'havia estar apuntant a char. Així que seria caràcters. JASON Hirschhorn: OK, així que més genèricament, Inside - anem a editar. Malloc Dins, desitja que el nombre de bytes en el munt. En general, el que hem vist que som fent és que anem a malloc cadenes, per exemple, o matrius d'enters. Així que si volem octubre sencers, o el 10 caràcters, 10 ens donarà 10. I a continuació, la mida dels caràcters donaria ens que la mida de caràcters, que en aquest cas és d'1 byte. Tenim 10 bytes. Si haguéssim d'escriure la mida de int, això ens donaria 40 bytes. Així que més genèricament, a l'interior de malloc és el nombre de bytes que desitja. En aquest cas, estem rebent 1 byte. El que sembla com un ús estrany de malloc, però per al nostre propòsits té sentit. Així que cal. Anem a trucar gratis. Ens desfem d'ella i fem servir ptr nou. I què voleu comprovar? ESTUDIANT: Jo només volia comprovar si o no hi havia res dins d'ella. JASON Hirschhorn: Així que si apuntava a alguna cosa? ESTUDIANT: Sí, exactament, si encara tenia una adreça de memòria. JASON Hirschhorn: ¿Així que vols per comprovar el valor de ptr? ESTUDIANT: Sí, exactament. JASON Hirschhorn: Què és el que escric aquí si vull comprovar el valor de la punt - el que és, Jordània va dir, el valor? O el que s'emmagatzema dins ptr? ESTUDIANT: Direcció de la memòria. JASON Hirschhorn: Direcció de la memòria. Així que si jo escric només això, que va a dóna'm el valor de PTR. I com puc imprimir a terme una adreça de memòria? Quina és la cadena de format per a una adreça de la memòria? ESTUDIANT:% p. JASON Hirschhorn:% p. % S és una cadena. % P per al punter. És això cert? Això és correcte. Així ptr és igual a - que encara té alguna cosa en ella. Aquesta és probablement una més pregunta interessant. Què fa aquesta línia? ESTUDIANT: falles Seg JASON Hirschhorn: Què? ESTUDIANT: Crec que SEG faltes. JASON Hirschhorn: Hm? ESTUDIANT: Crec que SEG culpa. JASON Hirschhorn: Així que aquesta línia de ptr codi, estel, el que Què significa l'estrella? ESTUDIANT: El contingut d'. JASON Hirschhorn: Si. Anar a treure el contingut d'. Així que això va a anar a la memòria abordar allà i donar-me això. Solia% c aquí perquè hi ha són caràcters emmagatzemats allà. Així que anirem a aquesta direcció ens Acabo de veure - o probablement serà un mica diferent aquest vegada que executem el programa. Però anem a anar a aquesta adreça que sabem que encara hi ha i veure el que hi ha. Així que no SEG culpa. Simplement no ens ha donat res. Pot ser que hi hagi en realitat ens ha donat alguna cosa, simplement no ho pot veure. I això va de nou a aquesta idea - i nosaltres no tindrem massa en això, perquè això és més enllà de la abast d'aquest curs. Però hem parlat aquí, si ens va anar més enllà dels límits de la matriu per 1, podríem no tenir problemes. De vegades, quan et vas fora per 1, que estàs fent alguna cosa malament, i vostè podria ficar en problemes. Però no sempre es fiquen en problemes. Depèn de quant d'una cosa dolenta que Què, et vas a ficar en problemes. La qual cosa no vol dir, ser descuidat amb el seu codi. Però és a dir, el programa no sempre deixar de fumar, fins i tot si vas a algun lloc que no has d'anar. Un bon exemple d'això és, una gran quantitat de persones en el seu problema conjunt 3, que tenia 15 anys, no va comprovar la límits de la junta. Així que va mirar a l'esquerra, va mirar a la dreta, va mirar a dalt, es veia a la part inferior. Però vostè no va comprovar per veure si la part superior va ser en realitat estarà en el consell. I un munt de gent que va fer això i va resultar que en, el seu programa va funcionar perfectament, perquè on estava aquest tauler emmagatzemada a la memòria, si vostè va ser un per sobre d'ella o comprovat que la memòria direcció, no hi havia res particularment horrible que, pel que el seu programa no era va a cridar a vostè. Però seguiríem enlairar punts si que no comprovi que, pel fet que estaven fent una cosa que no estaves suposa que ha de fer, i vostè podria tenir ficat en problemes. Les probabilitats són, però, és probable que no ho vas fer. Així que això és per demostrar que, sí, encara podem anar-hi. I no entrarem en problema en aquest cas. Si tractem de fer llegir el propers 100 caràcters, havíem probablement ficar-se en problemes. I vostè pot codificar la lectura de la següent 100 caràcters si vol fent algunes espècie de bucle. Sí ESTUDIANT: Des que ens van assignar que espai d'un valor real, no ho faríem realment serà capaç de veure res. Cal provar-ho amb l'ajust que igual a com C o alguna cosa? JASON Hirschhorn: Molt bona pregunta. Com es configura el valor - quina línia de codi Com puc escriure en la línia 07:00 per fer el que vas dir? ESTUDIANT: Star ptr és igual a un sol cita c Extrem cometa simple. JASON Hirschhorn: Així que això és posar un caràcter, c, en aquest lloc, perquè una vegada més, aquesta estrella significa anar a allà. I quan s'usa en el costat de la mà esquerra un operador d'assignació, que és igual a signar, que no anem a aconseguir que la valor tant com estableix aquest valor. Ara anem a veure què passa. Posem alguna cosa allà i va ser allà. Cridem lliure. Algunes coses que probablement va succeir en el munt. Per tant, ja no hi és. Però de nou, no estem obtenint en problemes per anar-hi. Estic fent això en el codi per il · lustrar que molts d'aquests preguntes que vostè té, que són molt interessant respon a una gran quantitat de temps. I ells són realment bones preguntes. I vostè pot calcular cap a fora en seu compte si, per exemple, ja no estem a la secció. Sí ESTUDIANT: Com que vostè no va a enviar el punter en qualsevol lloc, és el que necessita utilitzar malloc? JASON Hirschhorn: Així que això es remunta a la seva pregunta inicial. [? ?] És només una variable local? Malloc aquí no és que convincent. L'ús d'malloc aquí no és que convincent perquè és només una variable local. ESTUDIANT: Llavors podries fer carbó ptr estrelles és igual a saludar? JASON Hirschhorn: Oh. Així que anem a tornar ara a la seva pregunta inicial. Crec que vostè no està satisfet amb la meva resposta. ¿D'acord? Igual que? ESTUDIANT: Sí Esperi. JASON Hirschhorn: I on Què vols imprimir? Així que anem a imprimir una cadena d'aquesta manera? ESTUDIANT: Interessant. JASON Hirschhorn: Això diu això argument té el tipus d'un caràcter. Així que això ha de ser un caràcter. ESTUDIANT: Tot just pren la primera. JASON Hirschhorn: Així que aquesta és el que vaig dir abans. Com he dit, no és l'emmagatzematge de la cadena dins de punter variable. És l'emmagatzematge - ESTUDIANT: El primer valor de la cadena. JASON Hirschhorn: La direcció de el primer valor de la cadena. Si ens anem a imprimir això, estem obtenir el valor dins de punter. I veurem que és, de fet, una adreça de memòria. Això té sentit? Ho sento. Espera, això respon a la teva pregunta, però? ESTUDIANT: Sí JASON Hirschhorn: Aquesta línia de codi és la creació d'una cadena i després un altre punter variable que s'apunta d'aquesta cadena, de la matriu. Sí ESTUDIANT: Llavors, si ens vam anar un record seguir fent front, trauríem el h? S'ha emmagatzemat com una cadena? JASON Hirschhorn: Igual que, ho vam fer - així que això és valuós fer. Aquesta és l'aritmètica de punt, que vostès han vist abans i ha de ser relativament còmode. Això és similar a l'escriptura - si haguéssim d'escriure aquesta línia de codi, hem vist la notació de matriu abans. Això ens ha de donar la segona valor en aquest array, h. Si féssim això, això també ha de donar nosaltres el segon valor en aquest array. Com que no va a la memòria direcció de la primera hora, però el adreça de memòria de la cosa d'una vegada. I llavors els desreferencias operador estrelles aquest punter. I de nou, anem a veure. Rebem h de nou. ESTUDIANT: Què significa exactament dereference significa això? JASON Hirschhorn: Dereference és una paraula elegant per anar a. Anar a això i el que cal és eliminar la referència d'un punter. És només una paraula elegant per això. ESTUDIANT: Si volguéssim imprimir tota la cadena, podríem fer punter signe? JASON Hirschhorn: OK, estem farà una pausa aquí. Anem a acabar aquí. Ampersand li dóna l'adreça d'un ubicació, així que quan vostè fa signe de una variable, que et dóna la direcció on s'emmagatzema aquesta variable. Punter Ampersand li donarà la Direcció de ptr ptr on està en la memòria. No anirem a amb aquest exemple. Vostè pot esbrinar aquests coses pel seu compte. Però de nou, això podria fins i tot ser un Rayando poc més enllà del que necessita saber per l'abast d'aquesta meitat de període - o aquest qüestionari, més aviat. Ho sento. Seguirem endavant, perquè ho faria agradaria fer un problema de codificació abans d'hora s'ha acabat. I anem a codificar el que penso és la més convincent d'aquestes exemples, atoi. Així que això era una qüestió sobre un concurs fa dos anys. I jo tinc al tauler aquí. La gent es va preguntar en el qüestionari - se'ls va donar una mica més tesxt en la pregunta, però he eliminat la text, perquè no era necessari per al nostre propòsit ara. Era només alguns antecedents en el atoi va fer. Però tots vostès saben i són molt familiaritzats amb atoi. Li suggereixo que codifica aquesta en un full de paper. També li suggereixo que utilitzi l'estratègia que hem repassat molt en la nostra secció. En primer lloc, assegureu-vos que entén el atoi està fent. Fes un dibuix o arribar a algun imatge mental d'ell al seu cap. A continuació, escriviu el pseudocodi per això. En el qüestionari, si l'únic que aconsegueix és pseudocodi, almenys posar alguna cosa a sota. I després assignar aquest pseudocodi a C. Si vostè té un xec en el seu pseudocodi, com comprovar si alguna cosa és 1, que assigna a un cas condicions i així successivament. I, finalment, el codi del programa en C. Així que tornar a atoi i trigar cinc minuts codificar això en un full de paper, que és probablement el quantitat de temps que el portarà en un qüestionari per atoi codi. De cinc a 15 minuts, de cinc a 12, de cinc a 10 minuts, es tracta de la quantitat de temps que li dedica a aquesta pregunta de la prova. Així trigar cinc minuts, si us plau. I si vostè té alguna pregunta, llevant la mà i vaig a entrar en raó. [Converses paral · leles] JASON Hirschhorn: OK, així que que era de cinc minuts. Aquest va ser probablement per la quantitat de temps que passaria en aquest en un concurs, potser la part baixa de l'època. Anem a recapitular una mica. Comencem codificar aquesta. I si no arribem fins al final, les respostes a aquesta i aquesta pregunta d'examen estan disponibles, un cop més, La tardor de 2011 és quan aquesta pregunta aparegut en el qüestionari. I va valer la pena vuit punts en el qüestionari a continuació. Vuit punts està a l'extrem superior de la quantitat de punts alguna cosa val la pena. La majoria de preguntes estan en el rang d'un a sis punts. Així que aquesta és una més desafiant pregunta, segur. Pot algú ajudar-me a començar? En general, què anem a voler fer amb aquesta funcionar atoi, lògicament? Què volem fer? Així que anem a escriure alguns pseudocodi. ESTUDIANT: Converteix caràcters en enters. JASON Hirschhorn: Converteix caràcters en enters. D'acord. Llavors, quants caràcters estem va a haver d'anar a través de? ESTUDIANT: Tots ells. ESTUDIANT: Tots els personatges a la cadena. JASON Hirschhorn: Tots els de la caràcters de la cadena. Així que si volíem anar a través de cada caràcter d'una cadena, el que és una cosa en C que hem vist que ha permès nosaltres anar a través de cada caràcter d'una cadena? ESTUDIANTS: Un bucle for. JASON Hirschhorn: Un bucle for. Així que anem a recórrer tots els personatges en si. Llavors, què anem a voler fer quan arribem a un personatge en concret? Diguem que estem aconseguint passem per un 90. Obtenim el 9. És un personatge. Què volem fer amb que el caràcter setembre? ESTUDIANT: restar de caràcter 0? ESTUDIANT: Afegeix 0? JASON Hirschhorn: Resti des de 0 personatge? ESTUDIANT: Sí JASON Hirschhorn: Per què que vols fer això? ESTUDIANT: [inaudible] valor. El seu valor int. JASON Hirschhorn: OK, així que ens prenem el caràcter 9, restar de caràcter 0 per obtenir una nombre enter real setembre. Sweet. I, com saber que el caràcter 9 menys 0 caràcters és de 9? Què gràfica què ens fixem en? ESTUDIANT: Hi ha lògicament 09:00 llocs entre 9 i 0. O vostè podria mirar a la taula ASCII. JASON Hirschhorn: taula ASCII. Però sí, té vostè raó també. Llavors restem 0. Així que ara tenim el sencer setembre. I què és el que volem fer amb això? Si tenim 90, és el primer sencer tenim, el que volem fer? ESTUDIANT: Em poso en un nombre enter temporal matriu, i després fer les matemàtiques perquè després de convertir en un cap. JASON Hirschhorn: OK. ESTUDIANT: Vostè pot començar a finals de la matriu i després avançar de manera que cada vegada que es mou cap endavant, el multipliques per 10. JASON Hirschhorn: OK. Això sona com una molt idea convincent. Podem començar pel final de la nostra sèrie, i podem utilitzar strleng. Podem utilitzar strleng aquí. Aconseguirem la durada de la nostra cadena. Partim al final. I + la primera, només prenem que sencer, i potser vam crear com un nova variable sencera fins a la part superior on estem emmagatzemant tot. Així el cicle que recorre tots els caràcters en si de darrere cap endavant, restem 0, i llavors ho prenem, i en funció de on està, ho multipliquem per una potència de 10. Com que la primera d'elles, què fem multiplicar el caràcter més a la dreta pel camí? ESTUDIANT: 10 al 0. JASON Hirschhorn: 10 a 0. Què és el multipliquem el segon caràcter més a la dreta pel camí? ESTUDIANT: [inaudible]. JASON Hirschhorn: Què? ESTUDIANT: 10 a la 1. JASON Hirschhorn: 10 a la 1. El caràcter terç més a la dreta-? ESTUDIANT: 10 a la 2. JASON Hirschhorn: 10 a la 2. ESTUDIANT: Ho sento, no ho entenc el que estem fent aquí. JASON Hirschhorn: OK, Tornem, doncs. Així que anem a obtenir aprovada en una cadena. Com que estem escrivint atoi. Així que van passant d'una cadena. Diguem que estem aconseguint passem a la cadena 90. El primer que farem és establir una nova variable de tipus sencer que som només crearà com el nostre nou sencer. Això és el que per tornar al final. Hem d'anar a través de tots els personatges en la cadena perquè hem determinat que hem de tocar cada un i a continuació, afegir al nostre nou sencer. Però no podem afegir com un nombre. No podem prendre 9 i afegir setembre al nostre número sencer. Depèn de quin lloc és a la cadena. Haurem de multiplicar que per una potència de 10. Perquè així és com a base de 10 obres. Així que anem a obtenir el real caràcter, o el nombre sencer real nombre, restant caràcter 0 de caràcter 9 com vam fer amb restant qualitat capital A partir d' qualsevol que sigui el caràcter que hem tingut en una de aquests problemes. Així que anem realment obtenim un nombre de 0 a 9 guarden com un nombre real, i anem a es multiplica per una potència de 10, depenent on estem a la cadena. I després anem a afegir de nou en la nostra nova variable sencera. Així que el que això es veuria com ho faria BE - dibuixarem aquí. Si ens passem a la cadena de 90 - ESTUDIANT: [inaudible]. JASON Hirschhorn: Però atoi pren una cadena. Així que anem a anar a través d' l'explotació. Li donarem passem al 90. Anem de nou a la part davantera. Prenem el 0. ESTUDIANT: Ho sento. Potser això és una estupidesa. Si ens anem a aprovar en una cadena, per què és 90 el que estem aconseguir passar a? Com que 90 és un nombre enter. JASON Hirschhorn: Perquè atoi presa cadena i la converteix en el nombre enter representació d'aquesta cadena. Però la cadena 90 no és el nombre enter 90 o el nombre 90. La cadena 90 és un conjunt de dos, o tres personatges, més aviat, el 9 caràcter, el caràcter 0, i la barra invertida 0 caràcters. I estem escrivint atoi perquè, per exemple, quan es pren la comanda argument de la línia, i es guarda en argv, es guarda com una cadena. Però si vostè vol tractar com un nombre, que necessita per convertir-se en un nombre enter real. La qual cosa vam fer un dels nostres butlletins de problemes. El que vam fer en una sèrie dels nostres butlletins de problemes. Tothom que va tenir un sencer com un argument de línia d'ordres. Així que per això la nostra funció atoi pren una cadena. Així que de nou, en el nostre exemple, estem Va a prendre l'última. Anem a restar el caràcter 0 d'ell, perquè els personatges 0 restat pel caràcter 0 li dóna el nombre real 0, segons les matemàtiques ASCII que fem. Atès que els caràcters es representen com diferent de la seva real - la un caràcter, per exemple, minúscula és 97. No és - Ui! No és tot el que es pot esperar que sigui, 0, per exemple. Així que cal restar el caràcter per aconseguir un 0. Així que farem això aquí per obtenir el nombre real. I després anem a multiplicar per una potència de 10 depenent d'on es es troba a la cadena, i després prendre aquest i afegir al nostre marcador de posició variable, de manera que podem arribar a nostre nou sencer final. Això té sentit per a tothom? Així que no anem a codificar aquesta en aquest moment, perquè estem aconseguint curt de temps. Demano disculpes pel temps d'això. Però això és el que, amb sort, ho faria ser capaç de fer en el concurs - al almenys, aconseguir aquest pseudocodi en escrit. I després, si haguéssim d'escriure la pseudocodi, en realitat, podríem fer això amb força rapidesa. Cada línia de comentaris que escrivim aquí es tradueix en prop una línia de codi C. Declarar una nova variable, l'escriptura un bucle, alguns resta, alguns multiplicació i alguna assignació. Ens agradaria probablement també volem escriure una línia de retorn. També pot ser que vulgui posar algunes comprovacions en aquí. Sí ESTUDIANT: Llavors, podem tractar s com la cadena real? Perquè jo sé que és només una direcció. Igual que, com obtenir la longitud d' la cadena que es passa a través de? JASON Hirschhorn: Llavors, com la longitud d'una cadena? Strlen. ESTUDIANT: strlen, si. Però es pot posar s com el argument per això? JASON Hirschhorn: Així strlen porta una estrella de carbó. I resulta que l'estrella char, i segueix comptant fins que arriba a un barra invertida 0. strlen era en realitat un dels altres programes que anaven a codi. Aquesta és una altra bona per al codi. Que un és una mica més fàcil, ja que si vostè pensarà en això conceptualment - Que acabo de dir en veu alta - strlen segueix un punter i manté en marxa i comptar i fer seguiment fins arribar a una barra invertida 0. ESTUDIANT: OK, ho tinc. JASON Hirschhorn: Així que el millor de sort en concurs 0 de demà. Si vostè té alguna pregunta, vaig a estar fora després d'això. No dubti en enviar un correu electrònic. Arribar al seu propi TF si ets no al meu secció, o que la meva per correu electrònic si vostè ho desitja. Si vols flipar i acaba d'enviar em un correu electrònic, un correu electrònic Freakout, vaig a li enviarà de tornada, com, una cara somrient, o, com, una broma o alguna cosa així. Així que no dubteu a fer això també. Bona sort una altra vegada, i ho faré ens veiem la setmana que ve.