1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [SECCIÓ 5: menys còmoda] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvard University] 3 00:00:05,180 --> 00:00:08,260 [Aquesta és CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Així que benvinguts de nou, nois. 5 00:00:11,690 --> 00:00:16,320 Benvinguts a la secció 5. 6 00:00:16,320 --> 00:00:20,220 En aquest punt, després d'haver completat prova 0 i després d'haver vist com s'ha fet, 7 00:00:20,220 --> 00:00:25,770 esperem que pugui sentir realment bé perquè jo estava molt impressionat pels resultats en aquesta secció. 8 00:00:25,770 --> 00:00:28,050 Per als nostres espectadors en línia, hem tingut un parell de preguntes 9 00:00:28,050 --> 00:00:33,680 sobre els dos últims problemes en el conjunt de problemes - o en l'examen, més aviat. 10 00:00:33,680 --> 00:00:39,690 Així que anem a repassar aquells molt ràpid perquè tothom veu el que va passar 11 00:00:39,690 --> 00:00:45,060 i la forma d'anar a través de la solució real en lloc de només visualització de la pròpia solució. 12 00:00:45,060 --> 00:00:50,330 Anem a anar en l'últim parell de problemes molt ràpid, 32 i 33. 13 00:00:50,330 --> 00:00:53,240 Així, de nou, de manera que els espectadors en línia es pot veure això. 14 00:00:53,240 --> 00:00:59,080 >> Si gira al seu problema 32, que és a la pàgina 13, 15 00:00:59,080 --> 00:01:02,730 13 dels 16, 32 problema té a veure amb swaps. 16 00:01:02,730 --> 00:01:05,010 Es tractava de canvi de dos nombres enters. 17 00:01:05,010 --> 00:01:08,740 És el problema que havíem anat un parell de vegades a la conferència. 18 00:01:08,740 --> 00:01:13,590 I aquí, el que estem demanant que facin és una empremta de memòria ràpida. 19 00:01:13,590 --> 00:01:17,000 Per omplir els valors de les variables com ho són a la pila 20 00:01:17,000 --> 00:01:20,250 ja que el codi passa a través d'aquesta funció swap. 21 00:01:20,250 --> 00:01:24,500 En particular, el que estem veient - Vaig a posar això iPad baix - 22 00:01:24,500 --> 00:01:29,650 en particular, el que estem veient és la línia número 6 aquí. 23 00:01:29,650 --> 00:01:36,740 I és el número 6 per només contigüitat amb el problema anterior. 24 00:01:36,740 --> 00:01:41,720 El que vull fer és mostrar l'etiqueta o l'estat de la memòria 25 00:01:41,720 --> 00:01:46,090 com ho és en el moment quan s'executa aquest número de línia 6, 26 00:01:46,090 --> 00:01:52,540 que és efectivament un retorn de la nostra funció d'intercanvi aquí. 27 00:01:52,540 --> 00:01:59,450 Si ens desplacem fins aquí, hem vist que les adreces de tot en la memòria s'ha proveït per a nosaltres. 28 00:01:59,450 --> 00:02:02,540 Això és molt clau, anem a tornar-hi en un moment. 29 00:02:02,540 --> 00:02:09,240 I després aquí baix a la part inferior hi ha un diagrama de poca memòria que ens referirem. 30 00:02:09,240 --> 00:02:12,490 De fet, he fet això en el meu iPad. 31 00:02:12,490 --> 00:02:20,720 Així que vaig a alternar anada i tornada entre l'iPad i el codi aquesta penes per la referència. 32 00:02:20,720 --> 00:02:26,540 >> Anem a començar. En primer lloc, ens centrarem en les dues primeres línies del principal aquí. 33 00:02:26,540 --> 00:02:30,220 Per començar, anem a inicialitzar x i i a 1 a 2. 34 00:02:30,220 --> 00:02:33,040 Així que tenim dues variables senceres, són alhora serà col · locat a la pila. 35 00:02:33,040 --> 00:02:36,050 Posarem un 1 i un 2 en les mateixes. 36 00:02:36,050 --> 00:02:43,150 Així que si li dono la volta al meu iPad, és d'esperar, anem a veure - 37 00:02:43,150 --> 00:02:48,660 Apple TV mirroring, i aquí anem. Bé. 38 00:02:48,660 --> 00:02:51,670 Així que si li dono la volta al meu iPad, 39 00:02:51,670 --> 00:02:56,220 Vull inicialitzar x i i a 1 a 2. 40 00:02:56,220 --> 00:03:00,580 Ho fem simplement escrivint un 1 a la casella x 41 00:03:00,580 --> 00:03:07,730 i un 2 a la casella marcada i. Bastant simple. 42 00:03:07,730 --> 00:03:11,620 Així que ara anem a tornar a l'ordinador portàtil, a veure què passa després. 43 00:03:11,620 --> 00:03:15,810 Així que aquesta següent línia és on les coses es posen difícils. 44 00:03:15,810 --> 00:03:28,110 Passem la direcció de x i de i la direcció com els paràmetres a i b per a la funció swap. 45 00:03:28,110 --> 00:03:32,380 La direcció de x i la direcció de i són coses que no podem calcular 46 00:03:32,380 --> 00:03:36,360 sense fer referència a aquests punts de bala just aquí baix. 47 00:03:36,360 --> 00:03:39,750 I per sort, els dos primers punts de la bala dir-nos exactament quines són les respostes. 48 00:03:39,750 --> 00:03:44,740 La direcció de xa la memòria és 10, i la direcció de i en la memòria és 14. 49 00:03:44,740 --> 00:03:51,870 Així que aquests són els valors que es transmeten en com A i B a la part alta a la nostra funció d'intercanvi. 50 00:03:51,870 --> 00:04:00,760 Així que de nou, tornant al nostre diagrama, puc escriure un 10 en una 51 00:04:00,760 --> 00:04:07,400 i un 14 en b. 52 00:04:07,400 --> 00:04:11,610 Ara, aquest punt és on es procedeix amb el canvi. 53 00:04:11,610 --> 00:04:14,520 Així que voltejar de nou a l'ordinador portàtil de nou, 54 00:04:14,520 --> 00:04:21,079 veiem que la forma en què l'intercanvi d'obres és de desfer abans la referència a i emmagatzemar el resultat en tmp. 55 00:04:21,079 --> 00:04:27,650 De manera que l'operador d'indirecció diu: "Hey. Tractar el contingut d'una variable com una adreça. 56 00:04:27,650 --> 00:04:33,830 Anar al que està emmagatzemat en aquesta direcció, i el carregarà. " 57 00:04:33,830 --> 00:04:41,720 Què càrrega de la variable que serà emmagatzemat en la nostra variable tmp. 58 00:04:41,720 --> 00:04:45,150 Moure d'una tirada de nou a la iPad. 59 00:04:45,150 --> 00:04:51,690 Si abordarem 10, se sap que 10 és la direcció x varible 60 00:04:51,690 --> 00:04:55,480 perquè ens van dir que el nostre punt de bala que la direcció de xa la memòria és de 10. 61 00:04:55,480 --> 00:05:00,180 Així que podem anar-hi, obtenir el valor de la mateixa, que és 1, com podem veure en el nostre iPad, 62 00:05:00,180 --> 00:05:06,300 i carregar això en tmp. 63 00:05:06,300 --> 00:05:08,250 Un cop més, això no és el contingut final. 64 00:05:08,250 --> 00:05:14,350 Anem a caminar a través i arribarem al nostre estat final del programa al final. 65 00:05:14,350 --> 00:05:17,210 Però en aquest moment, tenim el valor emmagatzemat en una tmp. 66 00:05:17,210 --> 00:05:19,210 >> I hi ha una pregunta ràpida per aquí. 67 00:05:19,210 --> 00:05:23,980 [Alexander] És l'operador d'indirecció - això és només el dret asterisc al principi de la variable? 68 00:05:23,980 --> 00:05:27,600 Sí >>. De manera que l'operador d'indirecció, ja que voltejar cap enrere per al nostre portàtil, una vegada més, 69 00:05:27,600 --> 00:05:33,780 és aquest estel just al davant. 70 00:05:33,780 --> 00:05:37,460 En aquest sentit, és - el que contrasta amb l'operador de multiplicació 71 00:05:37,460 --> 00:05:42,400 que requereix dues coses: l'operador d'indirecció és un operador unari. 72 00:05:42,400 --> 00:05:46,130 Només s'aplica a un valor en lloc d'un operador binari, 73 00:05:46,130 --> 00:05:48,810 on s'aplica a dos valors diferents. 74 00:05:48,810 --> 00:05:52,080 Així que això és el que passa en aquesta línia. 75 00:05:52,080 --> 00:05:58,390 Carreguem el valor 1 i s'emmagatzema en la variable temporal sencer. 76 00:05:58,390 --> 00:06:05,800 La següent línia, s'emmagatzema el contingut de b en - 77 00:06:05,800 --> 00:06:12,630 o, més aviat, guardem els continguts que s'assenyalen a b en el lloc on una està apuntant. 78 00:06:12,630 --> 00:06:17,690 Si analitzem aquest de dreta a esquerra, anem a eliminar la referència b, 79 00:06:17,690 --> 00:06:23,580 abordarem 14, anem a agafar el sencer que està allà, 80 00:06:23,580 --> 00:06:26,900 i després anirem a l'adreça 10, 81 00:06:26,900 --> 00:06:34,240 i anem a llançar el resultat d'eliminar la referència de b en aquest espai. 82 00:06:34,240 --> 00:06:40,080 Voltejant al nostre iPad, on podem fer això una mica més concret, 83 00:06:40,080 --> 00:06:44,070 pot ser que ajudi si escric nombres en totes les direccions aquí. 84 00:06:44,070 --> 00:06:53,820 Així que sabem que en i, estem en la direcció 14, x és a la direcció 10. 85 00:06:53,820 --> 00:07:00,180 Quan vam començar a b, b dereference, prendrem el valor 2. 86 00:07:00,180 --> 00:07:08,320 Agafem aquest valor pel fet que és el valor que viu a la direcció 14. 87 00:07:08,320 --> 00:07:15,700 I anem a posar-lo en la variable que viu a la direcció 10, 88 00:07:15,700 --> 00:07:19,160 que hi és, que correspon als nostres variable x. 89 00:07:19,160 --> 00:07:21,810 Així que podem fer una mica de sobreescriure aquí 90 00:07:21,810 --> 00:07:35,380 on ens desfem de la nostra 1 i en el seu lloc escriure un 2. 91 00:07:35,380 --> 00:07:39,560 Així que tot està bé i és bo en el món, tot i que hem x sobrescrits ara. 92 00:07:39,560 --> 00:07:44,890 Hem emmagatzemat antic valor de xa la variable tmp. 93 00:07:44,890 --> 00:07:50,210 Així podem completar l'intercanvi amb la línia següent. 94 00:07:50,210 --> 00:07:53,030 Moure d'una tirada de nou al nostre portàtil. 95 00:07:53,030 --> 00:07:58,150 Ara tot el que queda és prendre el contingut de la nostra variable sencera temporal 96 00:07:58,150 --> 00:08:05,630 i els emmagatzema en la variable que viu en la direcció que b està sostenint. 97 00:08:05,630 --> 00:08:10,230 Així que anem a eliminar la referència b eficaç per aconseguir l'accés a la variable 98 00:08:10,230 --> 00:08:14,340 és a dir, en la direcció que b té en ell, 99 00:08:14,340 --> 00:08:19,190 i anem a ficar el valor que està duent a terme tmp-hi. 100 00:08:19,190 --> 00:08:23,280 Voltejar de nou a l'iPad un cop més. 101 00:08:23,280 --> 00:08:31,290 Puc esborrar aquest valor aquí, 2, 102 00:08:31,290 --> 00:08:41,010 i en el seu lloc anem a copiar la dreta 1 en ell. 103 00:08:41,010 --> 00:08:43,059 A continuació, la següent línia que s'executa, per descomptat - 104 00:08:43,059 --> 00:08:47,150 si tirem de nou a l'ordinador portàtil - és aquest el punt 6, 105 00:08:47,150 --> 00:08:52,500 que és el punt en què volíem tenir el nostre diagrama omplerta completament. 106 00:08:52,500 --> 00:08:58,940 Així que voltejar de nou a l'iPad un cop més, només perquè pugui veure el diagrama complet, 107 00:08:58,940 --> 00:09:06,610 es pot veure que tenim un 10 en una, un 14 en b, a 1 en tmp, un 2 en x, i un 1 en i. 108 00:09:06,610 --> 00:09:11,000 Hi ha alguna pregunta sobre això? 109 00:09:11,000 --> 00:09:14,640 Això té més sentit, d'haver caminat a través d'ell? 110 00:09:14,640 --> 00:09:24,850 Fer menys sentit? Esperem que no. Bé. 111 00:09:24,850 --> 00:09:28,230 >> Els punters són un tema molt delicat. 112 00:09:28,230 --> 00:09:33,420 Un dels nois amb els que treballem té una dita molt comú: 113 00:09:33,420 --> 00:09:36,590 "Per entendre els punters, primer cal entendre punters". 114 00:09:36,590 --> 00:09:40,530 El que crec que és molt cert. No obstant això, pren algun temps per acostumar-se a ella. 115 00:09:40,530 --> 00:09:45,360 Dibuix moltes fotos, sorteig de diagrames de memòria com aquesta són molt útils, 116 00:09:45,360 --> 00:09:49,480 i després de caminar a través de l'exemple després exemple després exemple, 117 00:09:49,480 --> 00:09:54,450 que començarà a tenir sentit una mica més i una mica més de sentit i una mica més de sentit. 118 00:09:54,450 --> 00:10:01,560 Finalment, un dia, tindràs tot completament dominat. 119 00:10:01,560 --> 00:10:13,800 Qualsevol pregunta abans de passar al següent problema? Està bé. 120 00:10:13,800 --> 00:10:18,840 Així que donar la volta de nou a l'ordinador portàtil. 121 00:10:18,840 --> 00:10:23,300 El següent problema que tenim és el problema número 33 a l'arxiu I / O. 122 00:10:23,300 --> 00:10:26,350 Zoom sobre això una mica. 123 00:10:26,350 --> 00:10:28,710 Problema 33 - Sí? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Acabo de tenir una pregunta ràpida. Aquesta estrella, o l'asterisc, 125 00:10:32,110 --> 00:10:35,590 es diu eliminació de referències quan s'utilitza un asterisc abans. 126 00:10:35,590 --> 00:10:38,820 Com es diu quan s'utilitza el signe & abans? 127 00:10:38,820 --> 00:10:43,140 >> El signe & abans és l'operador de direcció. 128 00:10:43,140 --> 00:10:45,880 Així que passarem de tornada. 129 00:10:45,880 --> 00:10:49,310 Oops. Estic en la manera de zoom, així que no pot desplaçar-se. 130 00:10:49,310 --> 00:10:52,780 Si ens fixem en el codi molt ràpid aquí, 131 00:10:52,780 --> 00:10:54,980 de nou, el mateix succeïa. 132 00:10:54,980 --> 00:10:59,180 Si ens fixem en el codi aquí mateix, en aquesta línia on fem la crida a canviar, 133 00:10:59,180 --> 00:11:10,460 el signe és només dir "obtenir l'adreça on viu la variable x." 134 00:11:10,460 --> 00:11:14,460 Quan el compilador compila el codi, 135 00:11:14,460 --> 00:11:20,590 ha de físicament marcar un lloc en la memòria per totes les seves variables per viure. 136 00:11:20,590 --> 00:11:24,910 I així, el que el compilador pot fer una vegada que compila tot, 137 00:11:24,910 --> 00:11:31,110 ho sap "Oh, vaig posar x en la direcció 10. Poso i en la direcció 14." 138 00:11:31,110 --> 00:11:34,640 A continuació, pot omplir aquests valors per a vostè. 139 00:11:34,640 --> 00:11:44,740 Així que vostè pot - pot Passan això i pass & i endins també. 140 00:11:44,740 --> 00:11:50,730 Aquests nois obtenir l'adreça, sinó que també, quan es passa a la funció d'intercanvi, 141 00:11:50,730 --> 00:11:55,690 aquest tipus d'informació, aquesta * int aquí, li diu al compilador, 142 00:11:55,690 --> 00:12:01,350 "Està bé, estarem interpretant aquesta direcció com una adreça d'una variable sencera". 143 00:12:01,350 --> 00:12:05,900 Com una direcció d'un sencer, que és diferent de la direcció d'una variable de caràcter 144 00:12:05,900 --> 00:12:09,930 perquè un int ocupa, en una màquina de 32-bit, presa fins a 4 bytes d'espai, 145 00:12:09,930 --> 00:12:13,310 mentre que un personatge només ocupa 1 byte d'espai. 146 00:12:13,310 --> 00:12:17,310 Així que és important saber també el que és - el que viu, quin tipus de valor 147 00:12:17,310 --> 00:12:20,340 viu en la direcció que he passat polz 148 00:12:20,340 --> 00:12:22,020 O l'adreça que vostè està tractant. 149 00:12:22,020 --> 00:12:29,020 D'aquesta manera, vostè sap quants bytes d'informació per carregar realitat de la memòria RAM. 150 00:12:29,020 --> 00:12:31,780 I llavors, sí, aquest operador per desfer referències, com si estiguessis demanant, 151 00:12:31,780 --> 00:12:37,200 va i s'accedeix a la informació en una direcció particular. 152 00:12:37,200 --> 00:12:42,820 Pel que diu, amb aquesta variable a aquí, tractar els continguts d'una com direcció, 153 00:12:42,820 --> 00:12:47,880 anar a aquesta direcció, i extreure, carregar en el processador, la càrrega en un registre 154 00:12:47,880 --> 00:12:56,340 els valors reals o dels continguts que viuen en aquest domicili. 155 00:12:56,340 --> 00:12:59,620 Una mica més preguntes? Aquestes són bones preguntes. 156 00:12:59,620 --> 00:13:01,650 És un munt de noves tecnologies també. 157 00:13:01,650 --> 00:13:09,800 És també una espècie de funky, i veient * i en diferents llocs. 158 00:13:09,800 --> 00:13:13,180 >> Està bé. 159 00:13:13,180 --> 00:13:18,530 Així que tornem al problema de 33 anys, presentar I / O. 160 00:13:18,530 --> 00:13:22,540 Aquest va ser un d'aquells problemes que crec que un parell de coses van succeir. 161 00:13:22,540 --> 00:13:25,400 Un, que és un tema bastant nou. 162 00:13:25,400 --> 00:13:30,590 Es va presentar molt aviat abans de la prova, 163 00:13:30,590 --> 00:13:33,400 i llavors jo crec que va ser alguna cosa així com un d'aquests problemes verbals de matemàtiques 164 00:13:33,400 --> 00:13:39,720 on et donen un munt d'informació, però en realitat no acaben sobre d'haver d'usar un munt d'ell. 165 00:13:39,720 --> 00:13:44,060 La primera part d'aquest problema es descriu què és un arxiu CSV. 166 00:13:44,060 --> 00:13:50,620 Ara, un arxiu CSV, d'acord amb la descripció, és un arxiu de valors separats per comes. 167 00:13:50,620 --> 00:13:55,300 La raó que aquests són per res interessant, i la raó per la qual mai els utilitzen, 168 00:13:55,300 --> 00:14:00,800 És a dir, perquè, quants de vosaltres heu utilitzat alguna vegada coses com Excel? 169 00:14:00,800 --> 00:14:03,240 Figura majoria de vostès, probablement, o va a utilitzar en algun moment de la seva vida. 170 00:14:03,240 --> 00:14:06,430 Anem a fer servir alguna cosa com Excel. 171 00:14:06,430 --> 00:14:10,940 Per tal d'obtenir les dades d'un full de càlcul d'Excel o fer qualsevol tipus de tractament efectuat amb ella, 172 00:14:10,940 --> 00:14:17,240 si vols escriure un programa en C o programa en Python, un programa Java, 173 00:14:17,240 --> 00:14:20,070 per fer front a les dades que hagi emmagatzemat aquí, 174 00:14:20,070 --> 00:14:23,170 una de les formes més comunes per treure'l està en un arxiu CSV. 175 00:14:23,170 --> 00:14:26,850 I vostè pot obrir Excel i quan vas a l'opció 'Guardar com' diàleg, 176 00:14:26,850 --> 00:14:32,840 vostè pot sortir un fitxer CSV real. 177 00:14:32,840 --> 00:14:35,890 >> És útil saber com tractar amb aquestes coses. 178 00:14:35,890 --> 00:14:42,010 La forma en que funciona és que és similar a - Vull dir, és essencialment imitant un full de càlcul, 179 00:14:42,010 --> 00:14:47,590 on, com veiem aquí, a la part més a l'esquerra, 180 00:14:47,590 --> 00:14:49,910 tenim tots els cognoms. 181 00:14:49,910 --> 00:14:54,670 Així que tenim Malan, a continuació, Hardison, i després Bowden, MacWilliam, i després Chan. 182 00:14:54,670 --> 00:14:59,470 Tots els cognoms. I després una coma separa els cognoms dels noms de pila. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, i Zamyla. 184 00:15:02,970 --> 00:15:06,850 Sempre barrejar Robby i Tom. 185 00:15:06,850 --> 00:15:10,940 I llavors, per fi, la tercera columna és l'adreça de correu electrònic. 186 00:15:10,940 --> 00:15:18,500 Quan entenguis això, la resta del programa és bastant senzill d'implementar. 187 00:15:18,500 --> 00:15:23,850 El que hem fet per tal d'imitar l'estructura mateixa del nostre programa en C 188 00:15:23,850 --> 00:15:27,510 és que hem utilitzat una estructura. 189 00:15:27,510 --> 00:15:30,520 Anem a començar a jugar amb ells una mica més també. 190 00:15:30,520 --> 00:15:35,790 Els vam veure en el primer trosset petit problema en el conjunt 3, quan es tractava dels diccionaris. 191 00:15:35,790 --> 00:15:40,290 Però aquesta estructura personal emmagatzema un cognom, un nom, i un correu electrònic. 192 00:15:40,290 --> 00:15:44,500 Igual que el nostre arxiu CSV estava emmagatzemant. 193 00:15:44,500 --> 00:15:47,950 Així que això és només la conversió d'un format a un altre. 194 00:15:47,950 --> 00:15:54,630 Hem de convertir, en aquest cas, una estructura personal en una línia, 195 00:15:54,630 --> 00:15:59,060 una línia separada per comes, així com així. 196 00:15:59,060 --> 00:16:01,500 Això té sentit? Vostès han pres l'examen, 197 00:16:01,500 --> 00:16:07,680 així que m'imagino que si més no han tingut temps per pensar en això. 198 00:16:07,680 --> 00:16:16,410 >> En la funció de contractació, el problema demana que prenguem en - ens tornarem a ampliar això una mica mica - 199 00:16:16,410 --> 00:16:22,480 prendre en una estructura de personal, una estructura de personal, amb el nom de s, 200 00:16:22,480 --> 00:16:30,900 i afegir el seu contingut al nostre arxiu staff.csv. 201 00:16:30,900 --> 00:16:34,230 Resulta que aquest és bastant senzill d'utilitzar. 202 00:16:34,230 --> 00:16:37,430 Anem a classe de jugar amb aquestes funcions una mica més avui en dia. 203 00:16:37,430 --> 00:16:44,510 Però en aquest cas, la funció fprintf és realment la clau. 204 00:16:44,510 --> 00:16:51,960 Així que amb fprintf, podem imprimir, igual que vostès han estat usant printf aquest terme sencer. 205 00:16:51,960 --> 00:16:55,050 Pot printf una línia en un arxiu. 206 00:16:55,050 --> 00:16:59,030 Així que en lloc de només fer l'anomenada printf habitual on se li dóna la cadena de format 207 00:16:59,030 --> 00:17:05,380 i després canvia totes les variables amb els següents arguments, 208 00:17:05,380 --> 00:17:11,290 amb fprintf, el seu primer argument és en canvi el fitxer que voleu escriure. 209 00:17:11,290 --> 00:17:21,170 Si anéssim a veure això en l'aparell, per exemple, l'home fprintf, 210 00:17:21,170 --> 00:17:25,980 podem veure la diferència entre printf i fprintf. 211 00:17:25,980 --> 00:17:28,960 Vaig a ampliar aquí una mica. 212 00:17:28,960 --> 00:17:33,140 Així que amb printf, li donem una cadena de format i, a continuació els arguments posteriors 213 00:17:33,140 --> 00:17:37,580 són totes les variables per al reemplaçament o substitució en la nostra cadena de format. 214 00:17:37,580 --> 00:17:47,310 Mentre que amb fprintf, el primer argument és precisament aquesta * arxiu anomenat un rierol. 215 00:17:47,310 --> 00:17:51,800 >> Tornant aquí als nostres contractes de lloguer, 216 00:17:51,800 --> 00:17:54,550 ja tenim el nostre flux * arxiu obert per a nosaltres. 217 00:17:54,550 --> 00:17:57,810 Això és el primer que fa aquesta línia, s'obre l'arxiu staff.csv, 218 00:17:57,810 --> 00:18:01,690 l'obre en mode append, i és tot el que ens queda per fer 219 00:18:01,690 --> 00:18:08,640 escriure l'estructura de la plantilla a l'arxiu. 220 00:18:08,640 --> 00:18:10,870 I, anem a veure, em vols fer servir l'iPad? 221 00:18:10,870 --> 00:18:17,900 Vaig a utilitzar l'iPad. Tenim buit - Posarem això sobre la taula perquè podia escriure una mica millor - 222 00:18:17,900 --> 00:18:33,680 anul · lar el lloguer i que es necessita en un argument, una estructura de personal anomenat s. 223 00:18:33,680 --> 00:18:44,120 Got nostres claus, tenim el nostre arxiu anomenat * arxiu, 224 00:18:44,120 --> 00:18:48,380 tenim la nostra línia fopen donat a nosaltres, 225 00:18:48,380 --> 00:18:51,890 i jo només vaig a escriure en forma de punts, ja que ja és al demanava. 226 00:18:51,890 --> 00:19:00,530 I després, en la nostra línia següent, farem una crida a fprintf 227 00:19:00,530 --> 00:19:03,700 i passarem a l'arxiu que voleu imprimir, 228 00:19:03,700 --> 00:19:10,290 i després el nostre format de cadena, que - 229 00:19:10,290 --> 00:19:14,300 Vaig a deixar que vostès em diuen el que sembla. 230 00:19:14,300 --> 00:19:20,500 I tu, Stella? Saps que la primera part de la cadena de format s'assembla? 231 00:19:20,500 --> 00:19:24,270 [Stella] Jo no estic segur. >> No dubti a preguntar Jimmy. 232 00:19:24,270 --> 00:19:27,690 Sap vostè, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Podria ser només passat? No. No estic del tot segur. 234 00:19:31,000 --> 00:19:39,020 >> Okay. Com va, algú obtenir aquesta correcte en l'examen? 235 00:19:39,020 --> 00:19:41,770 No Està bé. 236 00:19:41,770 --> 00:19:47,920 Resulta que aquí l'únic que hem de fer és que volem que cada part de la nostra estructura de personal 237 00:19:47,920 --> 00:19:53,290 per ser imprès com una cadena en el nostre arxiu. 238 00:19:53,290 --> 00:19:59,900 Ens limitem a fer servir el personatge de substitució de cadenes en tres ocasions diferents, perquè tenim un cognom 239 00:19:59,900 --> 00:20:07,160 seguit de coma, després d'un primer nom seguit d'una coma, 240 00:20:07,160 --> 00:20:12,430 i, finalment, l'adreça de correu electrònic que és seguit - que no és 241 00:20:12,430 --> 00:20:15,140 muntar a la meva pantalla - però és seguit per un caràcter de nova línia. 242 00:20:15,140 --> 00:20:20,060 Així que vaig a escriure just allà baix. 243 00:20:20,060 --> 00:20:23,560 I després, després de la nostra cadena de format, 244 00:20:23,560 --> 00:20:27,880 només tenim les substitucions, que s'accedeix mitjançant la notació de punts 245 00:20:27,880 --> 00:20:31,370 que vam veure en el butlletí de problemes 3. 246 00:20:31,370 --> 00:20:48,820 Podem utilitzar s.last, s.first i s.email 247 00:20:48,820 --> 00:20:58,990 per substituir en aquests tres valors en la nostra cadena de format. 248 00:20:58,990 --> 00:21:06,190 Llavors, com et va anar? Té sentit? 249 00:21:06,190 --> 00:21:09,700 Sí? No? Possiblement? Bé. 250 00:21:09,700 --> 00:21:14,180 >> L'última cosa que fem després d'haver imprès i després que hem obert el nostre arxiu: 251 00:21:14,180 --> 00:21:17,370 cada vegada que hem obert un arxiu, sempre hem de recordar per tancar-la. 252 00:21:17,370 --> 00:21:19,430 Perquè si no anem a acabar la filtració de la memòria, 253 00:21:19,430 --> 00:21:22,500 utilitzant fins descriptors de fitxer. 254 00:21:22,500 --> 00:21:25,950 Així que per tancar, que funcionen fem servir? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, exactament. 256 00:21:30,120 --> 00:21:37,520 Així que l'última part d'aquest problema consistia a tancar correctament l'arxiu, utilitzant la funció fclose, 257 00:21:37,520 --> 00:21:40,370 que només s'assembla a això. 258 00:21:40,370 --> 00:21:43,880 No està boig. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Així que això és problema 33 en el concurs. 261 00:21:49,520 --> 00:21:52,480 Tindrem arxiu definitivament més I / O ve. 262 00:21:52,480 --> 00:21:55,130 Anem a fer una mica més en la conferència d'avui, oa la secció d'avui, 263 00:21:55,130 --> 00:22:01,710 perquè això és el que constituirà la major part d'aquest conjunt de processadors proper. 264 00:22:01,710 --> 00:22:05,020 Anem a passar de la prova en aquest punt. Sí? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Per què fclose (arxiu) en comptes de fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Perquè resulta que - de manera que la pregunta, que és un gran, 267 00:22:19,100 --> 00:22:27,800 Per això, quan escrivim fclose, estem escrivint fclose (arxiu) estrella variable 268 00:22:27,800 --> 00:22:33,680 en contraposició al nom d'arxiu, staff.csv? És això correcte? Si. 269 00:22:33,680 --> 00:22:39,570 Així que anem a fer una ullada. Si torno al meu ordinador portàtil, 270 00:22:39,570 --> 00:22:45,040 i donem una ullada a la funció fclose. 271 00:22:45,040 --> 00:22:51,460 Així que la funció fclose tanca un rierol i que es necessita en el punter al flux que volem tancar, 272 00:22:51,460 --> 00:22:57,010 en comparació amb el nom real de l'arxiu que voleu tancar. 273 00:22:57,010 --> 00:23:01,620 I és que darrere de les escenes, quan vostè fa una crida a fopen, 274 00:23:01,620 --> 00:23:12,020 quan s'obre un arxiu, en realitat estàs assignació de memòria per emmagatzemar la informació sobre l'arxiu. 275 00:23:12,020 --> 00:23:16,380 Així que tens punter de l'arxiu que conté informació sobre l'arxiu, 276 00:23:16,380 --> 00:23:23,080 tal com està obert, la seva mida, en la qual es troben actualment a l'arxiu, 277 00:23:23,080 --> 00:23:29,100 de manera que vostè pot fer que la lectura i l'escriptura trucades a aquest lloc en particular dins de l'arxiu. 278 00:23:29,100 --> 00:23:38,060 S'acaba de tancar el punter en lloc de tancar el nom del fitxer. 279 00:23:38,060 --> 00:23:48,990 >> Sí? [Daniel] Així que per tal d'utilitzar de lloguer, diria vostè - com obtenir l'entrada de l'usuari? 280 00:23:48,990 --> 00:23:53,830 Té fprintf actuar com GetString en el sentit que només vaig a esperar que l'entrada de l'usuari 281 00:23:53,830 --> 00:23:57,180 i li demanarà que escrigui això - o esperar que escrigui aquestes tres coses? 282 00:23:57,180 --> 00:24:00,480 O és necessari utilitzar una mica d'implementar lloguer? 283 00:24:00,480 --> 00:24:04,100 Sí >>. Així que no estem - la pregunta va ser, com fem perquè la entrada de l'usuari 284 00:24:04,100 --> 00:24:09,220 amb la finalitat d'implementar lloguer? I el que tenim aquí és el llamador de lloguer, 285 00:24:09,220 --> 00:24:17,690 aprovada en aquesta estructura personal amb totes les dades emmagatzemades en l'estructura ja. 286 00:24:17,690 --> 00:24:22,990 Així fprintf és capaç d'escriure només les dades directament a l'arxiu. 287 00:24:22,990 --> 00:24:25,690 No cal esperar que l'usuari. 288 00:24:25,690 --> 00:24:32,110 L'usuari ja està donat per l'entrada correctament posant en aquesta estructura de personal. 289 00:24:32,110 --> 00:24:36,510 I les coses, és clar, es trencaria si algun dels punters eren nul · les, 290 00:24:36,510 --> 00:24:40,370 pel que desplaçar-se de nou fins aquí i ens fixem en la nostra estructura. 291 00:24:40,370 --> 00:24:43,640 Tenim string cognom, nom, adreça de correu electrònic cadena. 292 00:24:43,640 --> 00:24:48,530 Ara sabem que tots els que en realitat, sota el capó, són variables char *. 293 00:24:48,530 --> 00:24:53,470 Que pot o no pot estar apuntant a null. 294 00:24:53,470 --> 00:24:55,800 Poden estar apuntant a la memòria en el munt, 295 00:24:55,800 --> 00:24:59,650 tal memòria a la pila. 296 00:24:59,650 --> 00:25:04,580 Realment no ho sé, però, si algun d'aquests indicadors és nul o no vàlid 297 00:25:04,580 --> 00:25:08,120 que que definitivament va a estavellar nostra funció de contractació. 298 00:25:08,120 --> 00:25:11,050 Això era una cosa que estava una mica més enllà de l'abast de l'examen. 299 00:25:11,050 --> 00:25:16,440 No haurem de preocupar per això. 300 00:25:16,440 --> 00:25:22,170 Gran. Bé. Així de passar de la prova. 301 00:25:22,170 --> 00:25:25,760 >> Anem a tancar aquest tipus, i veurem pset 4. 302 00:25:25,760 --> 00:25:34,700 Així que si vostès mirar les especificacions conjunt de processadors, una vegada que es pot accedir, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 anirem a través d'alguns dels problemes de la secció actual. 304 00:25:42,730 --> 00:25:52,240 Estic desplaçament cap avall - secció de preguntes comença a la tercera pàgina de l'especificació de conjunt de processadors. 305 00:25:52,240 --> 00:25:57,800 I el primer que demana per anar a veure el curt a la reorientació i canonades. 306 00:25:57,800 --> 00:26:02,820 La qual cosa era una mena de fresc a curt, et mostra alguns trucs nous, frescos línia de comandes que es poden utilitzar. 307 00:26:02,820 --> 00:26:06,050 I després tenim algunes preguntes per a vostè també. 308 00:26:06,050 --> 00:26:10,860 Aquesta primera pregunta sobre els rierols, perquè printf escriu per defecte, 309 00:26:10,860 --> 00:26:15,920 quin tipus de tocat una mica fa un moment. 310 00:26:15,920 --> 00:26:22,380 Aquesta fprintf que estàvem discutint pren en un rierol arxiu * com a argument. 311 00:26:22,380 --> 00:26:26,580 fclose presa en un flux d'arxiu *, així, 312 00:26:26,580 --> 00:26:32,660 i el valor retornat per fopen li dóna un corrent * arxiu també. 313 00:26:32,660 --> 00:26:36,060 La raó per la qual no hem vist abans, quan els hem tractat amb printf 314 00:26:36,060 --> 00:26:39,450 és perquè printf té una seqüència. 315 00:26:39,450 --> 00:26:41,810 I el corrent de defecte als que s'escriu 316 00:26:41,810 --> 00:26:45,190 podràs conèixer en el curt termini. 317 00:26:45,190 --> 00:26:50,080 Així que definitivament fer una ullada. 318 00:26:50,080 --> 00:26:53,010 >> A la secció d'avui, parlarem una mica sobre GDB, 319 00:26:53,010 --> 00:26:57,720 ja que com més familiaritzat estigui amb ell, la pràctica més que s'obté amb ella, 320 00:26:57,720 --> 00:27:01,390 el millor preparat estarà per caçar als insectes en realitat en el seu propi codi. 321 00:27:01,390 --> 00:27:05,540 Això accelera el procés de depuració tremendament. 322 00:27:05,540 --> 00:27:09,230 Així mitjançant l'ús de printf, cada vegada que fas això has de tornar a compilar el codi, 323 00:27:09,230 --> 00:27:13,000 has de córrer de nou, de vegades cal moure l'anomenada printf voltant, 324 00:27:13,000 --> 00:27:17,100 comentar codi, només es necessita un temps. 325 00:27:17,100 --> 00:27:20,850 El nostre objectiu és intentar convèncer-los que amb GDB, vostè pot essencialment 326 00:27:20,850 --> 00:27:26,810 printf res en qualsevol punt del seu codi i vostè no haurà de tornar a compilar. 327 00:27:26,810 --> 00:27:35,120 Vostè mai ha d'iniciar i mantenir endevinant on printf següent. 328 00:27:35,120 --> 00:27:40,910 El primer que ha de fer és copiar aquesta línia i obtenir el codi de secció de la web. 329 00:27:40,910 --> 00:27:47,530 Estic copiant aquesta línia de codi que diu: "http://cdn.cs50.net wget". 330 00:27:47,530 --> 00:27:49,510 Jo ho vaig a copiar. 331 00:27:49,510 --> 00:27:55,950 Vaig a anar al meu aparell, allunyar perquè pugui veure el que estic fent, 332 00:27:55,950 --> 00:28:01,890 enganxar-lo allà, i quan premeu la tecla Enter, aquesta comanda wget literalment és un web aconseguir-ho. 333 00:28:01,890 --> 00:28:06,210 Va a baixar l'arxiu fora de la Internet, 334 00:28:06,210 --> 00:28:11,790 i va a guardar en el directori actual. 335 00:28:11,790 --> 00:28:21,630 Ara bé, si enumero meu directori actual es pot veure que tinc l'arxiu section5.zip bé aquí. 336 00:28:21,630 --> 00:28:25,260 La manera de tractar amb aquest tipus és que descomprimir, 337 00:28:25,260 --> 00:28:27,650 que es pot fer en la línia d'ordres, igual que aquest. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Això ho descomprimeixi, creu la carpeta per a mi, 340 00:28:36,980 --> 00:28:40,410 inflar tot el contingut, els va posar allà. 341 00:28:40,410 --> 00:28:47,410 Així que ara puc anar al meu secció 5 directori amb la comanda cd. 342 00:28:47,410 --> 00:28:58,310 Netejar la pantalla amb clara. Així que netejar la pantalla. 343 00:28:58,310 --> 00:29:02,280 Ara tinc un terminal net i agradable d'utilitzar. 344 00:29:02,280 --> 00:29:06,200 >> Ara bé, si una llista de tots els arxius que apareixen en aquest directori, 345 00:29:06,200 --> 00:29:12,270 veieu que jo tinc quatre arxius: buggy1, buggy2, buggy3 i buggy4. 346 00:29:12,270 --> 00:29:16,180 També tinc els arxius de C corresponent .. 347 00:29:16,180 --> 00:29:20,400 No anem a mirar els arxius. C per ara. 348 00:29:20,400 --> 00:29:24,140 En el seu lloc, anem a usar quan obrim GDB. 349 00:29:24,140 --> 00:29:28,220 Ens hem mantingut al voltant del que tenim accés al codi font real quan estem utilitzant GDB, 350 00:29:28,220 --> 00:29:32,740 però l'objectiu d'aquesta part de la secció és jugar una mica amb GDB 351 00:29:32,740 --> 00:29:40,370 i veure com podem utilitzar-lo per esbrinar el que va malament amb cada un d'aquests quatre programes amb errors. 352 00:29:40,370 --> 00:29:43,380 Així que només anem a pel quart molt ràpid, 353 00:29:43,380 --> 00:29:47,000 i jo vaig a demanar a algú per executar un dels programes amb errors, 354 00:29:47,000 --> 00:29:54,730 i després anirem com un grup a través del BGF, i veurem què podem fer per vos d'aquestes programes, 355 00:29:54,730 --> 00:29:58,460 o identificar almenys el que va malament en cadascun d'ells. 356 00:29:58,460 --> 00:30:04,760 Començarem per aquí amb Daniel. ¿Va a córrer buggy1? Anem a veure què passa. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Es diu que hi ha un error d'aplicació. Sí >>. Exactament. 358 00:30:09,470 --> 00:30:12,460 Així que si em quedo buggy1, em surt un error seg. 359 00:30:12,460 --> 00:30:16,210 En aquest punt, jo podria anar i obrir buggy1.c, 360 00:30:16,210 --> 00:30:19,450 intentar esbrinar el que va malament, 361 00:30:19,450 --> 00:30:22,000 però una de les coses més desagradables sobre aquest error d'errors seg 362 00:30:22,000 --> 00:30:27,610 és que no et diu en quina línia del programa de les coses realment va sortir malament i es va trencar. 363 00:30:27,610 --> 00:30:29,880 D'alguna manera hem de mirar el codi 364 00:30:29,880 --> 00:30:33,990 i esbrinar mitjançant conjectures i comprovar o printf per veure el que va malament. 365 00:30:33,990 --> 00:30:37,840 Una de les millors coses sobre GDB és que és molt, molt fàcil 366 00:30:37,840 --> 00:30:42,170 per esbrinar la línia a la qual el programa es bloqueja. 367 00:30:42,170 --> 00:30:46,160 Està totalment digne d'ell per usar-lo, encara que només sigui per això. 368 00:30:46,160 --> 00:30:56,190 Així que per arrencar GDB, tipus I GDB, i després li dono la ruta d'accés a l'arxiu executable que voleu executar. 369 00:30:56,190 --> 00:31:01,960 Aquí estic escrivint gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Premeu Enter. Em dóna tota aquesta informació de drets d'autor, 371 00:31:06,600 --> 00:31:13,000 i aquí vostè veurà aquesta línia que diu: "Lectura de símbols / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1 ". 373 00:31:17,680 --> 00:31:22,060 I si tot va bé, veuràs que imprimeixi un missatge semblant a aquest. 374 00:31:22,060 --> 00:31:25,500 Es va a llegir els símbols, que dirà "Estic llegint els símbols del seu arxiu executable" 375 00:31:25,500 --> 00:31:29,900 i llavors tindrà aquest "fet" missatge aquí. 376 00:31:29,900 --> 00:31:35,410 Si veus alguna altra variant d'això, o veure que no podia trobar els símbols 377 00:31:35,410 --> 00:31:41,460 o alguna cosa per l'estil, el que vol dir és que vostè no hagi compilat el seu executable correctament. 378 00:31:41,460 --> 00:31:49,980 En compilar programes per funcionar amb GDB, hem de fer servir aquesta bandera especialment g, 379 00:31:49,980 --> 00:31:54,540 i això es fa per defecte compilant els programes, simplement teclejant make 380 00:31:54,540 --> 00:31:59,320 o fer buggy o fer recuperar, res d'això. 381 00:31:59,320 --> 00:32:07,800 Però si estàs compilant manualment amb Clang, llavors vostè haurà d'anar i que inclouen-g. 382 00:32:07,800 --> 00:32:10,310 >> En aquest punt, ara que tenim el nostre GDB del sistema, 383 00:32:10,310 --> 00:32:12,310 que és molt simple d'executar el programa. 384 00:32:12,310 --> 00:32:19,740 Podem escriure run, o simplement podem escriure r. 385 00:32:19,740 --> 00:32:22,820 La majoria de les ordres de GDB pot ser abreujat. 386 00:32:22,820 --> 00:32:25,940 En general, a només una o unes lletres d'un parell, la qual cosa és bastant agradable. 387 00:32:25,940 --> 00:32:30,980 Així Saad, si escriu r i premeu Enter, què passa? 388 00:32:30,980 --> 00:32:39,390 [Saad] Tinc SIGSEGV, fallada de segmentació, i llavors tot aquest galimaties. 389 00:32:39,390 --> 00:32:43,650 Sí >>. 390 00:32:43,650 --> 00:32:47,990 Com estem veient a la pantalla en aquest moment, i com va dir Saad, 391 00:32:47,990 --> 00:32:53,430 quan teclegem carrera o r i premeu la tecla Enter, se segueix rebent el mateix error seg. 392 00:32:53,430 --> 00:32:55,830 Així que usant GDB no resol el nostre problema. 393 00:32:55,830 --> 00:32:59,120 Però ens dóna un argot, i resulta que aquesta argot 394 00:32:59,120 --> 00:33:03,080 en realitat ens diu on està succeint. 395 00:33:03,080 --> 00:33:10,680 Per analitzar això una mica, aquest primer bit és la funció en què tot va malament. 396 00:33:10,680 --> 00:33:20,270 Hi ha un __ strcmp_sse4_2, i ens diu que està succeint en aquest arxiu 397 00:33:20,270 --> 00:33:29,450 anomenat sysdeps/i386, tot això, de nou, una mena de desastre - però la línia 254. 398 00:33:29,450 --> 00:33:31,670 Això és una mica difícil d'analitzar. Normalment, quan veus coses com aquesta, 399 00:33:31,670 --> 00:33:38,770 que vol dir que està seg amb error en una de les biblioteques del sistema. 400 00:33:38,770 --> 00:33:43,220 Així que alguna cosa a veure amb strcmp. Heu vist strcmp abans. 401 00:33:43,220 --> 00:33:52,730 No està boig, però això vol dir que strcmp està trencat o hi ha problema amb strcmp? 402 00:33:52,730 --> 00:33:57,110 Què et sembla, Alejandro? 403 00:33:57,110 --> 00:34:04,890 [Alexander] És que - és de 254 la línia? I - no el binari, però no és els seus sostres, 404 00:34:04,890 --> 00:34:10,590 i després hi ha un altre idioma per a cada funció. Això és 254 en aquesta funció, o -? 405 00:34:10,590 --> 00:34:21,460 >> És la línia 254. Sembla que en aquest arxiu. S, de manera que és probable que el codi assemblador. 406 00:34:21,460 --> 00:34:25,949 >> No obstant això, crec que la cosa més urgent és, perquè hem aconseguit una fallada seg, 407 00:34:25,949 --> 00:34:29,960 i sembla com si vingués de la funció strcmp, 408 00:34:29,960 --> 00:34:38,030 Què implica això, doncs, que strcmp es trenca? 409 00:34:38,030 --> 00:34:42,290 No hauria, esperançat. Així que només perquè vostè té una fallada de segmentació 410 00:34:42,290 --> 00:34:49,480 en una de les funcions del sistema, en general això significa que no l'han anomenat correctament. 411 00:34:49,480 --> 00:34:52,440 La forma més ràpida que es pot fer per esbrinar el que realment està passant 412 00:34:52,440 --> 00:34:55,500 quan veus alguna cosa boig com aquest, cada vegada que vegi una falla seg, 413 00:34:55,500 --> 00:34:59,800 especialment si vostè té un programa que utilitzeu més que principal, 414 00:34:59,800 --> 00:35:03,570 és utilitzar un backtrace. 415 00:35:03,570 --> 00:35:13,080 I abreujar backtrace per escrit bt, en oposició a la paraula traça completa. 416 00:35:13,080 --> 00:35:16,510 Però Charlotte, el que passa quan s'escriu bt i premeu Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Em mostra dues línies, la línia 0 i la línia 1. 418 00:35:23,200 --> 00:35:26,150 Sí >>. Així que la línia 0 i la línia 1. 419 00:35:26,150 --> 00:35:34,560 Aquests són els marcs de pila reals que estan actualment en joc quan el programa es va estavellar. 420 00:35:34,560 --> 00:35:42,230 A partir del marc superior, el marc 0, i anar a la part inferior més, que és el quadre 1. 421 00:35:42,230 --> 00:35:45,140 El nostre marc superior és el marc strcmp. 422 00:35:45,140 --> 00:35:50,080 Vostè pot pensar en això com similar al problema que estàvem fent en el concurs amb els punters, 423 00:35:50,080 --> 00:35:54,890 on havíem intercanviar marc de pila a la part superior del marc de pila principal, 424 00:35:54,890 --> 00:35:59,700 i vam tenir les variables que s'utilitzen swaps a la part superior de les variables que s'utilitzen principal. 425 00:35:59,700 --> 00:36:08,440 Aquí el nostre accident ha passat a la nostra funció strcmp, que va ser cridat per la nostra funció principal, 426 00:36:08,440 --> 00:36:14,370 i backtrace ens està donant no només les funcions en què les coses fallides, 427 00:36:14,370 --> 00:36:16,440 però també se'ns diu que tot va ser anomenat. 428 00:36:16,440 --> 00:36:18,830 Així que si em desplaço en una mica més a la dreta, 429 00:36:18,830 --> 00:36:26,110 podem veure que sí, que estàvem en la línia 254 de aquest arxiu strcmp-sse4.s. 430 00:36:26,110 --> 00:36:32,540 Però la trucada es va fer en buggy1.c, línia 6. 431 00:36:32,540 --> 00:36:35,960 Així que això vol dir que podem fer - és simplement podem anar a veure cap a fora i veure el que estava passant 432 00:36:35,960 --> 00:36:39,930 en buggy1.c, línia 6. 433 00:36:39,930 --> 00:36:43,780 Un cop més, hi ha un parell de maneres de fer això. Un és per sortir del GDB 434 00:36:43,780 --> 00:36:49,460 o té el seu codi obert en una altra finestra i referència creuada. 435 00:36:49,460 --> 00:36:54,740 Això, en si mateix, és bastant útil perquè ara si vostè està en horari d'oficina 436 00:36:54,740 --> 00:36:57,220 i vostè té una falla seg i la seva TF està preguntant on tot es trencava, 437 00:36:57,220 --> 00:36:59,710 vostè pot dir: "Oh, la línia 6. No sé el que està passant, 438 00:36:59,710 --> 00:37:03,670 però alguna cosa en la línia 6 està causant el meu programa de trencar. " 439 00:37:03,670 --> 00:37:10,430 L'altra manera de fer-ho és que vostè pot utilitat junt anomenat de llista a GDB. 440 00:37:10,430 --> 00:37:13,650 També es pot abreujar amb l. 441 00:37:13,650 --> 00:37:18,910 Així que si arribem a l, què fem aquí? 442 00:37:18,910 --> 00:37:21,160 Tenim un munt de coses rares. 443 00:37:21,160 --> 00:37:26,030 Aquest és el codi assemblador real 444 00:37:26,030 --> 00:37:29,860 que és en strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Això sembla una mica funky, 446 00:37:32,440 --> 00:37:36,520 i la raó per la qual estem rebent és perquè en aquest moment, 447 00:37:36,520 --> 00:37:40,160 GDB ens té en el marc 0. 448 00:37:40,160 --> 00:37:43,070 >> Així que en qualsevol moment ens fixem en les variables, en qualsevol moment ens fixem en el codi font, 449 00:37:43,070 --> 00:37:50,530 estem veient el codi font que pertany al marc de pila que es troba, 450 00:37:50,530 --> 00:37:53,200 Així que per aconseguir alguna cosa significativa, hem de 451 00:37:53,200 --> 00:37:57,070 passar a un marc de pila que té més sentit. 452 00:37:57,070 --> 00:38:00,180 En aquest cas, el marc de pila principal tindria sentit una mica més, 453 00:38:00,180 --> 00:38:02,680 perquè aquest era realment el codi que nosaltres escrivim. 454 00:38:02,680 --> 00:38:05,330 No és el codi strcmp. 455 00:38:05,330 --> 00:38:08,650 La manera com es pot moure entre els quadres, en aquest cas, perquè tenim dos, 456 00:38:08,650 --> 00:38:10,430 tenim 0 i 1, 457 00:38:10,430 --> 00:38:13,650 ho fa amb l'amunt i avall els comandaments. 458 00:38:13,650 --> 00:38:18,480 Si em mut a un fotograma, 459 00:38:18,480 --> 00:38:21,770 ara estic en el marc de la pila principal. 460 00:38:21,770 --> 00:38:24,330 Em puc moure cap avall per tornar a on estava, 461 00:38:24,330 --> 00:38:32,830 pujar de nou, tornar a baixar, i pujar de nou. 462 00:38:32,830 --> 00:38:39,750 Si tornes a fer el seu programa en GDB, s'obté un accident, s'obté la traça de depuració, 463 00:38:39,750 --> 00:38:42,380 i es veu que està en algun arxiu que vostè no sap el que està passant. 464 00:38:42,380 --> 00:38:45,460 Intenta llista, el codi no es veu familiar, 465 00:38:45,460 --> 00:38:48,150 fer una ullada als seus quadres i esbrinar on es troba. 466 00:38:48,150 --> 00:38:51,010 Vostè està probablement en el marc de pila incorrecta. 467 00:38:51,010 --> 00:38:58,760 O almenys vostè està en un marc de pila que no és la que realment es pot depurar. 468 00:38:58,760 --> 00:39:03,110 Ara que estem en el marc de pila apropiat, estem en el principal, 469 00:39:03,110 --> 00:39:08,100 Ara podem usar la comanda list per esbrinar el que la línia era. 470 00:39:08,100 --> 00:39:13,590 I vostè pot veure, sinó que ho va imprimir per a nosaltres aquí. 471 00:39:13,590 --> 00:39:19,470 Però podem arribar a una llista de tot el mateix, i la llista ens dóna aquesta impressió agradable 472 00:39:19,470 --> 00:39:23,920 del codi font real que està passant aquí. 473 00:39:23,920 --> 00:39:26,420 >> En particular, podem mirar la línia 6. 474 00:39:26,420 --> 00:39:29,330 Podem veure el que està passant aquí. 475 00:39:29,330 --> 00:39:31,250 I sembla que estem fent una comparació de cadenes 476 00:39:31,250 --> 00:39:41,050 entre la cadena "CS50" i roques argv [1]. 477 00:39:41,050 --> 00:39:45,700 Una mica d'això es caigui. 478 00:39:45,700 --> 00:39:54,120 Així Missy, té vostè alguna idea sobre el que podria estar passant aquí? 479 00:39:54,120 --> 00:39:59,400 [Missy] No sé per què està fallant. >> No sé per què està trencant? 480 00:39:59,400 --> 00:40:02,700 Jimmy, alguna idea? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] No estic del tot segur, però comparar l'última vegada que es va utilitzar cadena, 482 00:40:06,240 --> 00:40:10,260 o strcmp, teníem com tres casos diferents sota el mateix. 483 00:40:10,260 --> 00:40:12,800 No teníem un ==, no crec que, just en aquesta primera línia. 484 00:40:12,800 --> 00:40:16,700 En el seu lloc, es va dividir en tres, i un era == 0, 485 00:40:16,700 --> 00:40:19,910 un era <0, crec, i un va ser> 0. 486 00:40:19,910 --> 00:40:22,590 Així que potser alguna cosa així? Sí >>. Així que aquesta qüestió 487 00:40:22,590 --> 00:40:27,200 que estem fent la comparació correcta? 488 00:40:27,200 --> 00:40:31,660 Stella? Alguna idea? 489 00:40:31,660 --> 00:40:38,110 [Stella] Jo no estic segur. >> No estic segur. Daniel? Pensaments? Bé. 490 00:40:38,110 --> 00:40:44,770 Resulta que el que està succeint aquí és quan ens trobem amb el programa 491 00:40:44,770 --> 00:40:48,370 i ens van donar la culpa segons, en executar el programa per primera vegada, Daniel, 492 00:40:48,370 --> 00:40:50,800 se li donen els arguments de línia de comandaments? 493 00:40:50,800 --> 00:40:58,420 [Daniel] >> No No En aquest cas, quin és el valor de argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> No hi ha cap valor. >> Dret. 495 00:41:00,920 --> 00:41:06,120 Bé, no hi ha cap valor de cadena apropiat. 496 00:41:06,120 --> 00:41:10,780 Però hi ha alguna cosa de valor. Quin és el valor que s'emmagatzema allà? 497 00:41:10,780 --> 00:41:15,130 >> Un valor escombraries? >> És un valor escombraries o, en aquest cas, 498 00:41:15,130 --> 00:41:19,930 al final de la matriu argv sempre acaba amb null. 499 00:41:19,930 --> 00:41:26,050 Llavors, què he guardat allà és nul. 500 00:41:26,050 --> 00:41:30,810 L'altra manera de resoldre això, en lloc de pensar a través, 501 00:41:30,810 --> 00:41:33,420 és tractar d'imprimir. 502 00:41:33,420 --> 00:41:35,880 Aquí és on m'estava dient que l'ús de GDB és gran, 503 00:41:35,880 --> 00:41:40,640 perquè vostè pot imprimir totes les variables, tots els valors que desitja 504 00:41:40,640 --> 00:41:43,230 utilitat junt pràctic-excel · lent p. 505 00:41:43,230 --> 00:41:48,520 Així La introducció p i aleshores creeu el valor d'una variable o el nom d'una variable, 506 00:41:48,520 --> 00:41:55,320 dir, argc, veig que argc és 1. 507 00:41:55,320 --> 00:42:01,830 Si voleu imprimir argv [0], puc fer-ho sense més. 508 00:42:01,830 --> 00:42:04,840 I com hem vist, argv [0] és sempre el nom del seu programa, 509 00:42:04,840 --> 00:42:06,910 sempre el nom de l'executable. 510 00:42:06,910 --> 00:42:09,740 Aquí es veu que té el nom de ruta complet. 511 00:42:09,740 --> 00:42:15,920 També pot imprimir argv [1] i veure què passa. 512 00:42:15,920 --> 00:42:20,890 >> Aquí tenim a aquest tipus de valor místic. 513 00:42:20,890 --> 00:42:23,890 Vam aconseguir aquest 0x0. 514 00:42:23,890 --> 00:42:27,850 Recordeu que al començament de la legislatura, quan parlem de números hexadecimals? 515 00:42:27,850 --> 00:42:34,680 O que pocs dubtes al final del conjunt de processadors 0 sobre com representar 50 a hexadecimal? 516 00:42:34,680 --> 00:42:39,410 La forma d'escriure els nombres hexadecimals de CS, no només a nosaltres mateixos confondre 517 00:42:39,410 --> 00:42:46,080 amb nombres decimals, és que sempre els prefix 0x. 518 00:42:46,080 --> 00:42:51,420 Així que aquest prefix 0x sempre només significa interpretar el següent nombre com un nombre hexadecimal, 519 00:42:51,420 --> 00:42:57,400 no com una cadena, no com un nombre decimal, no com un nombre binari. 520 00:42:57,400 --> 00:43:02,820 Com que el nombre 5-0 és un nombre vàlid en hexadecimal. 521 00:43:02,820 --> 00:43:06,240 I és un nombre en decimal, 50. 522 00:43:06,240 --> 00:43:10,050 Així que això és només la manera com eliminar l'ambigüitat. 523 00:43:10,050 --> 00:43:14,860 Així 0x0 1/2 hexadecimal 0, la qual cosa també és decimal, binari 0 0. 524 00:43:14,860 --> 00:43:17,030 És només el valor 0. 525 00:43:17,030 --> 00:43:22,630 Resulta que això és el nul és, en realitat, en la memòria. 526 00:43:22,630 --> 00:43:25,940 Null és 0. 527 00:43:25,940 --> 00:43:37,010 Aquí, l'element emmagatzemat a argv [1] és nul. 528 00:43:37,010 --> 00:43:45,220 Així que estem tractant de comparar el nostre "CS50 rocks" cadena en una cadena nul · la. 529 00:43:45,220 --> 00:43:48,130 Així desreferencia nul, intenteu accedir a les coses en null, 530 00:43:48,130 --> 00:43:55,050 els que normalment es produirà algun tipus de fallada de segmentació o d'altres coses dolentes succeeixin. 531 00:43:55,050 --> 00:43:59,350 I resulta que strcmp no comprova per veure 532 00:43:59,350 --> 00:44:04,340 si vostè ha passat en un valor que és nul. 533 00:44:04,340 --> 00:44:06,370 Per contra, només segueix endavant, tracta de fer el seu, 534 00:44:06,370 --> 00:44:14,640 i si s faltes, segons faltes, i és el teu problema. Has d'anar a arreglar. 535 00:44:14,640 --> 00:44:19,730 Molt ràpidament, com podem solucionar aquest problema? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Pot comprovar si l'ús. 537 00:44:23,540 --> 00:44:32,240 Així que si argv [1] és nul, == 0, llavors tornar 1, o alguna cosa així [inintel · ligible]. 538 00:44:32,240 --> 00:44:34,590 Sí >>. Així que aquesta és una bona manera de fer-ho, com podem comprovar, 539 00:44:34,590 --> 00:44:39,230 el valor que està a punt de passar a strcmp, argv [1], l'hi nul? 540 00:44:39,230 --> 00:44:45,830 Si és nul, llavors podem dir que està bé, avortar. 541 00:44:45,830 --> 00:44:49,450 >> Una forma més comú de fer això és utilitzar el valor de argc. 542 00:44:49,450 --> 00:44:52,040 Es pot veure aquí al començament de principal, 543 00:44:52,040 --> 00:44:58,040 ometem que la primera prova que solem fer quan fem servir arguments de línia de comandes, 544 00:44:58,040 --> 00:45:05,240 que és per provar si el nostre valor argc és el que esperem. 545 00:45:05,240 --> 00:45:10,290 En aquest cas, estem esperant almenys dos arguments, 546 00:45:10,290 --> 00:45:13,660 el nom del programa més l'altre. 547 00:45:13,660 --> 00:45:17,140 Com que estem a punt de fer servir el argument aquí. 548 00:45:17,140 --> 00:45:21,350 Així que tenir algun tipus de prova per endavant, abans de la nostra anomenada strcmp 549 00:45:21,350 --> 00:45:37,390 que les proves siguin o no argv és almenys 2, també podria fer el mateix tipus de coses. 550 00:45:37,390 --> 00:45:40,620 Podem veure si això funciona, executeu el programa de nou. 551 00:45:40,620 --> 00:45:45,610 Sempre es pot reiniciar el programa dins de GDB, que és realment bonica. 552 00:45:45,610 --> 00:45:49,310 Es pot córrer, i quan es passa arguments al seu programa, 553 00:45:49,310 --> 00:45:53,060 les passades en quan es diu a córrer, no en arrencar GDB. 554 00:45:53,060 --> 00:45:57,120 D'aquesta manera vostè pot mantenir invocant el programa amb arguments diferents cada vegada. 555 00:45:57,120 --> 00:46:08,080 Correu de tal manera o una altra, puc escriure r, i ja veurem què passa si escrivim "hola". 556 00:46:08,080 --> 00:46:11,140 Sempre se't preguntarà si vols començar des del principi una altra vegada. 557 00:46:11,140 --> 00:46:17,490 En general, el vull començar des del principi una altra vegada. 558 00:46:17,490 --> 00:46:25,010 I en aquest punt, es reinicia de nou, imprimeix 559 00:46:25,010 --> 00:46:28,920 el programa que s'està executant, buggy1, amb l'argument hola, 560 00:46:28,920 --> 00:46:32,720 i imprimeix aquesta sortida estàndard, sinó que diu: "Vostè rep una D," cara trista. 561 00:46:32,720 --> 00:46:37,610 Però no ens falla seg. Es va dir que el procés va acabar normalment. 562 00:46:37,610 --> 00:46:39,900 Així que es veu molt bé. 563 00:46:39,900 --> 00:46:43,050 No més culpa s, ho hem fet passat, 564 00:46:43,050 --> 00:46:48,190 pel que sembla que era de fet l'error seg culpa que ens donarien. 565 00:46:48,190 --> 00:46:51,540 Per desgràcia, ens diu que estem arribant a una D. 566 00:46:51,540 --> 00:46:54,090 >> Podem tornar enrere i mirar el codi i veure el que estava passant allà 567 00:46:54,090 --> 00:46:57,980 per esbrinar el que era - per què se'ns està dient que tenim una D. 568 00:46:57,980 --> 00:47:03,690 Anem a veure, aquí s'està printf dient que tens una D. 569 00:47:03,690 --> 00:47:08,540 Si teclegem llista, que es mantingui la llista escrivint, segueix iterant a través del seu programa, 570 00:47:08,540 --> 00:47:10,940 pel que vaig a mostrar les primeres línies del seu programa. 571 00:47:10,940 --> 00:47:15,450 A continuació, li mostrarem les pròximes línies, i el tros següent, i el següent tros. 572 00:47:15,450 --> 00:47:18,240 I seguirà tractant de baixar. 573 00:47:18,240 --> 00:47:21,180 I ara anem a arribar a "alinear el número 16 està fora d'abast". 574 00:47:21,180 --> 00:47:23,940 Com que només compta amb 15 línies. 575 00:47:23,940 --> 00:47:30,310 Si s'arriba a aquest punt, i la seva pregunta: "Què he de fer?" pot utilitzar la comanda help. 576 00:47:30,310 --> 00:47:34,340 Utilitzeu ajudar i després donar-li el nom d'una comanda. 577 00:47:34,340 --> 00:47:36,460 I veus el BGF ens dóna tot aquest tipus de coses. 578 00:47:36,460 --> 00:47:43,870 Diu: "Sense un argument, una llista de deu línies o més, després de tot el llistat anterior. 579 00:47:43,870 --> 00:47:47,920 Llista - llista les deu línies abans - " 580 00:47:47,920 --> 00:47:52,960 Així que anem a tractar d'usar menys de la llista. 581 00:47:52,960 --> 00:47:57,000 I que les llistes de les 10 línies anteriors, es pot jugar amb la llista una mica. 582 00:47:57,000 --> 00:48:02,330 Vostè pot fer la llista, llista -, fins i tot es pot donar una llista d'un nombre, com llista 8, 583 00:48:02,330 --> 00:48:07,500 i que va a enumerar les 10 línies al voltant de la línia 8. 584 00:48:07,500 --> 00:48:10,290 I vostè pot veure el que està passant aquí és que tens un simple if else. 585 00:48:10,290 --> 00:48:13,980 Si escriu en CS50 roques, imprimeix "S'obté un excel · lent" 586 00:48:13,980 --> 00:48:16,530 En cas contrari, s'imprimeix "S'obté una D." 587 00:48:16,530 --> 00:48:23,770 Bummer ciutat. Està bé. Sí? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Així que quan he intentat fer CS50 roques sense les cometes, 589 00:48:26,730 --> 00:48:29,290 diu "Et donen una D." 590 00:48:29,290 --> 00:48:32,560 Necessitava les cometes per a aconseguir que funcioni, per què és això? 591 00:48:32,560 --> 00:48:38,490 Sí >>. Resulta que quan - aquest és altra dada poc divertit - 592 00:48:38,490 --> 00:48:47,900 en executar el programa, si l'executem i ens escriu en CS50 roques, 593 00:48:47,900 --> 00:48:50,800 igual que Daniel estava dient que ell va fer, i prémer Intro, 594 00:48:50,800 --> 00:48:52,870 encara diu que obtenim una D. 595 00:48:52,870 --> 00:48:55,580 I la pregunta és, per què és això? 596 00:48:55,580 --> 00:49:02,120 I resulta que tant el nostre terminal i GDB analitzar aquests com dos arguments diferents. 597 00:49:02,120 --> 00:49:04,800 Perquè quan hi ha un espai, que està implicat com 598 00:49:04,800 --> 00:49:08,730 el primer argument acabar, el següent argument està a punt de començar. 599 00:49:08,730 --> 00:49:13,260 La forma de combinar els dos en, o perdó, en un argument, 600 00:49:13,260 --> 00:49:18,510 és l'ús de les cometes. 601 00:49:18,510 --> 00:49:29,560 Així que ara, si ho posem entre cometes i d'executar, obtenim una A. 602 00:49:29,560 --> 00:49:38,780 Així que per recapitular, sense cometes, CS50 i les roques són interpretades com dos arguments diferents. 603 00:49:38,780 --> 00:49:45,320 Amb les cotitzacions, s'analitza com un argument complet. 604 00:49:45,320 --> 00:49:53,070 >> Podem veure això amb un punt d'interrupció. 605 00:49:53,070 --> 00:49:54,920 Fins ara hem estat funcionant el nostre programa, i que s'està executant s'ha 606 00:49:54,920 --> 00:49:58,230 fins que el seg falles o èxits d'un error 607 00:49:58,230 --> 00:50:05,930 o fins que hagi sortit i tot ha estat totalment bé. 608 00:50:05,930 --> 00:50:08,360 Això no és necessàriament el més útil, perquè de vegades 609 00:50:08,360 --> 00:50:11,840 té un error en el seu programa, però no és la causa d'un error de segmentació. 610 00:50:11,840 --> 00:50:16,950 No és la causa del seu programa per aturar o alguna cosa així. 611 00:50:16,950 --> 00:50:20,730 La manera d'aconseguir GDB per aturar el seu programa en un punt particular 612 00:50:20,730 --> 00:50:23,260 és establir un punt d'interrupció. 613 00:50:23,260 --> 00:50:26,520 Vostè pot fer això mitjançant l'establiment d'un punt d'interrupció en un nom de funció 614 00:50:26,520 --> 00:50:30,770 o pot establir un punt d'interrupció en una línia de codi en particular. 615 00:50:30,770 --> 00:50:34,450 M'agradaria establir punts d'interrupció en els noms de funcions, perquè - fàcil de recordar, 616 00:50:34,450 --> 00:50:37,700 i si realment entrar i canviar el codi font una mica, 617 00:50:37,700 --> 00:50:42,020 llavors el punt d'interrupció que s'allotja en el mateix lloc dins del seu codi. 618 00:50:42,020 --> 00:50:44,760 Mentre que si vostè està utilitzant els nombres de línia, i canviar els números de línia 619 00:50:44,760 --> 00:50:51,740 perquè afegeix o elimina una mica de codi, a continuació, els seus punts de ruptura estan totalment fotut. 620 00:50:51,740 --> 00:50:58,590 Una de les coses més comuns que fan és establir un punt d'interrupció en la funció principal. 621 00:50:58,590 --> 00:51:05,300 Sovint vaig a arrencar GDB, vaig a escriure b principal, premeu Enter, i que va a establir un punt d'interrupció 622 00:51:05,300 --> 00:51:10,630 la funció principal, que simplement diu, "Pausa el programa tan bon punt comenceu a córrer" 623 00:51:10,630 --> 00:51:17,960 i d'aquesta manera, quan executo el meu programa amb, diguem, CS50 roques com dos arguments 624 00:51:17,960 --> 00:51:24,830 i premeu la tecla Enter, es torna a la funció principal i s'atura just a la primera línia, 625 00:51:24,830 --> 00:51:30,620 just abans que avalua la funció strcmp. 626 00:51:30,620 --> 00:51:34,940 >> Des que estic en pausa, ara puc començar netejant voltant i veure el que està passant 627 00:51:34,940 --> 00:51:40,250 amb totes les diferents variables que es passen en el meu programa. 628 00:51:40,250 --> 00:51:43,670 Aquí puc imprimir argc i veure el que està passant. 629 00:51:43,670 --> 00:51:50,030 Veure que argc és 3, perquè té 3 valors diferents en el mateix. 630 00:51:50,030 --> 00:51:54,060 Té el nom del programa, té el primer argument i el segon argument. 631 00:51:54,060 --> 00:52:09,330 Podem imprimir els en mirar argv [0], argv [1], i argv [2]. 632 00:52:09,330 --> 00:52:12,030 Així que ara també es pot veure per què aquesta crida strcmp va a fracassar, 633 00:52:12,030 --> 00:52:21,650 perquè veus que es divideix el CS50 i les roques en dos arguments diferents. 634 00:52:21,650 --> 00:52:27,250 En aquest punt, un cop has arribat a un punt d'interrupció, pot continuar amb el pas a través del seu programa 635 00:52:27,250 --> 00:52:32,920 línia per línia, en lloc de començar el seu programa de nou. 636 00:52:32,920 --> 00:52:35,520 Així que si vostè no vol començar el seu programa de nou i seguim des d'aquí, 637 00:52:35,520 --> 00:52:41,970 pot utilitzar la comanda continue i continuarà executar el programa fins al final. 638 00:52:41,970 --> 00:52:45,010 Igual que ho va fer aquí. 639 00:52:45,010 --> 00:52:54,880 No obstant això, si es em reinicia el programa, CS50 roques, colpeja el meu punt d'interrupció una vegada més, 640 00:52:54,880 --> 00:52:59,670 i aquesta vegada, si no vol només ha d'anar tot el camí a través de la resta del programa, 641 00:52:59,670 --> 00:53:08,040 Puc utilitzar la comanda següent, que jo també abreujar amb núm. 642 00:53:08,040 --> 00:53:12,960 I això passarà per la línia de programa en línia. 643 00:53:12,960 --> 00:53:17,530 Així que vostè pot veure les coses com executar, a mesura que canvien les variables, com les coses s'actualitza. 644 00:53:17,530 --> 00:53:21,550 La qual cosa és bastant agradable. 645 00:53:21,550 --> 00:53:26,570 El millor és un altre lloc de repetir el mateix ordre una vegada i una i altra vegada, 646 00:53:26,570 --> 00:53:30,670 si prem Intro - així que aquí veus que ho has escrit en qualsevol cosa - 647 00:53:30,670 --> 00:53:33,780 si tan sols prémer Intro, es repetirà la comanda anterior, 648 00:53:33,780 --> 00:53:36,900 o la comanda GDB anterior que acabo de posar polz 649 00:53:36,900 --> 00:53:56,000 Puc mantenir prement Enter i seguirà pas a pas a través del meu codi línia per línia. 650 00:53:56,000 --> 00:53:59,310 M'agradaria animar a vostès per anar a veure els programes amb errors d'altres també. 651 00:53:59,310 --> 00:54:01,330 No tenim temps per passar per tots ells avui a la secció. 652 00:54:01,330 --> 00:54:05,890 El codi font està aquí, així que vostè pot tipus de veure el que està passant 653 00:54:05,890 --> 00:54:07,730 darrere de les escenes si et quedes realment encallat, 654 00:54:07,730 --> 00:54:11,940 però almenys, només la pràctica d'arrencar GDB, 655 00:54:11,940 --> 00:54:13,940 l'execució del programa fins que es trenca en vostè, 656 00:54:13,940 --> 00:54:18,260 obtenir la traça de depuració, esbrinar quina és la funció de l'accident es trobava, 657 00:54:18,260 --> 00:54:24,450 el que estava en línia, la impressió d'alguns valors de les variables, 658 00:54:24,450 --> 00:54:30,140 només pel que tenir una idea d'això, perquè el que realment l'ajudarà en el futur. 659 00:54:30,140 --> 00:54:36,340 En aquest punt, deixarem de GDB, el que ho fa deixar d'usar o simplement q. 660 00:54:36,340 --> 00:54:40,460 Si el programa està en el mitjà de funcionament encara, i no ha sortit, 661 00:54:40,460 --> 00:54:43,510 sempre li preguntarà: "Estàs segur que realment vol deixar de fumar?" 662 00:54:43,510 --> 00:54:48,770 Només pot colpejar si. 663 00:54:48,770 --> 00:54:55,250 >> Ara anem a veure el problema que tenim, que és el programa de gat. 664 00:54:55,250 --> 00:54:59,880 Si vostè mira el curt a la reorientació i canonades, veuràs que Tommy utilitza aquest programa 665 00:54:59,880 --> 00:55:07,540 que bàsicament imprimeix tota la sortida d'un arxiu a la pantalla. 666 00:55:07,540 --> 00:55:12,660 Així que si em quedo gat, en realitat és un programa integrat en l'aparell, 667 00:55:12,660 --> 00:55:16,860 i si tens Mac pots fer-ho a la teva Mac també, si vostè obre terminal. 668 00:55:16,860 --> 00:55:25,630 I nosaltres - gat, diguem, cp.c, i premeu Enter. 669 00:55:25,630 --> 00:55:29,640 El que això va fer, si ens desplacem una mica i veure on ens trobem amb la línia, 670 00:55:29,640 --> 00:55:40,440 o on va executar la comanda cat, que literalment acaba d'imprimir el contingut de cp.c a la nostra pantalla. 671 00:55:40,440 --> 00:55:44,140 Podem d'executar i es pot posar en diversos arxius junts. 672 00:55:44,140 --> 00:55:49,880 Així que vostè pot fer cp.c gat, i llavors també podem concatenar l'arxiu Cat.C, 673 00:55:49,880 --> 00:55:53,250 que és el programa que anem a escriure, 674 00:55:53,250 --> 00:55:58,140 i que voleu imprimir dos arxius d'esquena a la nostra pantalla. 675 00:55:58,140 --> 00:56:05,490 Així que si ens desplacem una mica, veiem que quan ens trobem amb aquest cp.c gat, Cat.C, 676 00:56:05,490 --> 00:56:17,110 primer es imprimeix l'arxiu cp, i després a continuació, s'imprimeix l'arxiu Cat.C aquí baix. 677 00:56:17,110 --> 00:56:19,650 Anem a utilitzar això per obtenir només els peus mullats. 678 00:56:19,650 --> 00:56:25,930 Juga una mica amb la impressió simple a la terminal, veure com funciona. 679 00:56:25,930 --> 00:56:39,170 Si vostès obren amb gedit Cat.C, premeu Enter, 680 00:56:39,170 --> 00:56:43,760 vostè pot veure el programa que estem a punt d'escriure. 681 00:56:43,760 --> 00:56:48,980 Hem inclòs aquesta placa de la caldera agradable, així que no ha de gastar temps escrivint tot el que fos. 682 00:56:48,980 --> 00:56:52,310 També vam comprovar que el nombre d'arguments passats polz 683 00:56:52,310 --> 00:56:56,910 Ens imprimir cap missatge d'ús agradable. 684 00:56:56,910 --> 00:57:00,950 >> Aquest és el tipus de coses que, de nou, igual que hem estat parlant, 685 00:57:00,950 --> 00:57:04,490 és gairebé com la memòria muscular. 686 00:57:04,490 --> 00:57:07,190 Només recordi de seguir fent el mateix tipus de coses 687 00:57:07,190 --> 00:57:11,310 i sempre imprimint algun tipus de missatge útil 688 00:57:11,310 --> 00:57:17,670 de manera que la gent sap com executar el seu programa. 689 00:57:17,670 --> 00:57:21,630 Amb gat, és bastant simple, només anirem a través de tots els diferents arguments 690 00:57:21,630 --> 00:57:24,300 que es van passar al nostre programa, i anem a imprimir 691 00:57:24,300 --> 00:57:29,950 seu contingut cap a fora a la pantalla d'una en una. 692 00:57:29,950 --> 00:57:35,670 Per imprimir arxius fora de la pantalla, farem alguna cosa molt semblant 693 00:57:35,670 --> 00:57:38,120 al que vam fer al final de la prova. 694 00:57:38,120 --> 00:57:45,350 Al final de la prova, que contracten programa, vam haver d'obrir un arxiu, 695 00:57:45,350 --> 00:57:48,490 i després vam haver imprimir-hi. 696 00:57:48,490 --> 00:57:54,660 En aquest cas, anem a obrir un arxiu, i anem a llegir d'ella en el seu lloc. 697 00:57:54,660 --> 00:58:00,630 A continuació, anem a imprimir, en lloc de a un arxiu, anem a imprimir a la pantalla. 698 00:58:00,630 --> 00:58:05,830 Així que la impressió a la pantalla que tots hem fet abans amb printf. 699 00:58:05,830 --> 00:58:08,290 Així que no és massa boig. 700 00:58:08,290 --> 00:58:12,190 Però la lectura d'un arxiu és una mica estrany. 701 00:58:12,190 --> 00:58:17,300 Anem a passar per això una mica a la vegada. 702 00:58:17,300 --> 00:58:20,560 Si vostès tornar a aquest últim problema al quiz, problema 33, 703 00:58:20,560 --> 00:58:27,280 la primera línia que farem aquí, en obrir l'arxiu, és molt semblant al que vam fer allà. 704 00:58:27,280 --> 00:58:36,370 Llavors, Stella, què significa aquesta mirada línia com, quan obrim un arxiu? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital * Arxiu, Arxiu - >> Bé. >> - És igual a fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Que en aquest cas és? Està en el comentari. 707 00:58:55,980 --> 00:59:06,930 >> Està en el comentari? argv [i] i el r? 708 00:59:06,930 --> 00:59:11,300 >> Exactament. Molt bé. Així que Stella és totalment correcte. 709 00:59:11,300 --> 00:59:13,720 Això és el que la línia s'assembla. 710 00:59:13,720 --> 00:59:19,670 Comencem amb una variable de seqüència d'arxiu, deseu en un FILE *, de manera que totes les tapes, 711 00:59:19,670 --> 00:59:25,720 FILE, *, i el nom d'aquesta variable serà l'arxiu. 712 00:59:25,720 --> 00:59:32,250 El podríem anomenar el que ens agrada. Podríem dir first_file o file_i, qualsevol cosa que volgués. 713 00:59:32,250 --> 00:59:37,590 I després el nom del fitxer que es va aprovar en la línia d'ordres per a aquest programa. 714 00:59:37,590 --> 00:59:44,450 Així que està emmagatzemat en argv [i] i després anem a obrir el fitxer en mode de lectura. 715 00:59:44,450 --> 00:59:48,100 Ara que hem obert l'arxiu, què és el que sempre hem de recordar de fer 716 00:59:48,100 --> 00:59:52,230 cada vegada que hem obert un arxiu? Prop d'ell. 717 00:59:52,230 --> 00:59:57,220 Així Missy, com tancar un arxiu? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (arxiu) >> fclose (arxiu). Exactament. 719 01:00:01,020 --> 01:00:05,340 Gran. Bé. Si ens fixem en això per fer un comentari aquí mateix, 720 01:00:05,340 --> 01:00:11,940 que diu, "Open argv [i] i mostra el seu contingut a la sortida estàndard." 721 01:00:11,940 --> 01:00:15,460 >> Fora Standard és un nom estrany. Stdout és només la nostra manera de dir 722 01:00:15,460 --> 01:00:22,880 volem imprimir al terminal, volem imprimir la seqüència de sortida estàndard. 723 01:00:22,880 --> 01:00:26,450 En realitat, pot desfer-se d'aquest comentari aquí. 724 01:00:26,450 --> 01:00:36,480 Jo en copiar i enganxar ja que és el que vam fer. 725 01:00:36,480 --> 01:00:41,290 En aquest punt, ara hem de llegir el bit d'arxiu de poc. 726 01:00:41,290 --> 01:00:46,300 Hem parlat d'un parell de maneres de llegir arxius. 727 01:00:46,300 --> 01:00:51,830 Quins són els seus favorits fins ara? 728 01:00:51,830 --> 01:00:57,960 Què maneres has vist ni et recordes, per llegir els arxius? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Així fread és un. Jimmy, coneixes alguna altra? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] >> No Està bé. Nope. Charlotte? Alexander? Algun altre? Bé. 731 01:01:12,150 --> 01:01:20,740 Així que els altres són fgetc, és el que farem servir. 732 01:01:20,740 --> 01:01:26,410 També hi ha fscanf; vostès veure un patró aquí? 733 01:01:26,410 --> 01:01:29,170 Tots comencen amb. Res a veure amb un arxiu. 734 01:01:29,170 --> 01:01:35,260 Hi ha fread, fgetc, fscanf. Aquestes són totes les funcions de lectura. 735 01:01:35,260 --> 01:01:49,120 Per escriure tenim fwrite, tenim fputc en lloc de fgetc. 736 01:01:49,120 --> 01:01:58,250 També hem fprintf com hem vist al qüestionari. 737 01:01:58,250 --> 01:02:01,680 Atès que aquest és un problema que involucra la lectura d'un arxiu, 738 01:02:01,680 --> 01:02:04,940 utilitzarem una d'aquestes tres funcions. 739 01:02:04,940 --> 01:02:10,890 No utilitzarem aquestes funcions aquí baix. 740 01:02:10,890 --> 01:02:14,880 Aquestes funcions es troben tots en l'estàndard d'E / S de la biblioteca. 741 01:02:14,880 --> 01:02:17,510 Així que si ens fixem en la part superior d'aquest programa, 742 01:02:17,510 --> 01:02:24,110 es pot veure que ja hem inclòs l'arxiu de capçalera per a l'estàndard d'E / S de la biblioteca. 743 01:02:24,110 --> 01:02:27,120 Si volem esbrinar quin volem utilitzar, 744 01:02:27,120 --> 01:02:29,690 sempre podem obrir les pàgines de manual. 745 01:02:29,690 --> 01:02:34,350 Així que podem escriure stdio home 746 01:02:34,350 --> 01:02:43,180 i llegir tot sobre l'entrada de stdio i funcions de sortida en C. 747 01:02:43,180 --> 01:02:49,870 I ja podem veure oh, mira. S'esmenta fgetc, s'esmenta fputc. 748 01:02:49,870 --> 01:02:57,220 Així que vostè pot aprofundir una mica més i veure, per exemple, fgetc 749 01:02:57,220 --> 01:03:00,060 i buscar a la seva pàgina de manual. 750 01:03:00,060 --> 01:03:03,430 Vostè pot veure que va juntament amb un munt d'altres funcions: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, aconsegueix, ungetc, i la seva entrada de caràcters i cadenes. 752 01:03:12,640 --> 01:03:19,180 Així que així és com es llegeix en caràcters i cadenes dels fitxers d'entrada estàndard, 753 01:03:19,180 --> 01:03:21,990 que és essencialment l'usuari. 754 01:03:21,990 --> 01:03:24,780 I així és com ho fem en real C. 755 01:03:24,780 --> 01:03:30,850 Així que això no està utilitzant el GetString i funcions getchar 756 01:03:30,850 --> 01:03:36,840 que es va utilitzar la biblioteca de CS50. 757 01:03:36,840 --> 01:03:39,710 Anem a fer aquest problema en un parell de maneres 758 01:03:39,710 --> 01:03:43,430 de manera que vostè pot veure dues maneres diferents de fer-ho. 759 01:03:43,430 --> 01:03:48,490 Tant la funció fread que Daniel esmenta i fgetc són bones maneres de fer-ho. 760 01:03:48,490 --> 01:03:53,790 Crec fgetc és una mica més fàcil, ja que només té, com vostè veu, 761 01:03:53,790 --> 01:03:59,660 un argument, el FILE * que estem tractant de llegir el caràcter de, 762 01:03:59,660 --> 01:04:02,740 i el seu valor de retorn és un int. 763 01:04:02,740 --> 01:04:05,610 I això és una mica confús, no? 764 01:04:05,610 --> 01:04:11,450 >> Com que estem arribant a un personatge, així que per què no fa una declaració char? 765 01:04:11,450 --> 01:04:18,700 Vostès tenen alguna idea de per què això no pot tornar un char? 766 01:04:18,700 --> 01:04:25,510 [Missy respostes, inintel · ligible] >> Yeah. Així que Missy és totalment correcte. 767 01:04:25,510 --> 01:04:31,570 Si és ASCII, llavors aquest sencer podria ser assignada a una xerrada real. 768 01:04:31,570 --> 01:04:33,520 Podria ser un caràcter ASCII, i així és. 769 01:04:33,520 --> 01:04:36,220 Això és exactament el que està passant. 770 01:04:36,220 --> 01:04:39,190 Estem usant un int simplement perquè té més bits. 771 01:04:39,190 --> 01:04:44,750 És més gran que un char, la nostra xerrada només té 8 bits, 1 byte que en les nostres màquines de 32 bits. 772 01:04:44,750 --> 01:04:48,520 I un int té valor en els 4 bytes 'de l'espai. 773 01:04:48,520 --> 01:04:50,940 I resulta que la forma fgetc funciona, 774 01:04:50,940 --> 01:04:53,940 si es desplaça cap avall en la nostra sinopsi d'aquesta pàgina de manual una mica, 775 01:04:53,940 --> 01:05:05,000 desplaceu-vos fins al fons. Resulta que utilitzen aquest valor especial anomenat EOF. 776 01:05:05,000 --> 01:05:09,640 És una constant especial com el valor retornat per la funció fgetc 777 01:05:09,640 --> 01:05:14,570 cada vegada que es prem el final de l'arxiu o si es produeix un error. 778 01:05:14,570 --> 01:05:18,170 I és que per fer aquestes comparacions amb EOF correctament, 779 01:05:18,170 --> 01:05:24,060 Vols tenir aquesta quantitat extra d'informació que vostè té en un int 780 01:05:24,060 --> 01:05:28,420 en lloc d'utilitzar una variable char. 781 01:05:28,420 --> 01:05:32,130 Tot i que està efectivament fgetc aconseguir un personatge d'un arxiu, 782 01:05:32,130 --> 01:05:38,450 vol recordar que s'està tornant una cosa que és de tipus int a vostè. 783 01:05:38,450 --> 01:05:41,360 Dit això, és bastant fàcil d'utilitzar. 784 01:05:41,360 --> 01:05:44,960 Això ens donarà un caràcter, de manera que tots hem de fer és seguir demanant l'arxiu, 785 01:05:44,960 --> 01:05:48,440 "Dóna'm el següent caràcter, em dóna el següent caràcter, dóna'm el personatge que ve" 786 01:05:48,440 --> 01:05:51,400 fins que arribem al final de l'arxiu. 787 01:05:51,400 --> 01:05:54,730 I això va a estirar un caràcter alhora del nostre arxiu, 788 01:05:54,730 --> 01:05:56,250 i llavors podem fer el que vulguem amb ella. 789 01:05:56,250 --> 01:06:00,160 Podem emmagatzemar, podem afegir a una cadena, podem imprimir. 790 01:06:00,160 --> 01:06:04,630 Fer res d'això. 791 01:06:04,630 --> 01:06:09,600 >> Acostament a sortir i tornar al nostre programa Cat.C, 792 01:06:09,600 --> 01:06:16,170 si utilitzarem fgetc, 793 01:06:16,170 --> 01:06:21,710 Com ens acostem a aquesta següent línia de codi? 794 01:06:21,710 --> 01:06:26,020 Anem a utilitzar - fread farà alguna cosa una mica diferent. 795 01:06:26,020 --> 01:06:32,600 I aquesta vegada, només utilitzarem fgetc per obtenir un caràcter alhora. 796 01:06:32,600 --> 01:06:40,910 Per processar un arxiu complet, el que hem de fer? 797 01:06:40,910 --> 01:06:44,030 Quants personatges hi ha en un arxiu? 798 01:06:44,030 --> 01:06:47,390 Hi ha un munt. Així que és probable que desitgi obtenir una 799 01:06:47,390 --> 01:06:49,860 i després un altre i aconseguir un altre i aconseguir un altre. 800 01:06:49,860 --> 01:06:53,330 Quin tipus d'algorisme creus que potser us caldrà emprar aquí? 801 01:06:53,330 --> 01:06:55,470 Quin tipus de -? [Alejandro] Un bucle for? >> Exactament. 802 01:06:55,470 --> 01:06:57,500 Algun tipus de bucle. 803 01:06:57,500 --> 01:07:03,380 Un bucle és realment gran, en aquest cas. 804 01:07:03,380 --> 01:07:08,620 I, com vostè deia, sembla que vols un llaç sobre la totalitat de l'expedient, 805 01:07:08,620 --> 01:07:11,820 aconseguir un caràcter alhora. 806 01:07:11,820 --> 01:07:13,850 Alguna suggeriment sobre el que pot tenir un aspecte semblant? 807 01:07:13,850 --> 01:07:22,090 [Alexander, inintel · ligible] 808 01:07:22,090 --> 01:07:30,050 >> Bé, m'ho dius en anglès el que estàs tractant de fer? [Alexander, inintel · ligible] 809 01:07:30,050 --> 01:07:36,270 Així que en aquest cas, sembla que només estem tractant de iterar sobre l'arxiu complet. 810 01:07:36,270 --> 01:07:45,330 [Alejandro] Així que > La mida de -? 811 01:07:45,330 --> 01:07:49,290 Suposo que la mida de l'arxiu, no? La mida - ens tornarem simplement escriure així. 812 01:07:49,290 --> 01:07:57,470 Mida d'arxiu de moment, i + +. 813 01:07:57,470 --> 01:08:04,610 Així que resulta que la manera de fer això utilitzant fgetc, i això és nou, 814 01:08:04,610 --> 01:08:10,460 és que no hi ha manera fàcil d'aconseguir tot just la mida d'un arxiu 815 01:08:10,460 --> 01:08:16,979 amb aquest "sizeof" tipus de construcció que hagi vist abans. 816 01:08:16,979 --> 01:08:20,910 Quan fem servir aquesta funció fgetc, estem introduint algun tipus de 817 01:08:20,910 --> 01:08:29,069 nova sintaxi, funky a aquest bucle, on en lloc d'utilitzar simplement un comptador bàsic 818 01:08:29,069 --> 01:08:33,920 anar caràcter per caràcter, anem a tirar un caràcter alhora, 819 01:08:33,920 --> 01:08:37,120 un caràcter alhora, i la manera com sabem que estem al final 820 01:08:37,120 --> 01:08:41,290 no és quan hem comptat un nombre determinat de caràcters, 821 01:08:41,290 --> 01:08:49,939 però quan el personatge de treure és que la final de caràcter especial d'arxiu. 822 01:08:49,939 --> 01:08:58,689 Així que podem fer això - Jo dic a aquesta cap, i nosaltres anem a inicialitzar 823 01:08:58,689 --> 01:09:08,050 amb la nostra primera trucada per obtenir el primer caràcter de l'arxiu. 824 01:09:08,050 --> 01:09:14,979 Així que aquesta part, just aquí, això es va a posar a un personatge fora de l'arxiu 825 01:09:14,979 --> 01:09:20,840 i emmagatzemar-lo en la variable ch. 826 01:09:20,840 --> 01:09:25,420 Seguirem fent això fins que arribi al final de l'arxiu, 827 01:09:25,420 --> 01:09:41,170 que fem per les proves que el personatge no és igual a aquest caràcter EOF especial. 828 01:09:41,170 --> 01:09:48,750 I a continuació, en lloc de fer ch + +, que acaba d'incrementar el valor, 829 01:09:48,750 --> 01:09:52,710 pel que si llegim un fora d'un arxiu, una A majúscula, per exemple, 830 01:09:52,710 --> 01:09:56,810 ch + + ens donaria b, i després ens anàvem a c i d. 831 01:09:56,810 --> 01:09:59,310 Això no és clarament el que volem. El que volem aquí 832 01:09:59,310 --> 01:10:05,830 en aquesta última part és que volem obtenir el següent caràcter de l'arxiu. 833 01:10:05,830 --> 01:10:09,500 >> Llavors, com podem obtenir el següent caràcter de l'arxiu? 834 01:10:09,500 --> 01:10:13,470 Com aconseguim el primer caràcter de l'arxiu? 835 01:10:13,470 --> 01:10:17,200 [Estudiant] fgetfile? >> Fgetc, o, ho sento, tenies tota la raó. 836 01:10:17,200 --> 01:10:20,470 El mal escrit aquí. Així que sí. 837 01:10:20,470 --> 01:10:26,240 Aquí en comptes de fer ch + +, 838 01:10:26,240 --> 01:10:29,560 només anomenarem fgetc (arxiu) de nou 839 01:10:29,560 --> 01:10:39,180 i emmagatzemar el resultat en la variable ch mateix. 840 01:10:39,180 --> 01:10:43,730 [Pregunta Estudiant, inintel · ligible] 841 01:10:43,730 --> 01:10:52,390 >> Aquí és on aquests tipus de fitxers * són especials. 842 01:10:52,390 --> 01:10:59,070 La forma de treballar que és - quan obri per primera vegada - la primera vegada que faci aquesta crida fopen, 843 01:10:59,070 --> 01:11:04,260 L'arxiu * serveix efectivament com un punter al començament de l'arxiu. 844 01:11:04,260 --> 01:11:12,830 I cada vegada que truqui fgetc, es mou un personatge amb el fitxer. 845 01:11:12,830 --> 01:11:23,280 Així que cada vegada que es cridi a això, vostè està incrementant l'apuntador d'arxiu per un caràcter. 846 01:11:23,280 --> 01:11:26,210 I quan fgetc de nou, estàs en moviment a un altre personatge 847 01:11:26,210 --> 01:11:28,910 i un altre personatge i un altre personatge i un altre personatge. 848 01:11:28,910 --> 01:11:32,030 [Pregunta Estudiant, inintel · ligible] >> I això és - si. 849 01:11:32,030 --> 01:11:34,810 És una mica d'aquesta màgia sota el capó. 850 01:11:34,810 --> 01:11:37,930 Vostè acaba de seguir incrementant a través. 851 01:11:37,930 --> 01:11:46,510 En aquest punt, vostè és capaç de treballar realment amb un personatge. 852 01:11:46,510 --> 01:11:52,150 Llavors, com podem imprimir això a la pantalla, ara? 853 01:11:52,150 --> 01:11:58,340 Podem utilitzar la mateixa cosa printf que utilitzem abans. 854 01:11:58,340 --> 01:12:00,330 Que hem estat utilitzant durant tot el semestre. 855 01:12:00,330 --> 01:12:05,450 Podem trucar a printf, 856 01:12:05,450 --> 01:12:21,300 i que pot passar en el caràcter just d'aquesta manera. 857 01:12:21,300 --> 01:12:27,430 Una altra forma de fer-ho és en comptes d'usar printf i haver de fer aquesta cadena de format, 858 01:12:27,430 --> 01:12:29,490 També es pot utilitzar una de les altres funcions. 859 01:12:29,490 --> 01:12:40,090 Podem utilitzar fputc, que imprimeix un caràcter en la pantalla, 860 01:12:40,090 --> 01:12:52,580 excepte si ens fixem en fputc - vull allunyar una mica. 861 01:12:52,580 --> 01:12:56,430 Veiem el millor és que es necessita en el caràcter que llegim a terme utilitzant fgetc, 862 01:12:56,430 --> 01:13:05,100 però llavors hem de donar-li un rierol per imprimir. 863 01:13:05,100 --> 01:13:11,850 També pot utilitzar la funció putchar, que posarà directament a la sortida estàndard. 864 01:13:11,850 --> 01:13:16,070 Així que hi ha un munt d'opcions diferents que podem utilitzar per a la impressió. 865 01:13:16,070 --> 01:13:19,580 Estan tots en l'estàndard d'E / S de la biblioteca. 866 01:13:19,580 --> 01:13:25,150 Cada vegada que vol imprimir - per printf, per defecte, s'imprimirà en la norma especial fora corrent, 867 01:13:25,150 --> 01:13:27,910 que és la sortida estàndard. 868 01:13:27,910 --> 01:13:41,300 Així que només pot referir-se a ell com una mena de màgia aquest valor, stdout aquí. 869 01:13:41,300 --> 01:13:48,410 Oops. Posar el punt i coma fora. 870 01:13:48,410 --> 01:13:52,790 >> Es tracta d'una gran quantitat de nova informació, funky aquí. 871 01:13:52,790 --> 01:13:58,600 Molt d'això és molt idiomàtic, en el sentit que aquest és el codi 872 01:13:58,600 --> 01:14:05,700 el que està escrit aquí només perquè està net de llegir, fàcil de llegir. 873 01:14:05,700 --> 01:14:11,520 Hi ha moltes maneres diferents de fer-ho, moltes funcions diferents que pot utilitzar, 874 01:14:11,520 --> 01:14:14,680 però tendim a seguir només els mateixos patrons una i altra vegada. 875 01:14:14,680 --> 01:14:20,180 Així que no es sorprengui si vostè veu un codi com el que ve una i una altra. 876 01:14:20,180 --> 01:14:25,690 Està bé. En aquest punt, hem de trencar el dia. 877 01:14:25,690 --> 01:14:31,300 Gràcies per venir. Gràcies per veure si estàs en línia. I ens veiem la setmana que ve. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]