JASON Hirschhorn: Benvingut, tothom, fins a la setmana 6. Estic content de veure'ls a tots vius i ben després Qüestionari 0, perquè sé que era una mica aspre. Però, per sort, gràcies a tots va fer increïblement bé. I el que és meravellós. Si estàs en la meva secció, li he donat més de fer una còpia dels seus exàmens ja. Un parell de vostès, em vaig a trobar amb després de la classe. I si vostè és un estudiant de l'extensió i la no ha rebut el seu concurs de nou però, el TF està probablement treballant en això i classificació, i el recuperarà a la brevetat. Així que els meus estudiants d'extensió que són veient ara mateix - en viu amb sort - Vaig a aconseguir els seus qüestionaris poc així. La nostra agenda per avui és el següent. En primer lloc, anem a repassar alguns recursos que CS50 proporciona. Anem a repassar Qüestionari 0 següent, i Vaig a respondre a qualsevol pregunta que ningú té al voltant de problemes concrets. I després, anirem més de / S d'arxius i problemes 5. Aquests dos últims temes es duran a el gruix de la secció actual. Poso aquesta llista cada setmana com un recordatori a tots vostès, però de nucli secció, només tenim 90 minuts - que no són capaços de cobrir tot el que jo li encantaria cobrir per a vostès. Però tenim un munt de recursos per dibuixar sobre com s'arriba a saber el material i el treball a través de el seu problema es posa. Un recordatori que tinc en línia un text quadre, creat per tu per omplir si tenir cap reacció per a mi, tant positius com constructiva, sobre la secció. Aquesta URL es troba aquí baix. Així que si us plau, prengui un moment si vostè té qualsevol retroalimentació, ja sigui durant la secció, o després, o després de veure el vídeo en línia, per donar-me la seva reacció. Realment estima tots i cada un d'ells. Així que he estat tenint converses petites amb una gran part del meu estudiants durant tota la setmana - el lliuro proves d'esquena, parlant de la Per descomptat, en veure com ho està fent. I un tema ha sorgit una i més de parlar de - a en particular - butlletins de problemes. I he encapsulat aquest tema en el tauler en aquest moment. En essència, hi ha una diferència entre l'encesa en una cosa que és es fa correctament i una mica el que es fa bé. La majoria de la gent ha estat fent fantàstic en termes de correcció - De 5 o 4 sobre tots els conjunts de processadors. La majoria de la gent s'està aquells tot el temps. No obstant això, només perquè vostè ha fet alguna cosa bé no vol dir que has fet una cosa tan elegant, o de manera eficient, o la forma més neta que podria haver fet. I això és el que el disseny - i, en menor grau, l'estil - eixos són per. Així que tots vostès estic pressionant, i altres FF estan empenyent vostès, no només al seu torn en el que és correcte, però alhora en les coses que són codificades també. Si no ho fa innecessari que els bucles, No tornar a calcular les variables si vostè no ha de fer-ho. Per exemple, mirant de nou a conjunt de problemes 4, quan la col · locació dels maons a la pantalla, cada fila - tots els maons en una fila donada té la mateixa coordenada i - la mateixa altura de coordenades. De manera que la coordenada i no necessitaven es calcularà a l'interior de l'interior niat bucle FOR que probablement va utilitzar posar els maons a la pantalla. Només cal calcular cada vegada que va encendre una fila, o mogut cap avall una fila. Així que dir que si hi ha 10 maons en una fila, cada maó pot tenir el mateix coordenada, i que la coordenada només es pot calcular un cop per a tots aquells. No necessita ser calculat 10 temps, ni tampoc aquesta necessitat càlcul a ocórrer en l'actual funció de trucada - la nova crida a la funció gracked. Així que si això va ser una mica confús per vostè, més genèricament, les coses que no cal que passi cada vegada vas a través d'un llaç per no haurien de ser posar dins del bucle FOR, i no ha succeir cada vegada que vagi a través del bucle FOR. Un altre bon exemple de disseny que vam veure en la setmana 3 per 15, vostè podria mantenir pista del zero. Així que al inicialitzar el tauler, save - en una variable global, potser - la x i coordenada i del zero. I llavors cada vegada que - en la seva funció de moviment, cada vegada que facis un moviment encertat, s'actualitza la ubicació de la zero. Això li estalviarà haver de fer bucles for niats per mirar a través de la abordar cada vegada que en la seva funció de desplaçament i trobar el zero, o trobar la rajola, a continuació, comproveu el que hi ha al costat. En el seu lloc, vostè té la ubicació de la zero, vostè pot simplement mirar amunt, avall, i a l'esquerra i dreta de la mateixa, per trobar la rajola que estava buscant. Així que en termes dels programes que estem escriptura, mai no són prou grans que algunes d'aquestes decisions de disseny són realment va a obstaculitzar la seva programa o fer que s'executi més lentament, o potser es quedi sense memòria. Però seguim empenyent vostès escriure tan elegant i codi eficient possible. Així que si vostè acaba d'escriure les coses que tenen una significativament major àmbit d'aplicació, que s'escriurà amb bona dissenyar a més de ser correcta. Així que alguns de vosaltres té portat això. Això és una cosa que estem buscant - cosa que seguirem empènyer nois a. Si alguna vegada té alguna pregunta sobre la disseny del seu programa, no dubti en per arribar a mi, i estic feliç de caminar a través del seu programa amb vostè, i assenyalar alguns dels dissenys decisions que va prendre, i li donarà una mica de suggeriments sobre com fer que fins i tot millors decisions de disseny. Així que seguirem endavant a parlar de Prova 0. Abans de fer això, algú té alguna pregunta sobre el que He cobert fins ara? [Cruixit] JASON Hirschhorn: Set segons. D'acord. Anem a parlar de Prova 0 per una mica. La majoria de vostès tenen el seu concurs esquena de 0. Si no ho fa, és d'esperar recordes una mica. Però si vostè ha pres Qüestionari 0, llavors També tindrà accés al PDF en línia a les solucions de mostra. Algú té alguna pregunta abans de ens vam llançar en el material de la setmana sobre un problema particular en el concurs 0 - ¿Per què la resposta és el que és? Hi ha algú confós sobre alguna cosa? Fins i tot si vostè té el problema de la dreta, però simplement li agradaria que li expliqui una mica més, estic feliç de fer-ho ara. Així que li he demanat a vostès per vingui preparat amb una mica de pensaments sobre el concurs 0. Llavors, qui li agradaria que ens començar amb una pregunta comentar sobre el concurs 0? [Cruixit PAPER] JASON Hirschhorn: No tothom fer perfectament. Així que sé [riu] ha d'haver algunes preguntes Qüestionari sobre 0. D'acord. Sí Ompica. OMPICA: Nombre 10. JASON Hirschhorn: Nombre 10. Quin era el número 10? OMPICA: The - JASON Hirschhorn: I haven't - OMPICA: include - JASON Hirschhorn: Nombre 10 era de vuit per i - i escriure vuit a? OMPICA: Si. JASON Hirschhorn: OK. Així que una altra pregunta que podria tenir preguntar va ser premonitori sóc? La resposta és sí. A la secció abans de la prova, li vaig preguntar vostès per codificar tant Sterling i vuit a i. Tots dos es va passar a aparèixer en el qüestionari. Així que espero, que va pagar atenció a això. I si ho haguessis fet, llavors vostè hauria de probablement fet bé en els dos. Però vuit a i, en realitat no ens Codi a classe, però va ser, de nou, preguntar en el qüestionari. Així que un parell de coses a tenir assenyalar en codificar vuit a i. El primer, per la pregunta, era que vostè necessita per comprovar si la cadena era igual a nul. Un parell de persones van tractar de comprovar més endavant al programa si s abraçadora i era - de manera que un caràcter específic en què string - era igual a nul. Però recordeu, que és essencialment nul - És bo pensar en null com un punter zero - un punter a zero - en algun lloc de la memòria on mai es pot tenir accés. Així que si alguna cosa és igual a null, sabem que no s'ha inicialitzat, o no hi ha res allà. Així que s és un estel char, s suport d'i és un char. Així que té sentit comparar sa null, però no s abraçadora i en null. Però una vegada més - així que això va ser el primer que que se suposava que fer - assegureu-vos que vostè realment té una cadena real. A continuació, et volia anar a través d' cada caràcter de la cadena. I així, això seria com un suport de s I, per exemple, si i és l'iterador. I donar aquest caràcter, i obtenir el seu valor real. Vostè ho té emmagatzemat com un char, però el valor ASCII per al zero - zero com un personatge - no és en realitat el nombre enter zero. És algun altre número que pugui mirar cap amunt a la taula ASCII. Així que una manera de corregir perquè - probablement la millor manera per corregir que - es resta d'ell el valor del caràcter - zero com un caràcter. Cometa simple Així que menys, zero altra cometa simple. Això portarà el número que té com char, i fer-ho igual a el nombre com un nombre enter real. I que és molt similar a l'enfocament molta gent va prendre al problema conjunt 2, amb César i Viginere - aquestes xifres, quan es ells van ser rotant. Així que després que ho tens com un número de l' zero a nou, a continuació, - depenent a on va en el nombre final - que necessita per multiplicar per una potència de 10. Algunes persones es van traslladar de nou a la front, i multiplicat l'individu nombre per una potència de 10. Algunes persones es van traslladar de el front cap enrere - i així es va endur el més alt ordenar nombres primer - i salvaria els d'un variable de comptador global. I llavors cada vegada que a través de la DE llaç, multipliqui aquest gegant mundial contrarestar variable 10, per fer espai per al següent caràcter. Així que va ser una mica confús i sense jo escrivint a la pissarra. Però la solució de la mostra està disponible per a vostè. Però aquestes eren les coses grans que estàvem buscant. També una comprovació per assegurar-se que cada caràcter individual era de fet un caràcter entre zero i nou anys, i no algun altre personatge, igual que una A, per exemple. Aquestes eren les coses que estàvem buscant en aquesta pregunta. Respon això a la seva pregunta? OMPICA: Si. JASON Hirschhorn: OK. Hi ha altres preguntes Qüestionari sobre 0? Què passa amb la compilació? Tothom la compilació correcta? No Hi havia un - [Rialles] Una pregunta sobre l' procés de compilació? Wow. [Cruixit PAPER] JASON Hirschhorn: Si. Michael. MICHAEL: És el número 7 - a l'atzar? JASON Hirschhorn: Nombre 7. Número 7 era obtenir un nombre enter aleatori. Excel · lent. Així que et donen un nombre enter a i un b sencer, i vols un atzar nombre enter entre a i b. De fet, podem escriure aquest en el tauler, perquè aquest Era una línia de codi - una manera de fer-ho. Així que se'ns dóna com un Drand funció que podria utilitzar. I què fa Drand - suposant que ha estat cap de sèrie - el que no Drand tornar? MICHAEL: Un flotador entre 0,0 i 1,0. JASON Hirschhorn: Varis - si. Un nombre entre 0 i 1. I així hem B i A. I després tenim el nostre nombre aleatori entre 0 i 1 que ens ha donat Drand. Algunes persones van intentar posar b, o b menys a, o alguna cosa dins dels parèntesi. Això significaria que són arguments d'aquesta funció. Drand no pren cap argument - com getString fa No prengui cap argument. Així que és només parin obertes, prop Parin - i que, en si, és la crida de funció. I això li dóna un nombre entre 0 i 1. Per descomptat, tenim tota una gamma que els nombres poden estar dins Diguem, si b és 10 i és 5, que realment vull un nombre amb un rang de 5. Així que el següent que hem de fer és multipliqui això pel rang b, menys un. Així que suposant que això multiplicat. I això ens donarà un nombre dins d'un rang donat. I aquest rang seleccionat de ser el diferència entre B menys un. I, finalment, que només vaig a donar des de - dir el rang entre b, almenys una és 5, això ens dóna una nombre de 0 a 5. Però si a és en realitat 5, hem d'impulsar aquest rang fins a on és en realitat suposa que, mitjançant l'addició d'una. Així que té la dreta de la lògica. I llavors, ¿tindria una altra pregunta? MICHAEL: No Em sento molt ximple en aquests moments. [Rialles] JASON Hirschhorn: No No es senti realment ximple. Un nombre de persones que va lluitar amb aquesta pregunta. I després, l'altra pregunta és, Drand, vostè ha dit, li dóna un flotador - retorna un float. Però aquesta funció realment va demanar per a un sencer sigui retornat. No ha de jugar aquesta carta de manera explícita a un nombre sencer, perquè aquests operacions es tracten com un tot surar - com un nombre de punt flotant. T'agrada aquesta voluntat - fins i tot si això és un nombre enter, aquesta voluntat s'ha de multiplicar correctament. Tota la multiplicació funcionarà. No cal per llançar aquí. De fet, vostè no ha de llançar. Això ho faria - si vol emetre un nombre això és entre 0 i 1 - un nombre a l'atzar, un punt flotant - llavors o bé ser només 0 o 1, de manera si no es perden tots els que la precisió. Però al final, quan torni, es posa automàticament enviar com un sencer. Així que vostè no ha de fer que tirant a tu mateix. Així que aquesta era la resposta a què es tracti, el número 7. Alguna altra pregunta sobre Qüestionari 0? Sí, Annie. ANNIE: Quan fem servir recursiu - quan fem servir bucles iteratius? JASON Hirschhorn: Quan vostè utilitza recursiu - de manera més general, la pros i els contres de la recursivitat front un enfocament iteratiu. Algú pot oferir un professional o una estafa? Per favor? No pot ningú. Qui pot oferir un professional o una estafa? [Cruixit PAPER] ESTUDIANT 1: recursiva és menys codificació - teclejar menys? JASON Hirschhorn: Així que en general, recursivitat especialment, una funció - o un algoritme com a fusió tipus - que es presta a un enfocament recursiu - podria ser més senzill per codificar de forma recursiva. I així més sentit fer-ho de forma recursiva. Així que seria un professional de la recursivitat. Altres? Sí? Estudiant 2: Amb per la recursivitat - Utilitza més memòria. JASON Hirschhorn: Llavors, la dreta. Una funció recursiva mantindrà afegint marcs de pila a la pila. Així que si vostè està treballant en un munt de nombres, i han de trucar a aquest funcionar molt, evidentment ocupen més memòria, mentre que un enfocament iteratiu posarà només un marc de pila a la pila, perquè tot passa dins d'una funció. Qualsevol altre pros i els contres? Sí ESTUDIANT 3: Pros de la recursivitat. No ha de determinar en avançar en el nombre de vegades que el codi havia de ser repetit. Vostè pot tenir un nombre predeterminat de vegades que vostè ha de repetir, llavors recursivitat és millor, perquè que es necessita aquest resultat. JASON Hirschhorn: Crec que això és cert. Però crec que en ambdós casos ho faria mai - vostè probablement obtenir alguna entrada de l'usuari. O aquesta funció tindria alguna entrada que determinaria el nombre de vegades que ha d'executar. Així que en general, no ho faries codificar - fins i tot en un enfocament iteratiu - how moltes vegades que bucle hauria de córrer. Vas tenir una altra eres pensant, Annie? D'acord. Així que aquests són probablement els dos - el major pro i el major Amb per a una recursiva front un enfocament iteratiu. D'acord. Una mica més sobre Qüestionari 0? Anem a passar. File I / O. Hi ha un meravellós curt aquesta setmana a l'arxiu d'E / S que s'espera vostè ha vist múltiples vegades, i admirat. Una gran quantitat de treball va ser en això, i no tinc sentit és increïblement servicial. També vaig incloure l'enllaç en aquesta diapositiva, en cas que vostè no ha tingut un oportunitat de veure-ho 10 vegades. Per tant, anem a repassar breument la principals passos per obrir i treballar amb els arxius i, a continuació anem a submergir-se en un problema de codificació abans de examinant el conjunt de problemes. Així que de nou, em vaig a posar això en la pantalla, però jo vaig a parlar de només un minut sobre el que estem fa aquí amb l'arxiu I/O-- Què significa això? Això significa que podem crear la nostra programes i, a continuació, tenir els nostres programes sortida, i no han fet cap impacte en el món exterior del nostre programa. Però quan vam començar a treballar amb arxius - tant la seva lectura i la creació de ells - podem tenir algun efecte sobre la món exterior del nostre programa. Igual que si Microsoft Word no va poder perquè tots els documents de Word, a continuació, una vegada que Microsoft Word deixar de fumar, la totalitat del seu treball s'ha anat, i seria realment inútil. Nosaltres, en última instància volem ser capaços de escriure programes que poden afectar la món que els envolta, tant mitjançant l'adopció de entrades complexes - en termes d'arxius i a través d'arxius, i també la creació interessant i sortides de pes - pel que fa als diferents tipus d'arxius. Així que és per això que estem començant a aprendre a treballar amb els arxius. Més específicament, què el que fem és la següent. És molt simple. Només hi ha un parell de passos, i que s'enumeren aquí en aquest codi. Així que anem a anar a través d' aquest codi línia per línia. En primer lloc, es veu ressaltat - quan es treballa amb un arxiu, independentment del tipus de fitxer es tracta, vostè necessita per obrir-lo. I és que amb una crida a fopen - aquí mateix. Inclogui el nom de l'arxiu. Si l'arxiu no està en el directori, o la carpeta on aquest programa vida, llavors també han d'incloure una ruta en la qual arxiu és. Anem a suposar que aquesta arxiu anomenat "text.txt" - un document de text simple - es troba a la mateixa carpeta que aquest programa és. Així que aquesta és una altra cosa a tenir en ment - que si voleu obrir un arxiu en un altre lloc, que realment necessita per incloure la seva ubicació. En segon lloc, vostè pot passar un argument a fopen, i això és el que vols fer amb l'arxiu. Hi ha tres arguments principals que vostè passarà a fopen. Qui em pot donar els tres? Qui em pot donar un d'ells? Sí Estudiant 4: El nom de l'arxiu? JASON Hirschhorn: Ho sento. Tres arguments principals que es poden passar com a segon argument a fopen. Tens raó - el nom del fitxer és el primer argument. Però el segon argument a fopen són generalment tres cordes, i - si. S'allunya. ALLUNYA: A per annexats. JASON Hirschhorn: A, si vols annexar a un arxiu que ja existeix. ESTUDIANT 5: R per llegir. JASON Hirschhorn: A, si vulgui llegir des d'un arxiu. ESTUDIANT 6: W per escriptura. JASON Hirschhorn: I w, si vull escriure en un arxiu. Així que en aquest cas, estem escrivint a l'arxiu, pel que tenim w. L'obres, vostè també ha de guardar el arxiu en algun lloc, i això és amb la codi per al costat de la mà esquerra l'operador d'assignació - Estic creant un punter a un arxiu anomenat, en aquest cas, l'arxiu. Nosaltres no ens anem a preocupar del que esta tot en majúscules cosa FILE és. Només cal dir, que és un llarg corrent de zeros i uns. I així és com anem a operar i entendre-ho. El següent que hem de fer - i això és molt important - cada vegada que obri un arxiu - de fet, cada vegada que es diu a malloc, per exemple, i aconseguir una mica de memòria i tractar d' i guardar-lo en un punter, sempre que vulgueu comprovar per assegurar-se que que funció no va tornar nul. Així que en aquest cas, estem comprovant que fer Assegureu-vos que realment va obrir la arxiu correctament, i havia cap error en el nostre programa. A continuació, un cop hem comprovat per assegurar que tenim un arxiu de treball, podem escriure o llegir, o afegir a l'arxiu. En aquest cas, simplement estic imprimint una línia al fitxer. Com ho sé? Bé, estic fent servir aquesta funció anomenada fprintf. Totes les funcions que utilitzarà en escriure o llegir des de o la manipulació d'arxius serà similar al funcions que has vist abans, però començar amb la lletra F, de peu per a arxiu. I fprintf, a diferència de la nostra normal d'impressió aplicació, pren un argument addicional, i que és l'arxiu on es que voleu imprimir aquesta línia. Jo no tinc res a el dret dels ohai. Jo no tinc la tercera argument printf - o el segon argument printf, el tercer argument a fprintf, perquè no tenen els marcadors de posició aquí. No estic incloent qualsevol variable. Però, de nou, fprintf i tots aquests arxius funcions que operen amb arxius en general es necessitarà l'arxiu en la qual estan operant. Finalment, l'última cosa important a fer és tancar l'arxiu, igual que amb - sempre que malloc alguna cosa, volem alliberar, no sigui que ens tenir una pèrdua de memòria - que volem per tancar el nostre arxiu. Si aquest programa va sortir sense tancar l'arxiu, les probabilitats són gens aniria malament, especialment si es era un petit arxiu. Però sens dubte és un bon estil de codificació i practicar sempre tancament seu arxiu quan hagi acabat d'utilitzar-. Així que això és el bàsic d'arxiu d'E / S. Vostè probablement ha vist això abans, o vam veure que en aquest fantàstic curt. Algú té alguna pregunta, abans de entrem en una certa codificació pràctica problemes, sobre arxiu d'E / S o el passos jo ens vam anar de nou? [PREM SOUNDS] JASON Hirschhorn: Té vostè té una pregunta, Avi? AVI: No JASON Hirschhorn: OK. Vaig a esperar un altre Set segons. [Rialles] Aquesta és una molt bona propina. Vostès simplement no els agrada fent preguntes. Això està bé. D'acord. Així que el nostre problema és la primera pràctica, estem duplicarà la funció de una eina de línia de comandes que probablement utilitzat abans - còpia - l'eina de còpia. Si escriu cp i després passar-ho 2 arguments en el seu terminal, pot copiar un fitxer. I això és el que per escriure en aquests moments. Així que de nou, la lectura fora d'aquesta diapositiva, em a escriure un programa que usa dos i només dos de línia d'ordres arguments - un arxiu d'origen i un arxiu de destinació - i copia el contingut de la font presentar a l'arxiu de destinació un byte a la vegada. Així que això és molt demanar. Una vegada més, un bon mètode per a això és No anar directament al codi C, però descompondre en un parell de passos. En primer lloc, pensar en la lògica - exactament el que t'estic demanant que facis - i comprendre la totalitat de la passos a aquest problema. No es troba en C, només en alguns pseudocodi, o fins i tot un model mental de Què està passant. A continuació, un cop tingui el pseudocodi baix, esbrinar com el pseudocodi mapes en les eines i les coses que hem après a usar en C. I, finalment, un cop tingui tot el que junts, pot codificar el problema. Prengui 5 a 10 minuts a treballar en aquest problema. Vaig a posar les instruccions una còpia de seguretat en un segon. I després anirem més el pseudocodi, i el codi que viuen com un grup. Si vostè té alguna pregunta mentre estàs treballant en això, no dubti en plantejar la mà, i vindré voltant i respondre-les. ESTUDIANT 7: Puc lliscar un tros de paper? JASON Hirschhorn: Què passa? [PREM SOUNDS] JASON Hirschhorn: OK. Anem a repassar el pseudocodi primer, i llavors jo et donaré un parell més minuts per acabar la codificació. Qui vol començar em off amb la primera línia de pseudocodi per a aquesta funció? ESTUDIANT 8: Revisi per assegurar-se que li van donar dos arxius. JASON Hirschhorn: OK. I si no ho som? ESTUDIANT 8: Jo tornaria 0. JASON Hirschhorn: Si tornem 0? ESTUDIANT 8: Retorn a - supressió. Ho sento. JASON Hirschhorn: Si. Probablement no és 0. A causa de 0 vol dir que tot estava bé. D'acord. Així que aquesta és la primera línia de pseudocodi. Qui té la segona línia de pseudocodi? ESTUDIANT 9: Obert tant als arxius? JASON Hirschhorn: Obriu els dos arxius. ¿D'acord? ESTUDIANTS 10: Comprovi si l'arxiu és NULL? JASON Hirschhorn: Comprovi que ni són NULL. Com acotació al marge - slash 0 - és que NULL? ESTUDIANTS 11: No JASON Hirschhorn: Això no és NULL. Això es diu el terminador NULL. En realitat s'escriu amb una sola l. Així que comprovar alguna cosa en contra d'això - això és en realitat un personatge - així que el revisar alguna cosa en contra que es no és igual que la comprovació per veure si és igual a NULL. I algunes persones - en les seves proves i el seu problema jocs - tenen la dos dels confosos. Però els dos d'ells són de fet diferents. Un acaba una cadena - un és un punter a 0. ESTUDIANTS 12: Per què no li tira a assegurar-se que els arxius no són NULL abans d'obrir-los? Així estalvia oberta: JASON Hirschhorn alguna cosa en aquest arxiu. I si tornes aquí - pel que aquesta línia - fopen - li donarà una adreça i botiga aquesta direcció en arxiu si funciona. Si no funciona, emmagatzemarà NULL - ESTUDIANTS 12: Oh. D'acord. Et tinc. JASON Hirschhorn: A l'arxiu. Així que no pots comprovar NULL abans que vostè els hagi obert. NULL significa alguna cosa que no va fer treballar correctament. D'acord. Així que assegureu-vos de no dir? O? Què pensem? Anirem amb això. ESTUDIANTS 13: és. JASON Hirschhorn: És? Tampoc és? ESTUDIANTS 13: és. JASON Hirschhorn: OK. Sembla que tenim una mica de consens sobre això. Tampoc és NULL. Bé, la propera línia de pseudocodi. Qui no m'ha donat una línia encara? Anem a esperar per a vostè. Sí ESTUDIANTS 14: Cal llegir des del primer arxiu? JASON Hirschhorn: OK. ESTUDIANTS 14: O utilitzem fscanf o cosa així com que el primer arxiu? JASON Hirschhorn: Així que volem llegir des del primer arxiu i - posarem que just aquí. Llegir des de l'arxiu d'origen. I llavors, què fem després que llegir des de l'arxiu d'origen? Algú més? ESTUDIANTS 15: Escriure en l'arxiu de destinació? JASON Hirschhorn: Us escrivim per l'arxiu de destinació, i - D'acord. Què més ens falta? Algú més que no m'ha donat un línia de codi però - de pseudocodi. Sí ESTUDIANTS 16: Potser sempre es pot comprovar si hi ha alguna cosa que llegir per, com la següent línia? Que són com la línia següent, veure si existeix. [ELECTRÒNICA BEEP] JASON Hirschhorn: Vaya. Aquesta és la meva programari de diari. Sí? ESTUDIANTS 16: així. JASON Hirschhorn: Així que donar a mi un cop més. ESTUDIANTS 16: Comproveu si hi ha sent una propera línia de la arxiu de font per llegir. JASON Hirschhorn: OK. Així que no estem llegint les línies - estaven llegint bytes aquí - però estàs en el correcte. Volem llegir i escriure fins no existeixen més bytes. D'acord. I el que aquests han de ser realment sagnia una mica, perquè estan allà baix. Cert? Fins que no estem fora de bytes, que anem a llegir des de l'arxiu d'origen i escriure a l'arxiu de destinació. I llavors, què és l'últim línia de pseudocodi? Algú que no és donat mi alguna cosa encara. ESTUDIANTS 17: Tanqueu els arxius? JASON Hirschhorn: Exactament. Tancament els arxius. Així que aquí està el nostre pseudocodi. Vaig a posar el pseudocodi a gedit, i en un parell de minuts que xifrarà això junts. D'acord. Anem a començar com un grup. Nishant, tinc el meu nou arxiu. Acabo d'obrir això. Untitled document 1. Què és el primer que he de fer? Nishant: Incloeu les biblioteques? JASON Hirschhorn: OK. Què biblioteques? Nishant: stdio.h, stdlib.h, crec? JASON Hirschhorn: OK. Què és stdlib per? Nishant: es va oblidar. JASON Hirschhorn: OK. Així incloure stdio. Què he de fer abans fins i tot de Començo codificació? Nishant: Escriu una capçalera? JASON Hirschhorn: Com Què he de fer perquè color? [VEUS interposant] Nishant: Com aconseguir que color? JASON Hirschhorn: Com Què he de fer per a la codificació de colors? Nishant: No sé. Oh. Desa. JASON Hirschhorn: Save. Sí Hauria guardar com un arxiu. C. Així que guardar a l'escriptori com cp.c. Sweet. I si vull aconseguir l'estil complet punts, el que hauria de fer-ho incloure en la part superior? Nishant: Es pot escriure el seu nom, nom del programa, i el propòsit del programa així? JASON Hirschhorn: Té bona pinta. Excel · lent. Així que ens has començat perfectament. # Include - nosaltres també anem a escriure - D'acord. Així que crec que tot el que estic llest per anar. Qui té la primera línia de codi per a mi - o les primeres línies de codi que que es necessita per satisfer la nostra primera comentar pseudocodi? Vostè. ESTUDIANTS 18: No hauria de ser int argc, i després char * argv? JASON Hirschhorn: Crec que tens raó. Anem a canviar-ho a int principals, parin obertes, int argc, coma, char * argv? Igual que? ESTUDIANTS 18: Suports. JASON Hirschhorn: Suports. Suport Obrir, tancar el parèntesi, prop dels pares. Perfect. Ara puc prendre arguments de línia de comandes. D'acord. Assegurar-nos que ens donen dos arxius. Vostè em pot donar això també. ESTUDIANTS 18: Si argc - aquest no és igual a 3. JASON Hirschhorn: Si parin obertes argc no és igual a 3? ESTUDIANTS 18: Sí, torni 1 ni res. JASON Hirschhorn: Ho sento. ESTUDIANTS 18: Retorn 1 ni res. JASON Hirschhorn: Volta 1. ¿D'acord? Gran. Obriu dos arxius. Qui pot ajudar-me a obrir els dos arxius? Qui no m'ha donat el codi encara? Kurt? KURT: Així que totes les tapes d'origen estrella F-I-L-E. JASON Hirschhorn: Vaig per treure les vocals. Aquests són cool. És com Tumblr. ESTUDIANTS 18: igual a fopen - JASON Hirschhorn: igual a fopen? ESTUDIANTS 18: parin Obertes, argv, suport obert. JASON Hirschhorn: Espera. Ho sento. Parin a Obre. D'acord. ESTUDIANTS 18: així. Argv sub 1. JASON Hirschhorn: Sub 1? ESTUDIANTS 18: així. Argv parèntesi obert 1 - Sí I després coma i feu doble oberta cita, r, cometes dobles, prop parin, i coma. JASON Hirschhorn: Sweet. I què passa amb l'altre? ESTUDIANTS 18: Molt similar, però en lloc de S-R-C, que es diu que D-S-T. JASON Hirschhorn: Oo! M'agrada això. ESTUDIANTS 18: Només D-S-T. Sí I llavors argv, suport obert, 2. Sí I llavors w en lloc de r. Sí JASON Hirschhorn: Molt bé. Següent parell de línies. A més, si algú té coses a afegir a línies que hem fet, no dubti en afegir aquests també. Assegureu-vos que no és NULL. Qui em pot donar el codi que necessito satisfer aquesta línia de pseudocodi? Archer. ARQUER: Si l'original és igual als iguals NULL o dst és igual als iguals NULL, llavors torna - JASON Hirschhorn: Què? ARQUER: Return 2? JASON Hirschhorn: Return 2. Així que si src parin obert és igual a és igual a NULL, o - el que thing 's - pipa? Pipe? L'anomenarem canonada. Canonada, canonada, dst és igual als iguals NULL, retorna 2. ¿D'acord? Fins que no estem fora de bytes - quin tipus de saltem aquest pas de la part pseudocodi per anar a aquí. Però fins que estiguem fora de bytes - el que fa que el so té? Quin tipus d'estructura C - però jo no faig servir la paraula estructura, perquè anem a començar a utilitzar que en altres casos - però l'eina C sona això? ESTUDIANTS 19: Un bucle. JASON Hirschhorn: Un bucle. Sona com un bucle. Llavors, qui em pot donar la primera línia del codi del bucle aquí? També pot triar quin tipus de bucle que desitja, si em dones aquesta línia de codi. Hi ha tres tipus. Et donen a escollir. Jo suggeriria una d'aquestes. Avi. Què vols? AVI: FOR. JASON Hirschhorn: FOR. AVI: int i és igual a zero. JASON Hirschhorn: OK. AVI: Aquesta part no estic segur. Però i és menor que la mida de la font d'estrella? No estic segur d'això. JASON Hirschhorn: OK. AVI: Com que vostè vol que el mida d'un arxiu, no? JASON Hirschhorn: Així que això probablement no ho farà ens donen la mida de l'actual arxiu en bytes. Llavors, què més podíem fer? Quin altre tipus de bucle? O hem de seguir amb el bucle PER? ESTUDIANTS 20: Pots un bucle WHILE? I llavors, el que faria és you'd - perquè tenim un char * per a l'arxiu. Així que si només seguim incrementant que fins que ens anàvem a trobar el caràcter NULL en Al final de la mateixa? O no, és que no sé com funcionen els arxius? JASON Hirschhorn: Així podem mantenir incrementant el char * fins que trobem el NULL - ESTUDIANTS 20: mantenir Essencialment anar caràcter a caràcter fins que vam arribar a al final del fitxer. JASON Hirschhorn: Si. Així que això és el que volem fer. Volem seguir llegint, caràcter pel seu caràcter, fins a arribar a al final del fitxer. ESTUDIANTS 20: així. Trobar - Quin és el fi o el senyal de stop al final d'un arxiu de text. JASON Hirschhorn: OK. Així que quan arribem al final de l'arxiu - Com sabem que hem arribat el final d'un arxiu? Si estic trucant - així que anem a fer un pas enrere. Què és una funció? Anem a anar a aquesta línia aquí. Llegir des de l'arxiu d'origen. Qui em pot donar aquesta línia de codi? ESTUDIANTS 21: fscanf? JASON Hirschhorn: fscanf. D'acord. Què passa si vull llegir, molt específicament, un byte? ESTUDIANTS 21: No sé. JASON Hirschhorn: OK. Fins i tot més simple que fscanf - el que és una - Vull llegir d'un arxiu d'origen? Llegir d'un arxiu d'origen. Què és una funció - si. ESTUDIANTS 22: És fread? JASON Hirschhorn: Fread. Crec que seguirem amb que un per ara. Quin tipus d'arguments això, pren fread? ESTUDIANTS 22: Probablement el tipus d'arxiu, i després ubicació a l'arxiu? JASON Hirschhorn: Què puc escriure aquí per esbrinar quin tipus d'arguments fread necessita? ESTUDIANTS MÚLTIPLES: Home fread. JASON Hirschhorn: Home fread i fwrite. Sembla que passar l'estona junts. Així fread pren quants arguments? ESTUDIANTS 23: Quatre. JASON Hirschhorn: Es necessita quatre arguments. Es necessita un punter, una mida, i que cosa, la qual cosa és rar, i alguns arxius. ¿D'acord? Anem a llegir sobre això aquí. "La funció fread llegeix n memb elements de dades, cadascun bytes de mida de longitud, des del flux apuntat per transmetre, emmagatzemant-los en la ubicació donada pel punter ". Així que quatre arguments. Per què no puc simplement copiar això, i enganxar-lo aquí. D'acord. Llavors, qui pot començar a omplir aquests arguments per a mi? Avi. AVI: Tregui el buit. Posi simplement src. Tregui punter i l'estrella. Col · loqueu l'original. Llavors - JASON Hirschhorn: Així que vaig a deixar de Ets, perquè això és incorrecte. Tens raó amb l'original, però on src hauria d'anar? [VEUS interposant] JASON Hirschhorn: ha anar per aquí. Aquest és el src - nostra src és un tipus. Fem una ullada aquí. Això és demanar per a un tipus FILE *, que en realitat sol veure'ls així. Així que això és demanar un argument de Tipus d'arxiu * anomenat rierol que és l'original. ¿D'acord? Què mida de les coses fan volem llegir? Jo et vaig donar això en el descripció del problema. ESTUDIANTS 24: Un byte alhora. JASON Hirschhorn: Un byte. Què tan gran és un byte? La seva grandària és en bytes, així que el que puc posar aquí? ESTUDIANTS 25: Primer. JASON Hirschhorn: Primer. Dreta. La seva mida es troba a la unitat de bytes, de manera 1 és d'1 byte. Quants no vull llegir alhora. ESTUDIANTS 26: One? JASON Hirschhorn: Una de les coses. Vull llegir una cosa de mida 1, un mos a la vegada. I on ho poso, una vegada que el llegeixo? ESTUDIANTS 27: Destinació? JASON Hirschhorn: Així que no puc posar en línia recta en destinació. ESTUDIANTS 28: Ets a posar en un tercer punter? ESTUDIANTS 27: Per la destinació. JASON Hirschhorn: OK. Sí ESTUDIANTS 29: Es pot declarar una cosa que actuar com un emmagatzematge temporal anterior. JASON Hirschhorn: OK. Dóna'm això. ESTUDIANTS 29: Un altre arxiu punter, potser? JASON Hirschhorn: OK. Així que aquesta és nul · estrelles - que és un tipus void estrella, pel que no fa ha de ser un apuntador d'arxiu. I si estic llegint un byte, on seria un bon lloc per emmagatzemar un byte? ESTUDIANTS 29: Una matriu? JASON Hirschhorn: Una matriu. D'acord. I què més és una cosa que és només la mida d'un byte? ESTUDIANTS 30: Un char *? ESTUDIANTS 29: així. JASON Hirschhorn: Un char * no és d'un byte. ESTUDIANTS 29: A car. JASON Hirschhorn: Un char és un byte. Cert? Així que anem a trucar a aquest buffer és un genèric nom usat per a aquestes coses que emmagatzemar una cosa temporal. Així que va crear un memòria intermèdia. Cert? Però cal ser un void *. Així que potser tens raó, que ha de ser un tampó de mida 0. Així que emmagatzema un - dreta. Com que és aquí - Char buffer és un personatge, però això pren un void * - un punter. Així que jo podia fer això i ara tampó és un punter. Quina altra cosa podia fer? ESTUDIANTS 31: Poseu una estrella al costat de char. JASON Hirschhorn: vaig poder han creat char *. D'acord. Quin és altra cosa que podia fer? O anirem amb aquest. Char * buffer, així que el que Com puc posar aquí? ESTUDIANTS 31: Buffer. JASON Hirschhorn: Buffer. Buffer és un punter a un char. I en aquest lloc, estem posant un byte d'alguna cosa que hem llegit. Sí Avi. AVI: Només una pregunta ràpida. Vols malloc tampó? JASON Hirschhorn: Qui pot respondre a aquesta pregunta? ESTUDIANTS 32: Bé, en realitat no punt a res en aquest moment, de manera que - JASON Hirschhorn: Però fer volem malloc ell? ESTUDIANTS 32: Si es va a fer d'aquesta manera, suposo, sí, perquè el que es necessita un lloc perquè apunti a. JASON Hirschhorn: Tenim que malloc ell? ESTUDIANTS 33: Si vostè va a usar fora del bucle. JASON Hirschhorn: Anem a utilitzar-lo fora del bucle? ESTUDIANTS 34: Si. ESTUDIANTS 35: Espera. Volem declarar en el bucle fins més enllà? JASON Hirschhorn: Així que suposo que tenim alguns pseudo bucle WHILE aquí on estem tractant d'esbrinar, que no hem arribat a encara. No necessitem malloc ella. Estem operant en el principal, que només va per ser utilitzat dins d'aquest bucle. No té per què existir , Fora d'aquesta. Així que pot ser una variable local. Vostè té un punter a una variable local. ESTUDIANTS 36: Però no és apuntant a res. JASON Hirschhorn: No, no ho és inicialitzat a res. Però no anem a utilitzar també. Anem a posar alguna cosa en és la primera vegada que l'utilitzen. Així que sembla que està bé. Així que no necessitem malloc aquí. I crec que està bé com està. D'acord. Tenim la línia fread. Anem a fer la següent línia. Si volem escriure en un arxiu, el que és una bona funció a utilitzar per fer això? ESTUDIANTS 37: fwrite? ESTUDIANTS 38: fprintf? JASON Hirschhorn: fprintf és un. Quin altre? ESTUDIANTS 39: fwrite. JASON Hirschhorn: fwrite. I per als nostres propòsits, fwrite, que hem vist aquí, és probablement la millor opció. Porta quatre arguments també. Nishant, li pot donar me'ls arguments? Nishant: El primer curs d'una ser només tampó. JASON Hirschhorn: OK. Nishant: El segon només serà 1. En tercer lloc un va a ser 1. I el quart serà l'horari d'estiu. JASON Hirschhorn: Algú té alguna pregunta sobre aquesta línia? Això es veu bé. D'acord. Així que ara sembla que l'únic que estem falta - en realitat, anem a escriure aquesta última línia. Tancament els arxius. Qui pot acabar amb nosaltres a l'escriptura aquestes dues últimes línies? Sí Ho sentim, com et dius? LUCY: Lucy. JASON Hirschhorn: Lucy. LUCY: src fclose i després destí fclose. JASON Hirschhorn: fclose, parin oberta, src, prop parin, punt i coma. I fclose - ¿Si? LUCY: Obrir parèntesi, dst i després per punt i coma. JASON Hirschhorn: Molt bé. I què he de incloure al final? LUCY: Retorna 0. JASON Hirschhorn: Retorna 0. He de fer-ho? Només una pregunta. Hem de incloure la rendibilitat 0? ESTUDIANTS MÚLTIPLES: No JASON Hirschhorn: No Inici ho fa automàticament si s'arriba a la final. Però crec que és bo incloure de forma explícita. Sobretot quan estem tornant una altra coses al llarg del programa. D'acord. Això és el que ens falta - MENTRE què? Qui pot pensar en alguna - té un cert sentit del que les coses podria entrar aquí? Fins i tot si és només en alguns pseudocodi com el llenguatge? Què som en realitat - el que Què volem anar fins? Sí, Lucy. LUCY: El final de l'arxiu. JASON Hirschhorn: El final de l'arxiu. Llavors, què vol vostè dir amb fins d'arxiu? LUCY: Quan arribi a la final de l'arxiu, per. JASON Hirschhorn: OK. Així que una vegada que arribem al final de l'arxiu. Com sabem si hem arribat el final de l'arxiu? ESTUDIANTS 40: Crec memòria intermèdia s'establirà en NULL. ESTUDIANTS 41: Buffer es declara dins del bucle. JASON Hirschhorn: Així que vostè pensa memòria intermèdia s'estableix a NULL. Per què hauria de memòria intermèdia s'estableix a NULL? ESTUDIANTS 40: Perquè quan fread, vostè està tractant de posar res en la memòria tampó. JASON Hirschhorn: OK. Així que vostè està pensant fread - quan hem arribat al final de la arxiu, el que es fread farà? Crec que aquesta és la qüestió el que hem de esbrinar. Què fa fread? ¿Posa NULL en tampó o Què fer altra cosa? Com podem esbrinar el que fa? ESTUDIANTS 42: Home. JASON Hirschhorn: Home. Així que donem una ullada per aquí. Valor de retorn. En cas d'èxit, fread i fwrite tornar el nombre d'articles llegits o escrits. Aquest nombre és igual al nombre de bytes transferit només quan la mida és 1. Si es produeix un error, o l'extrem de la s'aconsegueix arxiu, el valor de retorn és un nombre d'elements a curt o 0. Així que per als nostres propòsits, si arriba fread al final del fitxer, i llegeix des al final del fitxer, no hi ha res a l'esquerra per llegir, què tornarà? ESTUDIANTS 43: Zero? JASON Hirschhorn: Què? ESTUDIANTS 43: Zero? JASON Hirschhorn: Zero. Es tornarà a zero. Així que sabem que fread, quan hem arribat al final del fitxer, que està passant per tornar a zero. Com podem utilitzar això al nostre favor? AVI: Pot declarar una variable fora del bucle de trucada de verificació. Si el control és igual a - per ara - un. JASON Hirschhorn: OK. AVI: I llavors vostè pot posar un IF declaració de la dreta després de fread dient que si fread és igual a zero - No JASON Hirschhorn: Qui pot ajudar a Avi? AVI: Quin és el valor retornat per fread? JASON Hirschhorn: Acabem se'n va anar per dalt d'això. AVI: Com es representa això? JASON Hirschhorn: Així que torna - anem a mirar cap amunt aquí - retorna una size_t, que és essencialment un nombre sencer. Per tant, retorna un enter. I en el nostre cas, ho farà retorna 1 o 0 - 1 si digués una cosa - un byte, i 0 si hem arribat al final. Així que si fread - ¿Si? ESTUDIANTS 45: No es pot simplement posar la plena fread (tampó, 1, 1, SRC) al while? JASON Hirschhorn: Així que vostè proposa fent això en allà? [VEUS interposant] JASON Hirschhorn: Espera. Així que estem lliurant d'això. Així que vostè està proposant posar fread en allà? Què hem també moure si vols fer això? ESTUDIANTS 45: El buffer exterior. JASON Hirschhorn: Hauríem també moure això cap a fora aquí. ESTUDIANTS 45: Però que constantment moure cap endavant? [VEUS interposant] JASON Hirschhorn: OK. Així que això és el que Okshar proposar. Creem el nostre buffer. Ens fread MENTRE, llavors cridem fwrite. Els pensaments sobre això? ESTUDIANTS 46: La meva única pregunta és, ho faria que en realitat executa la comanda fread? JASON Hirschhorn: Molt bona pregunta. Quan vostè està posant una crida a la funció a l'interior d'una condició, que fa crida a la funció executar? Hem vist exemples d'això abans. Cert? ESTUDIANTS 46: OK. Sí Així ho fa executar. JASON Hirschhorn: Hem vist coses així abans, on tenim una crida de funció dins d'una condició. ¿S'executa aquesta crida de funció? Sí Així que la resposta és sí. Aquesta crida a la funció s'executarà. Però de nou, és el que volem? Quin és una manera que poguéssim esbrinar si això és el que volem? ESTUDIANTS MÚLTIPLES: Executar això? JASON Hirschhorn: Podríem executar-lo. Però abans de fer això, podríem També raonar a través d'aquest. Si - diguem que tenim un byte a la nostra arxiu, anem a arribar a aquí, anem a arribar a aquest codi. Això executarà. fread retornarà un byte i emmagatzemar-lo en la memòria intermèdia. I això va a avaluar a 1, dret, després del seu retorn gener. Així, mentre que 1. Significa això que el codi dins El bucle while s'executarà? ESTUDIANTS 47: així. És cert. JASON Hirschhorn: Si. 1 és vertadera. No és 0. Així que el codi dins d'aquí s'executarà. Així que anem a escriure això. Anem a passar de nou a aquest línia una vegada més. Ara que tenim - estem en el final del nostre arxiu. Llegim al final del nostre arxiu, perquè només tenia un byte en el mateix. Fread retorna 0, botigues alguna cosa en tampó. Sincerament, no sé què s'emmagatzema en la memòria intermèdia. Probablement podríem mirar cap amunt per veure el que fa. Això, sincerament, no ho sé. No sabem a qui li importa el que s'emmagatzema en tampó? Però no tornarà 0. I es MENTRE 0 executar? MENTRE 0 no s'executi. Així que anem a passar per aquí. Així que tindrem una votació a mà alçada si aquest és el codi que hem de córrer, o si de fer canvis primer. Així que si vostè pensa - has de votar. Si creus que hem d'executar aquest codi com és, si us plau, aixequin la mà. D'acord. Hi ha un - Tens una pregunta, preocupació? Sí ESTUDIANTS 48: Després que ens movem memòria intermèdia fora del bucle, ens que malloc ell? JASON Hirschhorn: Molt bona pregunta. Després ens movem memòria intermèdia fora de la llaç, tenim per malloc ell? Aquesta és una pregunta abast. Si inicialitzem esmorteir fora d'aquest bucle, existirà a l'interior del bucle? ESTUDIANTS MÚLTIPLES: Si. JASON Hirschhorn: Si. El seu àmbit d'aplicació abasta l'interior del bucle, i, en definitiva, qualsevol cosa per sota d'ella a l'interior d'aquest codi, incloent el dins de les coses aquí. Així que no necessitem malloc ella. És una variable local, i el seu abast encara inclou el bucle. ESTUDIANTS 49: És necessari per alliberar-lo? JASON Hirschhorn: Tenim necessitar memòria intermèdia lliure? ESTUDIANTS 49: Sí, si no ho fem malloc. JASON Hirschhorn: Tenim necessitar memòria intermèdia lliure? No ho sabem. De nou, és una variable local, així que no hem de alliberar-la. D'acord. Anem a veure què passa. Pel que és sense inicialitzar. Això era el que una cosa que Marcus va proposar anteriorment. Així tenim que l'error, variable buffer no està inicialitzat quan s'utilitza aquí. Com podem solucionar aquest problema? ESTUDIANTS 50: malloc ell? ESTUDIANTS 51: igual a NULL? ESTUDIANTS 52: Di memòria intermèdia és igual NULL. JASON Hirschhorn: OK. Es veu bé. Tenim ara. Crearem una mica per intentar copiar. Així que tenim el nostre arxiu de text. Com podem executar aquest programa? Sí ESTUDIANTS 53: Pots fer punt slash cp, test.txt. I llavors vostè pot nomenar a un altre arxiu el qual s'emmagatzemen en. JASON Hirschhorn: OK. L'anomenarem out.txt. ¿D'acord? Culpa Seg Reflexions sobre la sentència segons? Això és genial. Com podem esbrinar on la decisió segment és? Què? ESTUDIANTS 54: Gdb. JASON Hirschhorn: Gdb. Correm gdb escrivint slash dot gdb, el nom del nostre programa. No hi ha arguments de línia de comandes allà. Anem a establir un punt de ruptura en principal. Si vull començar gdb, què faig? ESTUDIANTS 55: R. JASON Hirschhorn: R. I després què? ESTUDIANTS 55: Els arguments? JASON Hirschhorn: Llavors el arguments de la línia d'ordres. Anem a caminar a través. N és només em porta línia per línia. Jo vaig a anar fins que Em surt la meva culpa seg. No és la meva culpa seg. Sembla fread causat culpa meva seg. Sigues fread va causar la meva culpa seg, perquè aquesta era la la línia que acabem d'executar. I l'única cosa que era passant en aquesta línia - dues coses estaven succeint. Fread anava, i després ens vam quedar fent algunes comprovacions WHILE. Estic disposat a apostar que la MENTRE comprovació no estava causant culpa meva seg. El més probable era fread causant la meva culpa seg. També veig alguna cosa aquí, memcopy. Còpia de la memòria. Sona com la mudança de memòria de un lloc a un altre. Sona com una cosa que passaria en fread, potser una mica de memòria passar d'aquí fins aquí. Anem a passar per això una altra vegada. Com començament al llarg i executar de nou? Sí ESTUDIANTS 56: És necessari posar un símbol d'unió abans de memòria intermèdia? JASON Hirschhorn: Així ampersand abans memòria intermèdia em donaria l'adreça del buffer, que és un char *. Repassem això una vegada més. Com s'executa a través d'ell una vegada més? ESTUDIANTS 57: Pot vostè acaba Introduïu Executar de nou? JASON Hirschhorn: Només has d'escriure run nou. Així que no anem a executar aquesta línia. Així buffer és un punter NULL. Corregiu? Està apuntant a - anem a veure. Si tenim la nostra - fer un dibuix ràpid d'això. Tots poden veure si Jo escric per aquí? Així que a la pila, tenim un local d' variable i es diu buffer, i que és un punter a un char. Què és aquesta adreça en caràcters? ESTUDIANTS 58: 0x0. JASON Hirschhorn: així. Això és el que és això. Aquí, a l'interior d'amortiment, s'emmagatzema 0x0. Això és el que tenim - el configuració que tenim en aquests moments. Així que aquesta línia, fread, posa alguna cosa des de la font d'on? Dins d'aquesta caixa, o d'aquesta caixa? Què caixa? Caixa o quadre de la dreta, deixant? Aquest quadre de la dreta. D'això se segueix el punter, i el posa a aquí. Quan tractem i la memòria tàctil en ubicació 0, què obtenim? Un error de segmentació. Aquest és l'error que tenim en aquests moments. Sí ESTUDIANTS 59: No tens posar memòria intermèdia estrella? O no? Per fread? JASON Hirschhorn: Així fread pren un punter. Per tant, passa en tampó. I llavors va a de-referència que en algun lloc dins fread. Però, de nou, vam veure, es necessita un punter. No necessitem passar memòria intermèdia estrelles. Això seria passant ell el que és aquí. I això probablement ens donaria un error perquè estem d'-referència. Cert? Quan ens de-referència aquest punter, quan tractem d'accedir a aquest lloc, estem arribant a un error - nostre fallada de segmentació. Per tant - Ui. Anem a sortir de gdb. La nostra línia - el nostre problema - que és correcte aquí en aquesta línia. I és un problema perquè d'aquesta línia. Com podem crear un quadre que accessible en fread. Cert? Hem de crear un quadre que és un byte gran, la mida d'un char. Però necessitem que la caixa sigui accessible Quan aquesta funció s'executa. Llavors, on - si. Alguna idea? ESTUDIANTS 60: Només has de configurar com qualsevol caràcter aleatori. Només fer iguals char buffer el caràcter. I després, quan hagis esmorteir allà - JASON Hirschhorn: Espera. Caràcter tampó? Així que no hi ha estrelles? ESTUDIANTS 60: així. Tregui l'estrella. Igual a un personatge a l'atzar. JASON Hirschhorn: OK. Així que dóna'm un. ESTUDIANTS 60: Igual que un o alguna cosa així. I després, quan vostè té memòria intermèdia allà, s'utilitza un - ESTUDIANTS 61: Star? Oh, no, el signe. ESTUDIANTS 60: Utilitzeu el signe. JASON Hirschhorn: OK. I què hi ha a fwrite? ESTUDIANTS 60: Utilitzeu el signe més. JASON Hirschhorn: Molt bé. Així que la seva idea és, creem un char i posar alguna cosa en ell, i després gravar en aquest carbó. ESTUDIANTS 60: així. JASON Hirschhorn: Què Què pensa la gent? ESTUDIANTS 62: Ha enrevessat. JASON Hirschhorn: OK. Dibuixem a terme. Així que aquesta vegada, vaig a treure això en vermell a la pila d'aquí, i després tindrà - ooh! Ho sento. Així que aquesta vegada tenim una cosa que es diu tampó, i és a la pila. Corregiu? I estem estalviant-hi un principi. Llavors tenim la nostra crida a fread. Què fread fa és que pren un byte de nostre arxiu i el posa en algun lloc. Es posa en qualsevol que sigui el ho està assenyalant. Bé, abans que tinguéssim aquesta direcció - 0x0. Ara, què direcció tenim? ESTUDIANTS 63: El que sigui buffer de direcció és. JASON Hirschhorn: El que sigui buffer de direcció és. Probablement serà alguna cosa així. Probablement va a començar amb una b i 1 f, i després té sis dígits hexadecimals. No té importància. Alguns d'adreces. I estem de pas, que la direcció polz I posarem el nostre únic El byte en aquesta direcció. Així que anem a posar el nostre únic El byte aquí dins. I després anem a escriure des el que és sempre aquí dins. Algú té alguna pregunta sobre això? Qui pensa que aquest codi funcionarà? Llevant la seva mà si vostè pensa Aquest codi funcionarà. Vostè ha de prendre una postura. I qui creu que aquest codi no funcionarà? Aixequin la mà. Tothom ha de ser aixecant la mà. D'acord. Michael, on estàs parat? MICHAEL: No puc decidir. Tipus d'enmig. JASON Hirschhorn: Ets en el medi. Tria un. MICHAEL: Vaig a tenir fe i diuen que funcionarà. JASON Hirschhorn: OK. Vas a tenir fe i diuen que funciona? Què va passar? [VEUS interposant] JASON Hirschhorn: Sense culpa seg. Com es pot comprovar que per veure si dues coses són iguals? Dos arxius són iguals. ESTUDIANTS 64: Diff. JASON Hirschhorn: Diff. Xecs de diferències per a les diferències entre dos arxius, i si torna res, són idèntics. I si obrim, tenim el nostre arxiu. Així que aquesta era la solució correcta. Fem una ullada cap enrere en ella una vegada més. En realitat, ni tan sols necessitarà inicialitzar. Seria probablement un aspecte una mica net que no va posar alguna cosa a l'atzar en aquest país. El punt és, que necessita crear un una mica d'espai per emmagatzemar una mica de fread i prendre alguna cosa de fwrite. I això havia de ser un local d' variables a la pila - que podria haver malloc'd una mica d'espai. Així que en realitat podria tenir malloc escrit aquí, i això hauria funcionat. I llavors hauríem estat emmagatzemant les nostres coses en algun lloc en el munt. Però això és en realitat, probablement, la solució més elegant. N'hi ha prou amb crear una mica d'espai a la pila perquè aquestes coses passen. M'agradaria tenir altres dos comentaris. Si anés a prendre al seu torn en això, i llavors queden marcats en això, els meus comentaris seria de la següent manera. Aquests 1 és aquí, per a mi, mirar com números màgics. Aquest 1, en termes de fread, té sentit. Aquest és el nombre de coses per llegir o escriure. Però aquesta d'aquí ha Probablement sigui una mica més. Llavors, què és una solució? ESTUDIANTS 65: Grandària de byte. JASON Hirschhorn: Així? ESTUDIANTS 65: Grandària de caràcters. JASON Hirschhorn: Mida de caràcters. Sí, el byte no és un tipus. Així que la mida de les obres característiques. Podríem tenir, a la part superior de nostre codi, # defineix que. Anomenat alguna cosa BYTE i és realment un char. En realitat, un enfocament encara millor que podria haver estat aquest - uint. Algú sap el que és això? Ho sento. Ho tinc a l'inrevés. Espera, no. Per on es va? Algú sap el que és això? Sí ESTUDIANTS 67: Se suposa que ajudarà a estandarditzar a través dels sistemes de les coses que tenir - com enters sense signe que té 8 bytes? JASON Hirschhorn: Això és exactament correcte. En diferents màquines, la grandària d'un char - no generalment un char. Chars solen ser un byte. Però la mida d'altres tipus de dades són diferents mides en una màquina de 32 bits davant d'un equip de 64 bits. A uint8_t és sempre de 8 bits - sempre un byte. I he de incloure aquesta arxiu de capçalera estàndard int. Així que ara, això hauria estat probablement la millor manera d'escriure aquest codi. Així que em llibre dels números màgics. I també tinc un més lògic tipus de memòria intermèdia. No és simplement un char, és un byte, que és el que esperem que sigui. I fins aquí, hem fet estat una mica més robust. No anem a trucar a un char, que - potser, qui sap - podria ser una diferent mida en diferents màquines. En realitat estem dient que això és exactament un byte, sempre, no importa què. I si mirem aquí, fem cp. Uh-oh. Què va passar? ESTUDIANTS 68: Podria estar encès. JASON Hirschhorn: Què? ESTUDIANTS 69: Ho és? ESTUDIANTS 70: No ho va fer el defineixen com un tipus. ESTUDIANTS 71: Però el que hauria ser definit en la norma. ESTUDIANTS 72: Què està passant? ESTUDIANTS 73: En cas de definir estar tot en majúscules? JASON Hirschhorn: Així que no és # defineix. En realitat, en aquest cas, estic utilitzarà typedef. Com que estem fent servir com un tipus en un sol lloc. Així que en aquest cas, en realitat volem typedef que estem imprimint un nou tipus byte, i és, essencialment, aquest. És una mica diferent a # defineix. I ara, el nostre codi funciona perfectament. Així que, de nou, # define pren alguna cosa, reemplaça tot arreu amb l'altra. És només una macro - taquigrafia per desfer-nombres màgics. Però en aquest cas, perquè estem utilitzant com un tipus - aquí - perquè això funcioni, necessitem typedef al byte és. I estem definint aquí mateix. No és una estructura, en realitat és simplement un enter sense signe. És un byte de longitud. Aquest codi estarà disponible en línia, i tots han de tenir ara mateix. Així que tenim - perfecte - 13 minuts a l'esquerra per anar problema per 5 set. Vull caminar per copy.c junts, i llavors parlarem breument sobre les altres parts del conjunt de problemes. Així que permetin-me llevo copy.c. I el millor és que hem fet ja s'ha escrit molt d'aquest codi. El codi que escrivim, literalment, només va sortir d'aquí quan era escrivint això al meu compte. Però això és copy.c, constitueix la base per a les dues primeres parts de el problema establert per whodunit.c, que que necessita per escriure, i resize.c. Recover.c, que és el tercer i últim part del conjunt de problemes, no és amb seu fora d'aquest fitxer. Vas a haver de escriure aquest arxiu, et donem una plantilla perquè presentar, però no té res a veure amb copy.c. Però a causa copy.c és la base per les dues primeres parts, anem caminar a través d'ell ara, perquè tingui un bon sentit del que fa. I els comentaris donen de part d'ella. Ja hem escrit alguna cosa d'això. En primer lloc, ens estem assegurant tenim tres arguments. A continuació, estem recordant el nom del fitxer. Així que ens saltem aquest pas quan codifiquem el nostre - quan el nostre cp. Però aquí, estan fent una mica més net. Estan vigilant per assegurar dos arxius són bones, en A més de l'obertura d'ells. Es va escriure tot aquest codi en aquest moment, així que estic No vaig a detenir-me en aquest codi. El següent és una mica de matèria que és específic per els tipus d'arxius que estem utilitzant, que són arxius de mapa de bits. Arxius de mapa de bits tenen alguns metadades associat amb ells. Així que el primer parell de bytes l'informarà sobre l'arxiu. Ells no són els colors de el píxel en aquesta imatge. Et diuen sobre l'arxiu. I si vostè llegeix a través del conjunt de problemes, vostè tindrà molta més informació sobre quins tipus d'estructures de metadades s'inclouen amb els mapes de bits. Però és per això que tenim aquesta primera conjunt de - el codi aquí. Estem llegint les metadades - dues peces de metadades - l'arxiu encapçalat i la capçalera d'informació. I estem revisant algunes parts del mateix a assegureu-vos que és un arxiu de mapa de bits veritable abans de continuar. I un cop més, aquests són els detalls que no cal anar a ara. Si vostè llegeix a través del conjunt de problemes, vostè entendrà això. Llarga història curta, aquests són només dient, Aquest fitxer de mapa de bits i confirmant que. A continuació, anem a escriure els a l'arxiu de sortida. Veiem que aquí. Estem escrivint al punter fora. A continuació, estem determinant farcit. Així que de nou, ja que és la particularitat amb un arxiu de mapa de bits, algunes línies inclouen farciment en l'extrem. I si vostè llegeix a través del conjunt de problemes, vostè aprendrà més sobre el farciment. Aquesta és la fórmula per trobar farciment. Important recordar - quan es canvia la mida d'un mapa de bits arxiu, els canvis de farciment. Quan es canvia la mida d'un arxiu, els canvis de farciment. Mai serà més gran que 3 - que serà de 0 a 3, inclusivament. Però quan es canvia la mida de alguna cosa, els canvis de farciment. Si només tinc un píxel a la fila, em necessita tres bytes de farciment, perquè cada fila ha de ser múltiples de quatre bytes de longitud en un arxiu de mapa de bits. Però si em doblego, per anar d'un píxel a dos píxels, cadascun dels quals, diguem, és un byte, llavors necessito doble byte de farciment per fer que igual a quatre. Així que quan es canvia la mida d'alguna cosa, He de canviar la quantitat de farciment del que tinc. Això té sentit per a tothom? A continuació, iterar sobre cada fila, o a través de totes les files. I després iterar a través cada columna a cada fila. Estem tractant a aquesta ruta de bits com una quadrícula, com hem tractat el tauler en 15. Com tractem els maons quan nosaltres els imprimim a la pantalla. Una quadrícula de files i columnes. Llavors - vam veure això. En realitat només codifiquem això. Hem creat alguns d'emmagatzematge temporal. Llegim allà, i després escrivim a terme. Això és exactament el que acabem de fer. A continuació, perquè vaig dir: cada línia acaba en una mica de farciment, que passar per alt que el farciment - el vell farcit. I després afegim tu. En aquest cas, estem creant exactament el mateix arxiu. Estem copiar-lo. Així que aquesta línia és una mica ximple. Podríem literalment només posar el farciment polz Però si canvia la mida del fitxer, Encara vols aquesta línia? Així que si volem canviar la mida d'un arxiu, Per què seguim volent saltar sobre el vell encoixinat? ESTUDIANTS 74: Si. JASON Hirschhorn: Així que el que fem. A causa d'això, de nou, ofertes amb l'arxiu d'origen. Nosaltres no ens preocupem pel farciment des de l'arxiu d'origen. Volem anar a la línia següent. Però no ens limitem a posar de nou la vella quantitat de farciment. Hem de tornar a posar el nova quantitat de farciment. Així que quan estem canviant la mida d'una arxiu, encara volem passar per alt el farcit a l'arxiu antic - el estem llegint des. Però el que estem escrivint a, anem necessitarà tornar a posar una mica diferent nombre de farciment que hem determinat. Sí ESTUDIANTS 75: L'ordre dels dos línies no importa, oi? Com que vostè està manejant diferents arxius. JASON Hirschhorn: Exactament. L'ordre d'aquestes dues línies no importa. Escrivim aquesta línia. Això està aquí per l'arxiu estem escrivint a. Això és important, de manera que tenim la quantitat correcta de farciment. Això té a veure amb l'arxiu en format. Volem passar directament sobre el farciment. No volem llegir - si estem llegint un byte a la vegada, ens no es preocupen pels bytes de farciment. Volem passar a la següent línia. Finalment igual que Lucy li va donar per a nosaltres, tanquem els arxius i tornem 0. Així que això és copy.c. I que en realitat va escriure - que passem la major part de secció d'escriure això, en essència. Vostè ha fet això. Així que espero que vostè té un bon sentit del que està passant aquí. La gran diferència, la veritat, és només aquesta primera part que s'ocupa de peculiaritats dels arxius de mapa de bits. Així que tinc com el meu següent diapositiva, Què necessitem fer? Bé, anem a pensar en qui ho va fer. I per a algú que llegeix a través d' establir el problema, què fem que hagi de fer en novel · la policíaca? Simplement. S'allunya. ALLUNYA: Es pot treure la part de cada píxel que denota vermell. I llavors - tipus de? JASON Hirschhorn: OK. Així que treure la part de cada píxel que denota vermell. Això és a prop, però no tots de la mateixa. ESTUDIANTS 76: Bé, hi ha diferents maneres de fer-ho. JASON Hirschhorn: OK. Dóna'm una manera. ESTUDIANTS 76: Tregui tot el vermell, i a continuació, posar l'accent en el blau i el verd. JASON Hirschhorn: OK. Així que tenint en compte aquests dos sentits - sona com que li donem un píxel, que té un nivell de color vermell, blau i verd. Volem canviar els nivells relatius d' el vermell, blau, i verd, depenent en aquest píxel. Quan en aquest codi hem de canviar el familiar color vermell, blau i verd els nivells d'un píxel donat. Després que hem llegit - abans d'escriure això? Dóna'm el número de línia. ESTUDIANTS MÚLTIPLES: 83. JASON Hirschhorn: 83. Així que aquí. Per a qui ho va fer, el codi és necessari escriure tots han d'anar a la dreta allà. I això és l'únic codi que necessita per escriure. Perquè, com hem escoltat, tot el que necessita fer és canviar aquests blau relativa, nivells de vermell i verd de cada píxel. Vostè ha llegit tot, i ara que està va a escriure. Com puc aconseguir - si tinc aquesta cosa diu triple, just aquí, i és de escrigui RGBTRIPLE - bé, si ens fixem en bmp.h, Quin és RGBTRIPLE? ESTUDIANTS 77: És una estructura. JASON Hirschhorn: RGBTRIPLE és una estructura. Veiem que aquí baix. I així, si volia accedir, per exemple, la nivell vermell de l'estructura, com puc accedir al nivell vermell d'aquesta estructura? [CLASSE bufs] ESTUDIANTS 78: RGBTRIPLE.rgbtred? JASON Hirschhorn: Això és correcte? ESTUDIANTS 79: Ha de ser el triple punt, en lloc de RGBTRIPLE punt? JASON Hirschhorn: Triple. Triple és la variable local, per la qual cosa aquí, no hi ha punters aquí. Llavors només ha d'utilitzar la notació de punts. Això em donarà el nivell de vermell. Si vull canviar, m'acaba d'establir que iguala a alguna cosa diferent. Així que de nou, aquesta línia de codi té accés a aquesta variable dins d'aquesta estructura, i podem fer que alguna cosa nova. Així que per a qui ho va fer, de nou, és a dir, en essència, el que hem de fer. Molt simple. Només has de canviar alguns nivells relatius i aquí és on aquest codi va. Canviar la mida, d'altra banda, és una mica més complicat. De fet, el canvi de mida és probablement el més difícil part d'aquest problema estableix. Tenim tres minuts per al final. Però un cop més, ja hem escrit la major part d'aquest codi, de manera que ha de ser bastant familiar. Quines són algunes coses que volem fer a canviar la mida, si vostè ha llegit sobre el estableix problema? Si vostè els dóna a mi, que es pot parlar d'ells. Quines són algunes coses que volem fer? ESTUDIANTS 80: Verticalment - el que ha de canviar la seva mida en sentit horitzontal, però verticalment canviar la seva mida, així? JASON Hirschhorn: Així que una si se'ns dóna píxel, i volem canviar la seva mida per un factor de dos, ara ha de ser canviar de mida horitzontal i canviar de mida verticalment. Això té sentit? Sí Així que aquesta és probablement la major desafiament. I parlarem d'això en un segon. Sí ESTUDIANTS 81: La forma en què pensava d'ella eres tu necessitaves imprimir - JASON Hirschhorn: Espera. No ens diguin el que vas fer. Anem a parlar de la lògica. ESTUDIANTS 81: OK. Quina era la pregunta? JASON Hirschhorn: Vostè acaba de aixecat la mà. No hi havia dubte. Permetin-me presentar ella. Permetin-me discutir això breument. Així que hem un píxel, volem replicar, tant horitzontals com verticalment. Així que l'ideal el que fem aquí és, que llegir en el nostre píxel, ho escrivim però molts dels temps. Però llavors tenim el nostre truc aquí, perquè llavors volem passar a la següent línia i escriure al a partir de la següent línia. Així que si volem replicar tant horitzontal i verticalment, el que és una bona manera de fer això - un de bo, encara que per fer això? Així que no necessitem buscar constantment al voltant del nostre arxiu a col · locar les coses. Aquesta pregunta podria no tenir tenia sentit, però crec que una respondre-hi l'ajudarà. ESTUDIANTS 82: Crear una matriu? JASON Hirschhorn: Així que anem a pensar de cada arxiu com una fila. Anem a pensar en termes de files. Si tenim la nostra primera fila de la nostra petita foto, podem fer aquesta fila en una gran fila d'una imatge gran, i després replicar aquesta fila però moltes vegades que necessita per replicar-se, en lloc d'anar píxel per píxel, que es posa confús quan tractar amb arxius. Perquè si hem tingut - M'estic quedant sense espai. Si aquest és el nostre arxiu, i hem de un píxel allà, i volem posar just aquí, encara tenim algunes coses aquesta necessitat d'anar-hi quan estem l'escriptura i la creació del nostre nou arxiu - nostre arxiu que és el doble de gran. Però és realment difícil amb funcions d'arxiu saltar al voltant de les noves línies d'aquesta manera i, a continuació, tornar aquí i posar les coses en aquest país. És gairebé impossible fer alguna cosa així, si això té sentit. Així que si pensem en termes de files, podem prendre la nostra fila i, a continuació, posar - replicar files verticalment. I així va ser com abordem el canvi de mida verticalment en lloc d'horitzontalment. Això va ser una mica ràpid, i una mica confús. Desafortunadament el nostre temps s'ha acabat. Vaig a estar fora per a aquells de vostès aquí que tingui preguntes sobre la conjunt de problemes, incloent la recuperació. Així que anem a aixecar la sessió per ara. I de nou, si vostè té qualsevol pregunta, podem xerrar exterior.