1 00:00:00,000 --> 00:00:00,487 2 00:00:00,487 --> 00:00:11,210 >> [GIOCO MUSICA] 3 00:00:11,210 --> 00:00:12,100 >> ROB BODEN: Va bene. 4 00:00:12,100 --> 00:00:15,620 Quindi, prima cosa prima, video da un volto familiare. 5 00:00:15,620 --> 00:00:22,080 6 00:00:22,080 --> 00:00:22,560 >> [RIPRODUZIONE VIDEO] 7 00:00:22,560 --> 00:00:23,370 >> -Va bene. 8 00:00:23,370 --> 00:00:27,150 Questo è CS50, e questo è l'inizio di tre settimane. 9 00:00:27,150 --> 00:00:29,980 Mi dispiace che non potevo essere lì con voi oggi, ma mi permetta di introdurre 10 00:00:29,980 --> 00:00:32,880 Del CS50 proprio Rob Boden. 11 00:00:32,880 --> 00:00:33,872 >> [END RIPRODUZIONE VIDEO] 12 00:00:33,872 --> 00:00:39,340 >> [Applausi e acclamazioni] 13 00:00:39,340 --> 00:00:41,277 >> ROB BODEN: The nell'elenco in che il video è fantastico. 14 00:00:41,277 --> 00:00:47,280 15 00:00:47,280 --> 00:00:47,770 Bene. 16 00:00:47,770 --> 00:00:50,960 Quindi, prima, c'è un altro pranzo. 17 00:00:50,960 --> 00:00:52,330 E 'domani alle 01:15. 18 00:00:52,330 --> 00:00:54,480 Non c'è pranzo questo Venerdì. 19 00:00:54,480 --> 00:00:55,810 È con Quora. 20 00:00:55,810 --> 00:01:00,190 E Tommy non è ancora arrivato, ma uno dei il popolo vi è l'ex CF testa, 21 00:01:00,190 --> 00:01:01,530 Tommy McWilliam. 22 00:01:01,530 --> 00:01:02,730 Quindi lui è un ragazzo divertente. 23 00:01:02,730 --> 00:01:04,819 Dovresti venire. 24 00:01:04,819 --> 00:01:05,900 >> Bene. 25 00:01:05,900 --> 00:01:11,360 Così la settimana scorsa, abbiamo iniziato a sbriciolarsi su ciò che una stringa è davvero. 26 00:01:11,360 --> 00:01:14,830 Abbiamo saputo fin dall'inizio che è una sequenza di caratteri. 27 00:01:14,830 --> 00:01:18,130 Ma la scorsa settimana, abbiamo approfondito il fatto che ciò che è davvero una sequenza di 28 00:01:18,130 --> 00:01:22,110 personaggi, bene, ora abbiamo array di caratteri. 29 00:01:22,110 --> 00:01:26,450 E sappiamo che una stringa, un array di caratteri, alla fine, 30 00:01:26,450 --> 00:01:30,920 abbiamo questo speciale byte null, questo backslash 0, che indica la fine di 31 00:01:30,920 --> 00:01:32,230 la stringa. 32 00:01:32,230 --> 00:01:36,970 >> E così una stringa è un array di personaggi, ma possiamo avere più di 33 00:01:36,970 --> 00:01:39,530 solo un array di caratteri, possiamo avere una matrice di qualsiasi 34 00:01:39,530 --> 00:01:40,890 tipo di cosa che vogliamo. 35 00:01:40,890 --> 00:01:51,570 Quindi, se vi ricordate della scorsa settimana, l' Programma Ages che David ha introdotto 36 00:01:51,570 --> 00:01:53,560 molto velocemente. 37 00:01:53,560 --> 00:01:57,010 Quindi prima cosa che andremo a fare è chiedere all'utente per un numero intero, la 38 00:01:57,010 --> 00:01:58,800 numero di persone nella stanza. 39 00:01:58,800 --> 00:02:01,260 Una volta che abbiamo che integer, stiamo dichiarando un array. 40 00:02:01,260 --> 00:02:02,890 Notate questa sintassi staffa. 41 00:02:02,890 --> 00:02:04,540 Hai intenzione di abituarsi a questo. 42 00:02:04,540 --> 00:02:09,430 >> Quindi stiamo dichiarando un array di interi chiamato età, e ci sono n 43 00:02:09,430 --> 00:02:12,080 numeri interi in questa matrice. 44 00:02:12,080 --> 00:02:16,480 Quindi questo modello proprio qui, questo 4 int i è uguale a 0, i è minore di n, i plus 45 00:02:16,480 --> 00:02:20,580 plus, che è anche sarà un modello che si ottiene molto abituati. 46 00:02:20,580 --> 00:02:24,000 Perché questo è più o meno come sei sempre andando per scorrere gli array. 47 00:02:24,000 --> 00:02:26,330 Quindi ricorda che n è il lunghezza del nostro array. 48 00:02:26,330 --> 00:02:32,120 Ed ecco, noi stiamo chiedendo ripetutamente per l'età del soggetto i nella camera. 49 00:02:32,120 --> 00:02:36,640 >> Dopo questo, scendiamo, e per qualunque ragione arbitraria, abbiamo poi 50 00:02:36,640 --> 00:02:40,220 stampare quanti anni stanno andando ad essere un anno da ora. 51 00:02:40,220 --> 00:02:49,980 E in esecuzione il programma, andiamo fare le età, puntino età oblique. 52 00:02:49,980 --> 00:02:53,010 Quindi, il numero di persone nella stanza, diciamo che ci sono tre. 53 00:02:53,010 --> 00:02:59,880 E dire, la prima persona è di 13, successivo è 26, e l'ultimo è 30. 54 00:02:59,880 --> 00:03:05,080 Allora che sarà un'iterazione su quei tre persone, stampare 14, 27, e 31. 55 00:03:05,080 --> 00:03:16,060 >> Quindi ricorda che quando si dichiara un array di dimensione n, gli indici che 56 00:03:16,060 --> 00:03:19,950 matrice, la matrice ha valori e indici 0, 1, 2, fino 57 00:03:19,950 --> 00:03:21,680 fino a n meno 1. 58 00:03:21,680 --> 00:03:26,255 Così, quando abbiamo detto che c'erano tre persone in camera, e abbiamo messo in qui 59 00:03:26,255 --> 00:03:29,850 la prima iterazione attraverso questo loop, i sta per essere 0. 60 00:03:29,850 --> 00:03:31,650 Così nell'indice 0. 61 00:03:31,650 --> 00:03:34,540 Stiamo assegnando il primo invecchiare l'utente inserisce. 62 00:03:34,540 --> 00:03:38,870 Poi, in quello successivo, stiamo entrando nella n secondo l'utente immette, in 63 00:03:38,870 --> 00:03:40,580 accanto a due, l'ultimo n. 64 00:03:40,580 --> 00:03:44,200 >> Quindi notare che una matrice di dimensione tre non ha nulla 65 00:03:44,200 --> 00:03:46,040 nell'indice tre. 66 00:03:46,040 --> 00:03:49,036 Questo non è valido. 67 00:03:49,036 --> 00:03:50,250 Bene. 68 00:03:50,250 --> 00:03:55,136 Quindi, tornando qui. 69 00:03:55,136 --> 00:03:57,650 70 00:03:57,650 --> 00:04:01,590 Quindi, ora che abbiamo affrontato con gli array, abbiamo una certa familiarità. 71 00:04:01,590 --> 00:04:03,780 Ora stiamo andando a passare al comando argomenti della riga, che stanno per essere 72 00:04:03,780 --> 00:04:05,890 abbastanza rilevante a questo problema insieme. 73 00:04:05,890 --> 00:04:09,670 >> Quindi, fino ad ora, ogni volta che avete ha dichiarato la funzione principale, abbiamo 74 00:04:09,670 --> 00:04:11,230 ha detto int void main. 75 00:04:11,230 --> 00:04:14,070 Quindi nulla significa solo che non stiamo passando alcun 76 00:04:14,070 --> 00:04:16,440 argomenti a questa funzione. 77 00:04:16,440 --> 00:04:19,190 Ora stiamo andando a vedere quella principale può prendere alcuni argomenti. 78 00:04:19,190 --> 00:04:22,470 Qui li chiamiamo int argc e staffe argv stringa. 79 00:04:22,470 --> 00:04:26,930 Le staffe, ancora una volta, indicando che abbiamo a che fare con gli array. 80 00:04:26,930 --> 00:04:31,850 Così qui, parentesi stringa argv, siamo si tratta di un array di stringhe. 81 00:04:31,850 --> 00:04:35,360 Così argc, che sta andando per indicare quanti argomenti abbiamo 82 00:04:35,360 --> 00:04:37,580 passato a questo programma. 83 00:04:37,580 --> 00:04:46,050 E per vedere che cosa significa, chiudiamo questo. 84 00:04:46,050 --> 00:04:46,490 >> OK. 85 00:04:46,490 --> 00:04:50,790 Quindi, fino ad ora, abbiamo eseguito ogni programma come età oblique dot. 86 00:04:50,790 --> 00:04:55,250 Possiamo anche, nella riga di comando, passato passare argomenti, così il termine, comando 87 00:04:55,250 --> 00:04:56,550 argomenti della riga. 88 00:04:56,550 --> 00:04:59,760 Così il primo argomento, ciao mondo. 89 00:04:59,760 --> 00:05:03,350 Così qui, argc sarebbe tre. 90 00:05:03,350 --> 00:05:07,720 E 'il numero degli argomenti nella riga di comando. 91 00:05:07,720 --> 00:05:12,840 Argc è sempre almeno 1, dal dot tagliare le età, stessa, conta come uno dei 92 00:05:12,840 --> 00:05:14,490 gli argomenti della riga di comando. 93 00:05:14,490 --> 00:05:17,010 >> Allora ciao è il primo. 94 00:05:17,010 --> 00:05:20,460 Se matura oblique punto è il zeroth, poi ciao è il primo, e del mondo è l' 95 00:05:20,460 --> 00:05:22,830 secondo argomento della riga di comando. 96 00:05:22,830 --> 00:05:29,490 Così il argv stringa, stiamo andando a vedere, contiene le stringhe, barra dot 97 00:05:29,490 --> 00:05:33,830 età, ciao, e del mondo. 98 00:05:33,830 --> 00:05:38,945 E, su richiesta di David, stiamo andando per riprodurre un video che introduce questo. 99 00:05:38,945 --> 00:05:42,486 100 00:05:42,486 --> 00:05:43,890 >> [RIPRODUZIONE VIDEO] 101 00:05:43,890 --> 00:05:46,240 >> -Fino ad ora nei programmi che abbiamo scritto, abbiamo dichiariamo 102 00:05:46,240 --> 00:05:48,500 principale, come int void main. 103 00:05:48,500 --> 00:05:51,170 E tutto questo tempo, che nulla ha semplicemente stati specificando che il 104 00:05:51,170 --> 00:05:54,430 programma non si assume alcuna argomenti della riga di comando. 105 00:05:54,430 --> 00:05:57,750 In altre parole, quando un utente esegue una programma, lui o lei può fornire comando 106 00:05:57,750 --> 00:06:01,710 gli argomenti della riga di scrittura di ulteriori parole o frasi dopo del programma 107 00:06:01,710 --> 00:06:03,000 nome al prompt. 108 00:06:03,000 --> 00:06:06,550 >> Beh, se volete che il vostro programma prendere gli argomenti della riga di comando, uno o 109 00:06:06,550 --> 00:06:10,540 più tali parole, abbiamo bisogno di sostituire annullare con un paio di argomenti. 110 00:06:10,540 --> 00:06:12,200 Allora facciamolo. 111 00:06:12,200 --> 00:06:15,750 Includi CS50.h. 112 00:06:15,750 --> 00:06:19,360 Includi io.h. norma 113 00:06:19,360 --> 00:06:20,760 Int main. 114 00:06:20,760 --> 00:06:26,330 E adesso, invece di nulla, ho intenzione di specificare un int chiamato argc, e un 115 00:06:26,330 --> 00:06:28,780 array di stringhe chiamato argv. 116 00:06:28,780 --> 00:06:31,820 Ora, argc e argv sono semplicemente convenzioni. 117 00:06:31,820 --> 00:06:34,000 >> Avremmo potuto chiamato questi argomenti più tutto ciò che vogliamo. 118 00:06:34,000 --> 00:06:37,630 Ma ciò che è importante è che argc è un int perché, per definizione, è 119 00:06:37,630 --> 00:06:41,360 andando a contenere il numero di argomento, la numero di parole in totale che il 120 00:06:41,360 --> 00:06:43,380 utente ha digitato a sua richiesta. 121 00:06:43,380 --> 00:06:47,910 argv, nel frattempo, l'argomento vettore, è andando ad essere in realtà un array memorizzazione 122 00:06:47,910 --> 00:06:52,020 tutte le parole che l'utente ha digitato a sua richiesta. 123 00:06:52,020 --> 00:06:54,500 >> Andiamo a fare qualcosa adesso con uno o più di questi 124 00:06:54,500 --> 00:06:55,660 argomenti della riga di comando. 125 00:06:55,660 --> 00:07:00,070 In particolare, andiamo avanti e stampa qualunque parola l'utente 126 00:07:00,070 --> 00:07:03,960 dopo il nome del programma al prompt. 127 00:07:03,960 --> 00:07:04,730 Aprire la staffa. 128 00:07:04,730 --> 00:07:06,240 Chiudi staffa. 129 00:07:06,240 --> 00:07:10,510 Printf cento s backslash e virgola. 130 00:07:10,510 --> 00:07:14,550 Ed ora ho bisogno di dire printf che valore di collegare in quel segnaposto. 131 00:07:14,550 --> 00:07:18,600 Voglio che la prima parola che l'utente ha digitato dopo il nome del programma, 132 00:07:18,600 --> 00:07:23,130 e così ho intenzione di specificare argv staffa 1, primo 133 00:07:23,130 --> 00:07:24,830 parentesi, punto e virgola. 134 00:07:24,830 --> 00:07:27,290 >> Ora, perché la staffa 1 e non 0 staffa? 135 00:07:27,290 --> 00:07:30,990 Beh, si scopre, memorizzate automaticamente in argv 0 sta per essere l' 136 00:07:30,990 --> 00:07:32,620 nome effettivo del programma. 137 00:07:32,620 --> 00:07:36,180 Quindi la prima parola che l'utente digita dopo il nome del programma è, per 138 00:07:36,180 --> 00:07:38,990 convenzione, sta per essere memorizzato in argv 1. 139 00:07:38,990 --> 00:07:42,380 Vediamo ora compilare e eseguire questo programma. 140 00:07:42,380 --> 00:07:47,780 >> Fai argv 0, dot barra argv 0. 141 00:07:47,780 --> 00:07:50,520 Ed ora una parola come ciao. 142 00:07:50,520 --> 00:07:51,670 Invio. 143 00:07:51,670 --> 00:07:53,520 E non l'abbiamo, ciao. 144 00:07:53,520 --> 00:07:55,750 >> [END RIPRODUZIONE VIDEO] 145 00:07:55,750 --> 00:07:57,000 >> ROB BODEN: Va bene. 146 00:07:57,000 --> 00:07:59,380 147 00:07:59,380 --> 00:08:01,230 Chiudere tale. 148 00:08:01,230 --> 00:08:16,730 Quindi, dare un'occhiata a quel programma che abbiamo appena introdotto a noi, bene, basta 149 00:08:16,730 --> 00:08:24,710 per mostrare, se stampiamo argv 0, fare, ora quello che è, argv 0, dot barra argv 0. 150 00:08:24,710 --> 00:08:30,440 Quindi, come previsto, sta stampando la il nome del programma, dal momento che argv 0 è 151 00:08:30,440 --> 00:08:32,970 andando sempre di essere il il nome del programma. 152 00:08:32,970 --> 00:08:35,640 Ma facciamo qualcosa di un po 'più interessante. 153 00:08:35,640 --> 00:08:42,080 >> Così nel problema set, sarete introdotto a questa funzione, atoi. 154 00:08:42,080 --> 00:08:44,440 Quindi cosa usiamo atoi per? 155 00:08:44,440 --> 00:08:48,550 Che sta per convertire un stringa in un intero. 156 00:08:48,550 --> 00:08:53,280 Quindi, se mi passate la stringa, uno due tre, a atoi, che convertiremo che 157 00:08:53,280 --> 00:08:56,910 al numero intero, uno due tre. 158 00:08:56,910 --> 00:09:01,480 Quindi stiamo andando a convertire il primo linea di comando per un numero intero, 159 00:09:01,480 --> 00:09:05,690 e poi basta stampare il numero intero. 160 00:09:05,690 --> 00:09:09,680 >> Quindi, fondamentalmente, siamo un po ' reimplementando getint, solo l' 161 00:09:09,680 --> 00:09:12,350 integer viene immesso al comando linea anziché nel programma 162 00:09:12,350 --> 00:09:14,560 interattivo. 163 00:09:14,560 --> 00:09:23,170 Allora, facendo argv 0, facciamolo qui dentro, e chiudere quello. 164 00:09:23,170 --> 00:09:27,670 Così esecuzione argv 0, e cerchiamo di inserire il integer, uno due tre quattro uno due. 165 00:09:27,670 --> 00:09:30,840 Così lo stamperemo il numero intero, una due tre quattro uno due. 166 00:09:30,840 --> 00:09:35,500 Ci sono alcune sottigliezze a atoi che si fermerà curarsi di nulla 167 00:09:35,500 --> 00:09:39,040 al di là di un carattere numerico valido, ma questo non importa. 168 00:09:39,040 --> 00:09:42,870 >> Allora, cosa pensi che succeda se faccio questo? 169 00:09:42,870 --> 00:09:45,520 170 00:09:45,520 --> 00:09:47,050 Segmentation fault. 171 00:09:47,050 --> 00:09:50,410 Allora perché? 172 00:09:50,410 --> 00:09:56,060 Se si guarda indietro al nostro programma, siamo conversione argv 1, il primo argomento 173 00:09:56,060 --> 00:09:59,610 dopo il nome del programma, in un numero intero. 174 00:09:59,610 --> 00:10:03,350 Ma non c'è argomento passato dopo il nome del programma. 175 00:10:03,350 --> 00:10:08,060 Così qui, vediamo che si tratta di un buggy programma, dal momento che, se proviamo a farlo funzionare 176 00:10:08,060 --> 00:10:10,530 senza argomenti, sarà solo in crash. 177 00:10:10,530 --> 00:10:16,950 >> Così un altro schema comune vedrai è qualcosa di simile, se argc è meno 178 00:10:16,950 --> 00:10:21,100 di due, indicando che non c'era almeno il nome del programma e 179 00:10:21,100 --> 00:10:29,100 primo argomento, poi faremo qualcosa come printf, non abbastanza 180 00:10:29,100 --> 00:10:31,190 argomenti della riga di comando. 181 00:10:31,190 --> 00:10:33,170 Questo non è probabilmente una buona stampa, è probabilmente qualcosa, come 182 00:10:33,170 --> 00:10:35,440 si deve inserire un numero intero nella riga di comando. 183 00:10:35,440 --> 00:10:37,450 Mi limiterò a finire lì. 184 00:10:37,450 --> 00:10:39,600 E poi ritorno 1. 185 00:10:39,600 --> 00:10:44,740 Quindi ricorda che alla fine del nostro programma, se torniamo 0, quella sorta di 186 00:10:44,740 --> 00:10:47,060 indica il successo. 187 00:10:47,060 --> 00:10:50,940 Ed principale anche automaticamente restituisce 0 se non lo fai. 188 00:10:50,940 --> 00:10:55,800 >> Così qui, stiamo risintonizzare 1 per indicare che questo non è successo. 189 00:10:55,800 --> 00:11:01,000 E si può tornare quello che vuoi, solo, 0 indica il successo, e 190 00:11:01,000 --> 00:11:03,390 qualsiasi altra cosa indica un fallimento. 191 00:11:03,390 --> 00:11:04,855 Quindi cerchiamo di eseguire questa versione delle cose. 192 00:11:04,855 --> 00:11:12,880 193 00:11:12,880 --> 00:11:16,600 Così ora, se non entriamo una riga di comando argomento, si dirà correttamente 194 00:11:16,600 --> 00:11:18,290 noi, non abbastanza da riga di comando. 195 00:11:18,290 --> 00:11:20,610 Non finire la frase. 196 00:11:20,610 --> 00:11:24,950 Altrimenti, se abbiamo effettivamente passiamo uno, si può completare il programma. 197 00:11:24,950 --> 00:11:27,920 Quindi questo è come si usa argc in Per convalidare il numero di 198 00:11:27,920 --> 00:11:30,630 argomenti della riga di comando sono effettivamente passati. 199 00:11:30,630 --> 00:11:39,360 >> Quindi cerchiamo di fare questo programma un po 'più complicato, e guardare il secondo 200 00:11:39,360 --> 00:11:42,180 iterazione delle cose. 201 00:11:42,180 --> 00:11:46,310 Così ora, stiamo non solo la stampa del primo argomento della riga di comando. 202 00:11:46,310 --> 00:11:51,210 Qui, stiamo scorrendo da uguali i int 0, i è inferiore a argc, i plus 203 00:11:51,210 --> 00:11:55,280 plus, e la stampa argv, indice i. 204 00:11:55,280 --> 00:11:59,300 Quindi questo modello, di nuovo, questo è lo stesso motivo come prima, tranne che invece 205 00:11:59,300 --> 00:12:02,600 di chiamare la variabile n, stiamo usando argc. 206 00:12:02,600 --> 00:12:09,520 >> Quindi questo è iterazione di ciascun indice nella matrice e la stampa di ogni 207 00:12:09,520 --> 00:12:11,910 elemento di tale matrice. 208 00:12:11,910 --> 00:12:20,300 E così, quando si corre questo programma, beh, Io non entro in qualsiasi riga di comando 209 00:12:20,300 --> 00:12:22,540 argomenti, quindi solo stampe il nome del programma. 210 00:12:22,540 --> 00:12:26,053 Se entro in un sacco di cose, sarà stampare una, ciascuna sulla propria linea. 211 00:12:26,053 --> 00:12:31,213 212 00:12:31,213 --> 00:12:32,210 >> OK. 213 00:12:32,210 --> 00:12:34,770 Quindi cerchiamo di prendere questo un ulteriore passo avanti. 214 00:12:34,770 --> 00:12:38,890 E invece di stampare ogni argomento sulla propria linea, cerchiamo di stampare ogni 215 00:12:38,890 --> 00:12:42,590 carattere di ogni argomento sulla propria linea. 216 00:12:42,590 --> 00:12:46,700 Quindi ricorda che argv è un array di stringhe. 217 00:12:46,700 --> 00:12:50,960 Così che cosa è una stringa, ma un array di caratteri? 218 00:12:50,960 --> 00:12:57,140 Quindi questo significa che argv è davvero un di una matrice di caratteri. 219 00:12:57,140 --> 00:13:04,920 Così, approfittando di questo, cerchiamo di ignorare questo per ora. 220 00:13:04,920 --> 00:13:08,190 Diciamo solo Consideriamo la stringa argv 0. 221 00:13:08,190 --> 00:13:14,170 >> Quindi, se vogliamo portare ogni carattere di argv 0 sulla propria linea, allora voglio 222 00:13:14,170 --> 00:13:19,500 per fare il modello a cui siamo abituati, i è inferiore alla lunghezza della matrice, 223 00:13:19,500 --> 00:13:23,990 che qui, è di strlen, che è non quello che voglio fare, stringa 224 00:13:23,990 --> 00:13:26,450 s uguale argv 0. 225 00:13:26,450 --> 00:13:30,390 Così i è minore della lunghezza della nostra matrice, che in questo caso è un array 226 00:13:30,390 --> 00:13:34,410 di personaggi, i plus plus. 227 00:13:34,410 --> 00:13:41,040 E così, come abbiamo visto la scorsa settimana, è ideale se ci muoviamo che strlen fuori 228 00:13:41,040 --> 00:13:45,210 della condizione, dal momento che n sarà l'aggiunta di la strlen di s ogni volta che andiamo 229 00:13:45,210 --> 00:13:47,720 attraverso il ciclo, ed è non ho intenzione di cambiare. 230 00:13:47,720 --> 00:13:50,230 Quindi imposteremo uguale a n qui. 231 00:13:50,230 --> 00:13:54,260 232 00:13:54,260 --> 00:13:55,170 >> OK. 233 00:13:55,170 --> 00:14:01,320 Così ora, stiamo iterare su ogni indice dell'array. 234 00:14:01,320 --> 00:14:05,630 E così, se vogliamo stampare ogni personaggio di tale matrice, cento c è 235 00:14:05,630 --> 00:14:06,880 la bandiera vogliamo utilizzare per i caratteri. 236 00:14:06,880 --> 00:14:10,750 237 00:14:10,750 --> 00:14:19,770 E ora a i staffa sta per essere il stringa di caratteri indice i, quindi se il 238 00:14:19,770 --> 00:14:20,970 stringa erano ciao. 239 00:14:20,970 --> 00:14:27,530 poi s 0 sta per essere h, s staffa 1 sarà posta, e così via. 240 00:14:27,530 --> 00:14:30,800 >> Così ora vogliamo combinare queste due cose. 241 00:14:30,800 --> 00:14:35,440 Noi vogliamo stampare ogni personaggio di ogni argomento della riga di comando. 242 00:14:35,440 --> 00:14:38,950 Quindi stiamo andando ad avere un ciclo for nidificato. 243 00:14:38,950 --> 00:14:47,480 E convenzionalmente, il primo contatore Sono io, il prossimo sarà j, n 244 00:14:47,480 --> 00:14:54,450 sarà la strlen di argv i, i è minore di n, i plus plus. 245 00:14:54,450 --> 00:14:59,150 246 00:14:59,150 --> 00:15:06,870 E ora invece di stampa argv i, così argv staffa i sta per indice - 247 00:15:06,870 --> 00:15:14,280 che sta per essere la linea di comando i-esimo argomento, argv i, j sta per 248 00:15:14,280 --> 00:15:16,925 essere il carattere j-esima di l'argomento i-esimo. 249 00:15:16,925 --> 00:15:20,580 250 00:15:20,580 --> 00:15:24,810 Io mi libererò di questo qui adesso poiché abbiamo messo in quel ciclo. 251 00:15:24,810 --> 00:15:33,900 Così è equivalente a pari stringa s argv i, e quindi la staffa s j. 252 00:15:33,900 --> 00:15:36,980 >> Beh, non abbiamo bisogno di dichiarare questo s variabile. 253 00:15:36,980 --> 00:15:44,530 Invece, ci limiteremo a combinare queste due in quello che avevamo, argv i, j. 254 00:15:44,530 --> 00:15:45,780 >> SPEAKER 1: [incomprensibile]. 255 00:15:45,780 --> 00:15:48,850 256 00:15:48,850 --> 00:15:49,680 >> ROB BODEN: Good chiamata. 257 00:15:49,680 --> 00:15:52,936 Quindi questo è rotto. 258 00:15:52,936 --> 00:15:55,510 Se io in realtà sono imbattuto essa, avremmo hanno realizzato questo. 259 00:15:55,510 --> 00:16:01,210 Così il contatore mi preoccupo in questo particolare per 260 00:16:01,210 --> 00:16:05,410 loop è j, l'iteratore. 261 00:16:05,410 --> 00:16:08,560 Così si sarebbe incorrere in problemi, probabilmente un ciclo infinito, se 262 00:16:08,560 --> 00:16:09,540 non era fisso che. 263 00:16:09,540 --> 00:16:12,220 Ecco perché stiamo anche parlando sul debug di oggi. 264 00:16:12,220 --> 00:16:13,120 >> OK. 265 00:16:13,120 --> 00:16:15,240 Quindi cerchiamo di eseguire questo programma. 266 00:16:15,240 --> 00:16:21,200 E diciamo in realtà aggiungiamo un printf separato proprio qui che sarà solo la stampa 267 00:16:21,200 --> 00:16:27,480 un'altra linea, poiché questo significa che quando abbiamo eseguire il programma, ci sarà un vuoto 268 00:16:27,480 --> 00:16:31,830 linea tra ogni carattere di ogni argomento della riga di comando. 269 00:16:31,830 --> 00:16:33,448 Beh, vedremo che cosa significa. 270 00:16:33,448 --> 00:16:37,310 271 00:16:37,310 --> 00:16:37,790 Oop. 272 00:16:37,790 --> 00:16:39,870 Hai qualche bug. 273 00:16:39,870 --> 00:16:42,860 Errore implicitamente dichiara funzione di libreria strlen. 274 00:16:42,860 --> 00:16:51,630 >> Quindi, tornando nel nostro programma, ho dimenticato di hash includere string.h. 275 00:16:51,630 --> 00:16:54,240 276 00:16:54,240 --> 00:16:57,730 Così string.h sarà il file di intestazione che dichiara 277 00:16:57,730 --> 00:16:58,980 la funzione strlen. 278 00:16:58,980 --> 00:17:04,650 279 00:17:04,650 --> 00:17:06,060 OK, si compila. 280 00:17:06,060 --> 00:17:09,109 Ora, cerchiamo di eseguirlo. 281 00:17:09,109 --> 00:17:10,930 Quindi, solo questo. 282 00:17:10,930 --> 00:17:17,790 E 'intenzione di stampare la nostra nome del programma, ciao mondo. 283 00:17:17,790 --> 00:17:23,510 Sta andando a stampare ogni cosa, ogni carattere, sulla propria linea. 284 00:17:23,510 --> 00:17:24,540 OK. 285 00:17:24,540 --> 00:17:30,625 >> Quindi cerchiamo di prendere effettivamente questo un ulteriore passo avanti. 286 00:17:30,625 --> 00:17:34,050 287 00:17:34,050 --> 00:17:39,700 E invece di usare string.h, cerchiamo di pensare a come ci piacerebbe implementare la nostra 288 00:17:39,700 --> 00:17:41,420 funzione strlen. 289 00:17:41,420 --> 00:17:45,600 Quindi darò subito una firma di funzione. 290 00:17:45,600 --> 00:17:52,900 Quindi cerchiamo di chiamare in my_strlen, ed è andando a prendere una stringa come argomento, 291 00:17:52,900 --> 00:17:57,220 e ci aspettiamo di restituire il lunghezza della stringa. 292 00:17:57,220 --> 00:18:03,430 Allora, dov'è quel ragazzo? 293 00:18:03,430 --> 00:18:04,990 Sì. 294 00:18:04,990 --> 00:18:06,740 OK. 295 00:18:06,740 --> 00:18:12,900 Quindi ricorda dalla diapositiva precedente che fu anche dalla settimana scorsa, che un 296 00:18:12,900 --> 00:18:18,890 array di caratteri, beh, una stringa, quindi diciamo che questa è la nostra stringa s. 297 00:18:18,890 --> 00:18:29,870 Quindi, se s è la stringa, ciao, allora, H-E-L-L-O, nella memoria, che sta per 298 00:18:29,870 --> 00:18:35,610 essere, e allora questo backslash 0 personaggio. 299 00:18:35,610 --> 00:18:39,170 >> Quindi, come possiamo ottenere la lunghezza di s? 300 00:18:39,170 --> 00:18:43,190 Beh, il trucco è alla ricerca di questo Backlash 0 personaggio, questa nullo 301 00:18:43,190 --> 00:18:44,380 terminatore. 302 00:18:44,380 --> 00:18:50,270 Quindi, l'algoritmo è in corso essere qualcosa come pochi 303 00:18:50,270 --> 00:18:51,510 caratteri sufficienti che - 304 00:18:51,510 --> 00:18:56,180 diamo questa mano rappresentano alcuni contatore, chiamiamolo questa lunghezza int. 305 00:18:56,180 --> 00:19:00,060 Così, partendo da qui, siamo andando per scorrere la nostra stringa. 306 00:19:00,060 --> 00:19:04,100 >> Così il primo carattere, è H, e non è indietro ridurre drasticamente 0, quindi 307 00:19:04,100 --> 00:19:05,170 la lunghezza è 1. 308 00:19:05,170 --> 00:19:08,050 Scorrere al carattere successivo, E, e non è backslash 0. 309 00:19:08,050 --> 00:19:09,630 La lunghezza è 2. 310 00:19:09,630 --> 00:19:10,960 L, 3. 311 00:19:10,960 --> 00:19:11,850 L, 4. 312 00:19:11,850 --> 00:19:13,050 O, 5. 313 00:19:13,050 --> 00:19:16,690 E infine, arriviamo backslash 0, e in modo che i mezzi, bene, 314 00:19:16,690 --> 00:19:17,780 questa stringa è finita. 315 00:19:17,780 --> 00:19:20,130 Quindi torniamo 5. 316 00:19:20,130 --> 00:19:33,630 >> Quindi, in realtà attuazione di tale, in primo luogo, mia lunghezza n è uguale a 0, la mia mano destra. 317 00:19:33,630 --> 00:19:36,088 E stiamo andando a scorrere - 318 00:19:36,088 --> 00:19:38,000 >> SPEAKER 1: [incomprensibile] 319 00:19:38,000 --> 00:19:38,640 >> ROB BODEN: Oh, sparare. 320 00:19:38,640 --> 00:19:39,870 Buona chiamata. 321 00:19:39,870 --> 00:19:42,680 Boom. 322 00:19:42,680 --> 00:19:44,140 Così lunghezza n è uguale a 0. 323 00:19:44,140 --> 00:19:46,910 324 00:19:46,910 --> 00:19:58,310 Così ora, lunghezza, mentre s non uguali, e quindi, backslash 0. 325 00:19:58,310 --> 00:20:04,660 Quindi ricordate, questo backslash 0, si tratta di un carattere effettivo, e indica 326 00:20:04,660 --> 00:20:05,820 la fine della stringa. 327 00:20:05,820 --> 00:20:09,850 Proprio come, anche, backslash n è un carattere effettivo. 328 00:20:09,850 --> 00:20:14,040 Barra rovesciata 0 va ad indicare la fine della nostra stringa. 329 00:20:14,040 --> 00:20:15,414 Non voglio mettere che c'è. 330 00:20:15,414 --> 00:20:19,190 331 00:20:19,190 --> 00:20:25,620 E mentre s indicizzati per lunghezza non è pari al terminatore nullo, 332 00:20:25,620 --> 00:20:27,130 stiamo solo andando a incrementare la lunghezza. 333 00:20:27,130 --> 00:20:29,860 334 00:20:29,860 --> 00:20:34,880 Allora, alla fine del nostro programma, lunghezza è finalmente sta per 335 00:20:34,880 --> 00:20:37,610 5 essere in questo caso. 336 00:20:37,610 --> 00:20:39,210 E dobbiamo solo tornare lunghezza. 337 00:20:39,210 --> 00:20:42,570 338 00:20:42,570 --> 00:20:43,530 >> OK. 339 00:20:43,530 --> 00:20:48,290 Così ora qui, non lo faccio fare my_strlen. 340 00:20:48,290 --> 00:20:50,700 Diciamo compilazione per assicurarsi tutto fila liscio. 341 00:20:50,700 --> 00:20:55,820 342 00:20:55,820 --> 00:20:58,210 Ci facevo in 2? 343 00:20:58,210 --> 00:21:00,565 O era che 1? 344 00:21:00,565 --> 00:21:01,940 Che dovrebbe fare. 345 00:21:01,940 --> 00:21:02,690 Bene. 346 00:21:02,690 --> 00:21:08,490 Quindi questo è argv 2. 347 00:21:08,490 --> 00:21:11,585 Funziona come anticipato, anche se era che quello che ho fatto altrove? 348 00:21:11,585 --> 00:21:15,060 349 00:21:15,060 --> 00:21:15,550 Sì. 350 00:21:15,550 --> 00:21:16,760 OK. 351 00:21:16,760 --> 00:21:21,820 Questa versione di cose non ha avuto la nuova linea printf dopo, ma 352 00:21:21,820 --> 00:21:22,910 non fa alcuna differenza. 353 00:21:22,910 --> 00:21:23,300 OK. 354 00:21:23,300 --> 00:21:25,780 Così ha lavorato come previsto. 355 00:21:25,780 --> 00:21:34,750 >> Ora possiamo anche combinare un passo inoltre, se l'avviso qui, bene, 356 00:21:34,750 --> 00:21:38,920 in primo luogo, stiamo afferrando la strlen di argv i, e poi stiamo iterare su 357 00:21:38,920 --> 00:21:41,450 ogni carattere in quella stringa. 358 00:21:41,450 --> 00:21:47,480 Così, invece di fare che, se noi basta combinare questa logica di attesa 359 00:21:47,480 --> 00:21:50,740 fino a quando ci ha colpito backslash 0 a destra in questo ciclo for? 360 00:21:50,740 --> 00:21:53,740 361 00:21:53,740 --> 00:22:07,490 Quindi scorrere mentre argv i, j fa Non uguale backslash 0. 362 00:22:07,490 --> 00:22:10,680 Quindi cerchiamo di eseguirlo prima. 363 00:22:10,680 --> 00:22:19,838 364 00:22:19,838 --> 00:22:21,180 >> Bene. 365 00:22:21,180 --> 00:22:27,655 Ecco, questa condizione sta dicendo - 366 00:22:27,655 --> 00:22:38,090 367 00:22:38,090 --> 00:22:40,060 cerchiamo di chiarire questo. 368 00:22:40,060 --> 00:22:49,140 Così ora, lasciate che questo sia il nostro argv. 369 00:22:49,140 --> 00:22:55,290 Così, quando ho appena eseguito il programma prima, argv è un array di stringhe. 370 00:22:55,290 --> 00:23:03,100 E così, se corro con dot barra argv 2, ciao mondo, allora il argv 371 00:23:03,100 --> 00:23:07,650 è di per sé lunghezza 3, per argv zero, ciao, e del mondo. 372 00:23:07,650 --> 00:23:11,700 373 00:23:11,700 --> 00:23:19,660 >> E all'interno di ciascuno di questi indici è, di per sé un array, dove questo sarà 374 00:23:19,660 --> 00:23:23,780 dot, questo sarà slash, non so se quella era la direzione giusta, mi 375 00:23:23,780 --> 00:23:25,680 non credo che fosse. 376 00:23:25,680 --> 00:23:30,110 A-R-V dash, bisogno di più spazio. 377 00:23:30,110 --> 00:23:32,570 Tagliamo in questo array. 378 00:23:32,570 --> 00:23:38,230 Dash 0, e quindi backslash 0 A-R-V. 379 00:23:38,230 --> 00:23:43,160 E poi in disordine sarà ciao. 380 00:23:43,160 --> 00:23:45,910 Diciamo, H-E backslash 0. 381 00:23:45,910 --> 00:23:51,130 E, infine, W-O backslash 0. 382 00:23:51,130 --> 00:23:59,730 >> Quindi l'algoritmo che abbiamo appena scritto, il cicli for nidificati, quello che stanno 383 00:23:59,730 --> 00:24:07,321 facendo è, dobbiamo prima l' contrastare i e poi j. 384 00:24:07,321 --> 00:24:15,206 Questo sarebbe più facile con codice a schermo, Torniamo al presente. 385 00:24:15,206 --> 00:24:17,476 OK. 386 00:24:17,476 --> 00:24:24,600 Così notato che i è l'iteratore che è iterare su ogni comando 387 00:24:24,600 --> 00:24:25,610 argomento della riga. 388 00:24:25,610 --> 00:24:28,870 E j è l'iterazione iteratore su ogni personaggio in quella 389 00:24:28,870 --> 00:24:30,410 argomento della riga di comando. 390 00:24:30,410 --> 00:24:46,755 Così che cosa questa printf interno sta facendo è, abbiamo printf argv 0 0, printf 391 00:24:46,755 --> 00:24:58,680 argv 0 1, printf argv 0 2 0 3 0 4 0 5, 0 6, ma ora, argv 0 7 sta per 392 00:24:58,680 --> 00:25:00,670 uguale backslash 0. 393 00:25:00,670 --> 00:25:05,730 >> Allora usciamo che per il ciclo, e ora mi scorre a 1. 394 00:25:05,730 --> 00:25:10,910 E ora stiamo andando a stampa argv 1 0, argv 1 1 - 395 00:25:10,910 --> 00:25:17,040 bene, ora, dal momento che ho tagliato ciao a breve, argv 1 2 è ancora una volta sarà 396 00:25:17,040 --> 00:25:18,170 backslash 0. 397 00:25:18,170 --> 00:25:25,050 E così, incrementare i e continua, e così via, fino a quando stampiamo fuori tutti 398 00:25:25,050 --> 00:25:28,580 mondo, e questi sono tre riga di comando argomenti, e noi usciamo fuori 399 00:25:28,580 --> 00:25:31,670 il ciclo più esterno, e terminare il nostro programma. 400 00:25:31,670 --> 00:25:38,390 401 00:25:38,390 --> 00:25:39,640 OK. 402 00:25:39,640 --> 00:25:43,903 403 00:25:43,903 --> 00:25:46,795 >> Quindi cerchiamo di tornare qui. 404 00:25:46,795 --> 00:25:49,670 405 00:25:49,670 --> 00:25:52,370 Così otterrai una certa familiarità con argomenti della riga di comando su questo 406 00:25:52,370 --> 00:25:54,460 problema particolare set. 407 00:25:54,460 --> 00:25:56,630 >> Ora, debugging. 408 00:25:56,630 --> 00:26:01,680 Quindi, probabilmente avete già avuto a che fare un po 'di debug con il precedente 409 00:26:01,680 --> 00:26:03,120 problema set. 410 00:26:03,120 --> 00:26:08,420 E un modo molto semplice di debugging, in primo luogo, diamo un'occhiata a un programma buggy. 411 00:26:08,420 --> 00:26:20,710 412 00:26:20,710 --> 00:26:23,830 Beh, camminando attraverso questo programma, stiamo andando a chiedere l'utente per un 413 00:26:23,830 --> 00:26:29,350 integer, afferrare quel numero intero, e poi, arbitrariamente, abbiamo un ciclo while che 414 00:26:29,350 --> 00:26:32,280 sta solo andando a diminuire i finché non è uguale a 10. 415 00:26:32,280 --> 00:26:35,820 Diciamo solo supporre sto entrando un numero intero maggiore di 10. 416 00:26:35,820 --> 00:26:38,700 Così decrementare i finché non è uguale a 10. 417 00:26:38,700 --> 00:26:42,630 >> E poi abbiamo un altro ciclo while che, mentre io non è uguale a 0, siamo 418 00:26:42,630 --> 00:26:44,540 andando a diminuire i da 3. 419 00:26:44,540 --> 00:26:49,790 Quindi, se vedete l'intento del bug qui, è che questo sarà diminuire i per 420 00:26:49,790 --> 00:26:57,010 essere di 10, e poi questo ciclo while volontà decremento i 10, a 7, a 4, a 1, 421 00:26:57,010 --> 00:27:02,880 a negativo 2, al negativo 5, e così via, all'infinito negativo, dal momento che i farà 422 00:27:02,880 --> 00:27:05,920 in realtà mai uguale a 0. 423 00:27:05,920 --> 00:27:08,610 E poi alla fine di questo programma, abbiamo la funzione foo che è 424 00:27:08,610 --> 00:27:12,130 in corso di stampa che i. 425 00:27:12,130 --> 00:27:16,520 >> Quindi questo è un programma breve e banale, e il bug è evidente, 426 00:27:16,520 --> 00:27:18,790 soprattutto dopo che ho appena detto quello che il bug è stato. 427 00:27:18,790 --> 00:27:24,840 Ma l'intento è qui, beh, questo potrebbe effettivamente sembrare un po 'del tuo 428 00:27:24,840 --> 00:27:30,040 Le soluzioni da avidi dall'ultimo problema di set, e magari avete 429 00:27:30,040 --> 00:27:32,800 qualche ciclo infinito nel programma, e non avete idea 430 00:27:32,800 --> 00:27:34,100 cosa sta causando. 431 00:27:34,100 --> 00:27:38,690 Quindi una tecnica di debug molto utile è quello di aggiungere solo printfs 432 00:27:38,690 --> 00:27:40,180 tutto il codice. 433 00:27:40,180 --> 00:27:49,200 >> Così qui voglio un printf esterno primo ciclo while. 434 00:27:49,200 --> 00:27:53,155 E qui voglio un printf, e mi limiterò a stampare i. 435 00:27:53,155 --> 00:27:55,670 436 00:27:55,670 --> 00:27:58,330 Io anche fare primo ciclo while, i. 437 00:27:58,330 --> 00:28:05,130 438 00:28:05,130 --> 00:28:09,040 All'esterno, secondo ciclo while. 439 00:28:09,040 --> 00:28:12,170 Ancora una volta, la stampa all'interno di qui, il valore di i. 440 00:28:12,170 --> 00:28:16,270 441 00:28:16,270 --> 00:28:17,520 E corriamo questo. 442 00:28:17,520 --> 00:28:22,620 443 00:28:22,620 --> 00:28:24,800 >> Così dot barra di debug. 444 00:28:24,800 --> 00:28:25,610 Immettere un numero intero. 445 00:28:25,610 --> 00:28:28,150 Facciamo 13. 446 00:28:28,150 --> 00:28:28,760 E boma. 447 00:28:28,760 --> 00:28:33,300 Si vede che siamo loop infinito all'interno del secondo ciclo while. 448 00:28:33,300 --> 00:28:36,305 Così ora sappiamo che cosa il bug è. 449 00:28:36,305 --> 00:28:39,610 450 00:28:39,610 --> 00:28:45,610 Ma printf debug è perfettamente grande, ma una volta che i programmi si 451 00:28:45,610 --> 00:28:50,560 più lunga e complicata, ci sono soluzioni più sofisticate per 452 00:28:50,560 --> 00:28:51,705 far funzionare le cose. 453 00:28:51,705 --> 00:28:52,955 Quindi cerchiamo di rimuovere tutte queste printfs. 454 00:28:52,955 --> 00:29:06,242 455 00:29:06,242 --> 00:29:08,896 E facciamo in modo che non ho rompere nulla. 456 00:29:08,896 --> 00:29:09,850 OK. 457 00:29:09,850 --> 00:29:14,180 >> Così il programma che stiamo andando introdurre si chiama 458 00:29:14,180 --> 00:29:16,715 GDB, per GNU Debugger. 459 00:29:16,715 --> 00:29:21,892 460 00:29:21,892 --> 00:29:27,510 Beh, in realtà, cerchiamo di rimuovere debug per un secondo, e fare di nuovo il debug. 461 00:29:27,510 --> 00:29:31,420 462 00:29:31,420 --> 00:29:34,440 Beh, in realtà in primo luogo, una buona lezione in argomenti della riga di comando. 463 00:29:34,440 --> 00:29:37,780 Si noti che questo comando Clang cioè la compilazione di tutto viene passato 464 00:29:37,780 --> 00:29:41,300 nella riga di comando, questi argomenti della riga di comando. 465 00:29:41,300 --> 00:29:46,250 Quindi, esattamente come si sta andando di utilizzare argomenti della riga di comando, come abbiamo 466 00:29:46,250 --> 00:29:51,500 fatto prima, e come si vedrà in PSET 2, è così che Clang li sta usando. 467 00:29:51,500 --> 00:30:00,070 >> Quindi notare che questa prima bandiera, dash ggdb3, quello che sta dicendo è, Clang, 468 00:30:00,070 --> 00:30:03,790 è necessario compilare questo file con il intento che ci sarà alla fine 469 00:30:03,790 --> 00:30:05,380 necessità di debug. 470 00:30:05,380 --> 00:30:13,840 Quindi, finché si dispone di quella bandiera, allora possiamo GDB debug. 471 00:30:13,840 --> 00:30:17,380 E si aprirà il Debugger GNU. 472 00:30:17,380 --> 00:30:22,920 >> Quindi ci sono un sacco di comandi che è necessario per abituarsi. 473 00:30:22,920 --> 00:30:27,100 In primo luogo quello che probabilmente vi immediatamente bisogno è Run. 474 00:30:27,100 --> 00:30:28,200 Così che cosa è Run intenzione di fare? 475 00:30:28,200 --> 00:30:30,910 E 'intenzione di iniziare il nostro programma. 476 00:30:30,910 --> 00:30:36,180 Quindi eseguire, il programma di partenza, il programma ci chiede per un numero intero, 13. 477 00:30:36,180 --> 00:30:39,170 E poi è loop infinito come previsto, tranne che ho rimosso il 478 00:30:39,170 --> 00:30:40,500 printfs, quindi non abbiamo nemmeno vedere che. 479 00:30:40,500 --> 00:30:43,320 480 00:30:43,320 --> 00:30:44,600 Uscito normalmente. 481 00:30:44,600 --> 00:30:45,850 Oh. 482 00:30:45,850 --> 00:30:48,570 483 00:30:48,570 --> 00:30:53,640 E 'possibile che il tutto avvolto viceversa, torna a - ignorando quello. 484 00:30:53,640 --> 00:30:55,170 Si supponga che non uscire normalmente. 485 00:30:55,170 --> 00:30:59,500 486 00:30:59,500 --> 00:31:03,370 C'è una risposta complicata a questo. 487 00:31:03,370 --> 00:31:07,890 >> Così ora, che non è molto utile. 488 00:31:07,890 --> 00:31:11,480 Quindi, solo in esecuzione il nostro programma interno di questo debugger non ci aiuta in qualsiasi 489 00:31:11,480 --> 00:31:15,610 modo, dal momento che avremmo potuto appena fatto dot ridurre drasticamente il debug da fuori GDB. 490 00:31:15,610 --> 00:31:21,250 Quindi il comando quello che probabilmente vi - 491 00:31:21,250 --> 00:31:22,970 e io smetterò questo. 492 00:31:22,970 --> 00:31:25,850 Control-d o uscire, sia il lavoro. 493 00:31:25,850 --> 00:31:29,550 Quindi cerchiamo di aprire di nuovo. 494 00:31:29,550 --> 00:31:31,130 >> Un altro comando che probabilmente vi vogliono subito 495 00:31:31,130 --> 00:31:33,600 abituarsi è rottura. 496 00:31:33,600 --> 00:31:37,120 Quindi dovremo rompere il principale, per ora, e poi ti spiego che. 497 00:31:37,120 --> 00:31:41,010 498 00:31:41,010 --> 00:31:46,370 Bene, qui vediamo abbiamo impostato un punto di interruzione in questa linea in debug.c. 499 00:31:46,370 --> 00:31:50,160 Così che cosa significa rottura è che quando ho digitare la parola, il programma sta per 500 00:31:50,160 --> 00:31:53,560 continuare a funzionare fino al Mi ha colpito un punto di interruzione. 501 00:31:53,560 --> 00:31:59,390 Così, quando ho colpito esecuzione, il programma si avvia, e poi si rompe appena 502 00:31:59,390 --> 00:32:01,940 entra nella funzione principale. 503 00:32:01,940 --> 00:32:06,930 Rompere principale sta per essere qualcosa è praticamente comunemente fate. 504 00:32:06,930 --> 00:32:11,340 >> E ora, di presentarvi ad alcuni altri comandi. 505 00:32:11,340 --> 00:32:14,330 Si noti qui, che sta dicendo che rotto alla riga 11, che è 506 00:32:14,330 --> 00:32:16,230 printf, immettere un numero intero. 507 00:32:16,230 --> 00:32:21,260 Così il comando successivo sta per essere come andiamo alla successiva riga di codice. 508 00:32:21,260 --> 00:32:24,810 Questo sta per permetterci di passo attraverso il nostro programma riga per riga. 509 00:32:24,810 --> 00:32:26,260 Così la prossima. 510 00:32:26,260 --> 00:32:29,820 >> Ora la linea 12, stiamo andando per ottenere il numero intero. 511 00:32:29,820 --> 00:32:30,450 Avanti. 512 00:32:30,450 --> 00:32:34,290 E se hai appena colpito di nuovo Invio, sarà ripetere l'ultima cosa che hai fatto. 513 00:32:34,290 --> 00:32:36,480 Quindi non ho bisogno di digitare successiva ogni volta. 514 00:32:36,480 --> 00:32:40,100 Quindi, immettere un numero intero, 13. 515 00:32:40,100 --> 00:32:46,940 Così ora, la linea 14, mentre i è maggiore di 10, e farò il prossimo. 516 00:32:46,940 --> 00:32:48,685 E vediamo che stiamo andando a diminuire i. 517 00:32:48,685 --> 00:32:50,210 Quindi stiamo andando a diminuire i. 518 00:32:50,210 --> 00:32:53,620 >> Così ora, un altro utile comando di stampa. 519 00:32:53,620 --> 00:32:55,750 Così Stampa sta per stampare il valore della variabile. 520 00:32:55,750 --> 00:32:57,825 Andiamo a far emergere il valore della variabile i. 521 00:32:57,825 --> 00:32:58,705 Facciamo stampare i. 522 00:32:58,705 --> 00:33:00,910 Sta andando a dire i è 11. 523 00:33:00,910 --> 00:33:03,330 Ora siamo di nuovo Avanti mentre i è maggiore di 10. 524 00:33:03,330 --> 00:33:05,590 Così ho 'ancora maggiore di 10, dal momento che è 11. 525 00:33:05,590 --> 00:33:06,920 i meno meno. 526 00:33:06,920 --> 00:33:08,250 Facciamo stampare i. 527 00:33:08,250 --> 00:33:10,950 Come previsto, è 10. 528 00:33:10,950 --> 00:33:12,510 >> Così ora, dopo. 529 00:33:12,510 --> 00:33:16,250 Sta tornando alla condizione, i è maggiore di 10, ma i è ora 10, così 530 00:33:16,250 --> 00:33:20,040 non è maggiore di 10, quindi ci aspettiamo la caduta fuori dal ciclo while. 531 00:33:20,040 --> 00:33:22,220 E ora siamo sotto quella riga di codice. 532 00:33:22,220 --> 00:33:28,750 E un altro comando, List, è solo andare per visualizzare la precedente e la successiva 533 00:33:28,750 --> 00:33:31,240 paio di linee di codice, in caso hai perso te stesso. 534 00:33:31,240 --> 00:33:35,420 Così abbiamo appena usciti questo ciclo while, e ora siamo entrati in questo 535 00:33:35,420 --> 00:33:37,080 ciclo while, la linea 18. 536 00:33:37,080 --> 00:33:39,860 Così, mentre io non uguale a 0. 537 00:33:39,860 --> 00:33:46,570 E, poi, i è uguale i meno 3, e faremo notare, questo sarà solo andare avanti. 538 00:33:46,570 --> 00:33:48,270 E possiamo stampare i. 539 00:33:48,270 --> 00:33:49,990 >> Ogni comando sorta di ha scorciatoie. 540 00:33:49,990 --> 00:33:51,720 Quindi p è l'abbreviazione di stampa. 541 00:33:51,720 --> 00:33:53,400 Così possiamo p i. 542 00:33:53,400 --> 00:33:57,550 Basta tenere in possesso di n, o continuare a fare Avanti. 543 00:33:57,550 --> 00:33:58,340 Stampare i. 544 00:33:58,340 --> 00:34:00,380 Si vede ora è negativo 167. 545 00:34:00,380 --> 00:34:06,030 Quindi, questo andrà avanti per sempre, ma non davvero per sempre, dal momento che avete appena visto, si 546 00:34:06,030 --> 00:34:09,330 sarà effettivamente finire a un certo punto. 547 00:34:09,330 --> 00:34:15,699 >> Quindi, che sta cominciando GDB. 548 00:34:15,699 --> 00:34:19,504 Ma facciamo una cosa in GDB. 549 00:34:19,504 --> 00:34:20,754 Uh, debug. 550 00:34:20,754 --> 00:34:23,540 551 00:34:23,540 --> 00:34:28,534 Quindi, in questo caso particolare, l' loop infinito capitato di essere all'interno di 552 00:34:28,534 --> 00:34:30,050 la funzione principale. 553 00:34:30,050 --> 00:34:35,779 E per ora, solo accettare il fatto che che sono andando a spostare il ciclo infinito in 554 00:34:35,779 --> 00:34:37,029 la funzione foo. 555 00:34:37,029 --> 00:34:40,679 556 00:34:40,679 --> 00:34:43,730 Basta ricordare che, alla fine di questa programma, beh, questo era in origine 557 00:34:43,730 --> 00:34:46,210 chiamando foo, che era appena andare in stampa i. 558 00:34:46,210 --> 00:34:51,880 Ma ora stiamo chiamando foo, che è andando a decrementare i finché non è 0, e 559 00:34:51,880 --> 00:34:54,548 quindi stampare quella variabile. 560 00:34:54,548 --> 00:34:55,469 OK. 561 00:34:55,469 --> 00:34:57,970 Salva questo. 562 00:34:57,970 --> 00:35:00,175 Effettuare il debug. 563 00:35:00,175 --> 00:35:03,310 E ora, gdb debug. 564 00:35:03,310 --> 00:35:04,090 OK. 565 00:35:04,090 --> 00:35:10,580 >> Quindi, se ho solo correre allora io non ho intenzione di essere in grado di intervenire in realtà attraverso la mia 566 00:35:10,580 --> 00:35:11,730 riga per riga di programma. 567 00:35:11,730 --> 00:35:19,820 Quindi cerchiamo di rompere al principale, e quindi digitare run. 568 00:35:19,820 --> 00:35:28,160 Quindi, passare attraverso questo, printf, immettere un numero intero, ottenere il numero intero, 13. 569 00:35:28,160 --> 00:35:34,180 570 00:35:34,180 --> 00:35:37,490 Quindi stiamo andando a mantenere decremento fino a quando i è maggiore di 10. 571 00:35:37,490 --> 00:35:42,840 Poi stiamo andando a cadere attraverso il ciclo while, e arrivare alla linea - 572 00:35:42,840 --> 00:35:44,364 apriamo in su in una finestra separata. 573 00:35:44,364 --> 00:35:48,720 574 00:35:48,720 --> 00:35:53,300 Così abbiamo decrementando fino a quando non ero più maggiore di 10, e poi 575 00:35:53,300 --> 00:35:55,700 chiamata la funzione foo. 576 00:35:55,700 --> 00:36:01,340 >> Allora cosa è successo appena ho colpito funzione foo, beh, ho chiamato foo, e 577 00:36:01,340 --> 00:36:04,030 allora non ho più avuto il controllo su GDB. 578 00:36:04,030 --> 00:36:10,230 Quindi, non appena mi ha colpito Accanto a questa linea, cose continuarono fino a questo successo, 579 00:36:10,230 --> 00:36:12,400 dove il programma disattivato quando - 580 00:36:12,400 --> 00:36:14,450 assumere non esisteva alla fine. 581 00:36:14,450 --> 00:36:16,390 L'hai visto mettere in pausa per un po 'però. 582 00:36:16,390 --> 00:36:22,040 Allora, perché ho perso il controllo su il programma a quel punto? 583 00:36:22,040 --> 00:36:27,540 Beh, quando digito il prossimo, che va a la riga successiva letterale di codice che 584 00:36:27,540 --> 00:36:28,850 eseguirà. 585 00:36:28,850 --> 00:36:35,950 Così, dopo la linea 21, la riga di codice successiva che verrà eseguito è la linea 22, 586 00:36:35,950 --> 00:36:38,520 che è, uscendo dalla principale. 587 00:36:38,520 --> 00:36:43,810 Quindi io non voglio andare solo alla successiva riga di codice. 588 00:36:43,810 --> 00:36:48,170 Voglio andare nella funzione, foo, e poi una dopo l'altra 589 00:36:48,170 --> 00:36:49,830 quelle righe di codice. 590 00:36:49,830 --> 00:36:53,726 >> Quindi, per questo, abbiamo un'alternativa. 591 00:36:53,726 --> 00:36:56,770 Facciamo uscire di nuovo. 592 00:36:56,770 --> 00:36:58,020 Rompere principale. 593 00:36:58,020 --> 00:37:00,520 594 00:37:00,520 --> 00:37:06,370 Uh, 1, Avanti, Avanti, 13, il prossimo, Avanti, Avanti, con attenzione, 595 00:37:06,370 --> 00:37:09,820 prima di colpire la linea foo. 596 00:37:09,820 --> 00:37:10,520 OK. 597 00:37:10,520 --> 00:37:13,700 >> Così ora, siamo alla riga 21, dove noi chiamiamo foo. 598 00:37:13,700 --> 00:37:17,100 Noi non vogliamo scrivere il prossimo, dal momento che sarà solo chiamare la funzione foo, e 599 00:37:17,100 --> 00:37:18,710 passare alla riga successiva di codice. 600 00:37:18,710 --> 00:37:20,840 Quello che vogliamo usare è Step. 601 00:37:20,840 --> 00:37:25,690 Quindi c'è una differenza tra Passo e Next, dove passo passo sul 602 00:37:25,690 --> 00:37:28,190 funzione, e Next va sulla funzione. 603 00:37:28,190 --> 00:37:32,830 E 'appena esegue la totalità dei la funzione e continua a andare. 604 00:37:32,830 --> 00:37:37,210 >> Così passo sta per portare noi nella funzione, foo. 605 00:37:37,210 --> 00:37:41,160 E vediamo qui, ora, siamo tornati a questo ciclo while che è, in teoria, 606 00:37:41,160 --> 00:37:44,190 intenzione di continuare per sempre. 607 00:37:44,190 --> 00:37:50,420 E se si colpisce Step, quando non è nemmeno una funzione per chiamare, allora è 608 00:37:50,420 --> 00:37:51,720 identico al successivo. 609 00:37:51,720 --> 00:37:55,320 Quindi è solo quando sei in una linea che sta chiamando una funzione che passo 610 00:37:55,320 --> 00:37:56,970 sta per essere diverso dal successivo. 611 00:37:56,970 --> 00:37:57,930 Così Passo ci porterà qui. 612 00:37:57,930 --> 00:38:02,100 Passo, passo, passo, passo, passo, passo, e Dobbiamo solo ciclo infinito per sempre. 613 00:38:02,100 --> 00:38:06,810 >> Così si potrebbe abituare che come vostro modo di identificare cicli infiniti, è 614 00:38:06,810 --> 00:38:08,960 appena premuto questo tasto Invio per vedere dove ti trovi in ​​difficoltà. 615 00:38:08,960 --> 00:38:11,610 616 00:38:11,610 --> 00:38:14,780 Ci sono modi migliori per farlo, ma per ora, che è perfettamente sufficiente. 617 00:38:14,780 --> 00:38:17,967 E stilisticamente, conforme ai Style 50, avrei dovuto fare questo. 618 00:38:17,967 --> 00:38:21,550 619 00:38:21,550 --> 00:38:24,030 OK. 620 00:38:24,030 --> 00:38:28,400 >> Così un ultimo comando per introdurre. 621 00:38:28,400 --> 00:38:30,810 Bene, GDB di debug dentro 622 00:38:30,810 --> 00:38:35,580 Così, invece di rompere a principale, se conoscere la funzione foo è anche il 623 00:38:35,580 --> 00:38:39,230 problema, quindi ho potuto avere solo detto, rompere a foo, invece. 624 00:38:39,230 --> 00:38:42,310 Diciamo che mi rompo a sia principale che foo. 625 00:38:42,310 --> 00:38:45,390 Così si può impostare come molti punti di interruzione come si desidera. 626 00:38:45,390 --> 00:38:49,230 Quando scrivo corsa, sta andando fermarsi al - 627 00:38:49,230 --> 00:38:52,180 ooh, cerchiamo di ricompilare, dal momento che Ho cambiato le cose. 628 00:38:52,180 --> 00:38:55,950 Vedrai questa linea, Warning, fonte il file è più recente eseguibile. 629 00:38:55,950 --> 00:38:59,680 Quindi questo significa che ho appena andato qui e ha cambiato questi per conformarsi a Style 630 00:38:59,680 --> 00:39:03,100 50, ma non ho ricompilare il programma. 631 00:39:03,100 --> 00:39:04,870 Così GDB mi rende consapevole di questo. 632 00:39:04,870 --> 00:39:10,130 Io smetterò, fare di nuovo il debug, colpito gdb debug. 633 00:39:10,130 --> 00:39:10,700 OK. 634 00:39:10,700 --> 00:39:12,800 >> Così ora, torna a quello che stavo facendo. 635 00:39:12,800 --> 00:39:15,720 Rompere principale, pausa foo. 636 00:39:15,720 --> 00:39:20,680 Ora, se faccio funzionare il programma, quindi è intenzione di continuare fino a quando colpisce un 637 00:39:20,680 --> 00:39:21,320 breakpoint. 638 00:39:21,320 --> 00:39:24,680 Questo punto di interruzione succede a essere il primo a principale. 639 00:39:24,680 --> 00:39:28,630 Ora, invece di fare next, next, next, Avanti, Avanti, fino a quando mi ha colpito foo, mi 640 00:39:28,630 --> 00:39:35,230 possibile digitare continuare, che continuerà fino a colpire il successivo punto di interruzione. 641 00:39:35,230 --> 00:39:37,200 Devo inserire il numero intero prima. 642 00:39:37,200 --> 00:39:40,570 Continuare continuerà fino a quando ho colpito il prossimo breakpoint, che è quella 643 00:39:40,570 --> 00:39:43,320 funzione foo. 644 00:39:43,320 --> 00:39:50,130 >> Così Run verrà eseguito fino a colpire un breakpoint, ma è solo la digitazione di esecuzione quando 645 00:39:50,130 --> 00:39:54,060 si sta iniziando il programma, e poi, da allora in poi, è continuare. 646 00:39:54,060 --> 00:40:01,950 Se ho appena fatto rompere principale e poi corse, sarà rompe a 647 00:40:01,950 --> 00:40:03,670 principale, e poi continuare. 648 00:40:03,670 --> 00:40:10,050 Dal momento che non ho un punto di rottura a foo, immettere il numero intero, allora ora sono 649 00:40:10,050 --> 00:40:11,380 non andare a rompere a foo. 650 00:40:11,380 --> 00:40:16,318 E 'solo andando a infinito ciclo finché tale. 651 00:40:16,318 --> 00:40:17,568 OK. 652 00:40:17,568 --> 00:40:19,500 653 00:40:19,500 --> 00:40:24,420 >> Ecco, questo è Intro to GDB. 654 00:40:24,420 --> 00:40:27,790 Si dovrebbe iniziare ad usarlo nei vostri set di problemi. 655 00:40:27,790 --> 00:40:30,550 Può essere molto utile per identificare i bug. 656 00:40:30,550 --> 00:40:35,280 Se effettivamente solo, linea per linea, andate attraverso il codice e confrontare ciò che è 657 00:40:35,280 --> 00:40:39,740 realmente accadendo con quello che vi aspettate accadere, allora è abbastanza 658 00:40:39,740 --> 00:40:41,060 difficile da mancare i bug. 659 00:40:41,060 --> 00:40:45,280 660 00:40:45,280 --> 00:40:46,530 OK. 661 00:40:46,530 --> 00:40:48,310 662 00:40:48,310 --> 00:40:54,040 >> Così la scorsa settimana Davide ha portato questa roba di crittografia a chiave segreta per l' 663 00:40:54,040 --> 00:40:59,350 prima volta, dove non vogliamo password solo essere memorizzati sul nostro 664 00:40:59,350 --> 00:41:03,210 del computer in alcuni file di testo, dove qualcuno può venire e basta 665 00:41:03,210 --> 00:41:04,660 aprirlo e leggere. 666 00:41:04,660 --> 00:41:07,530 Idealmente, sarebbero criptati in qualche modo. 667 00:41:07,530 --> 00:41:13,340 E in Problem Set 2, avrete a che fare con un metodo di crittografia, 668 00:41:13,340 --> 00:41:16,520 o, anche, due metodi, ma essi non sono così grandi. 669 00:41:16,520 --> 00:41:20,050 Se fai l'edizione hacker, sei anche andando a che fare con 670 00:41:20,050 --> 00:41:22,150 decifrare alcune cose. 671 00:41:22,150 --> 00:41:29,770 >> Quindi il problema ora è, bene, anche se abbiamo la crittografia forte 672 00:41:29,770 --> 00:41:34,830 algoritmo nel mondo, se si sceglie un particolarmente povera password, quindi si 673 00:41:34,830 --> 00:41:37,720 non vi aiuterà molto, perché la gente sarà ancora in grado di capirlo. 674 00:41:37,720 --> 00:41:41,530 Anche se vedendo la stringa crittografata e sembra un pasticcio di spazzatura 675 00:41:41,530 --> 00:41:44,760 questo significa nulla per loro, se ancora solo bisogno di provare alcune password 676 00:41:44,760 --> 00:41:50,560 per capirlo, quindi si non sono molto sicuro. 677 00:41:50,560 --> 00:41:55,890 Quindi la visione di un video che rende quel punto. 678 00:41:55,890 --> 00:41:59,587 679 00:41:59,587 --> 00:42:00,970 >> [RIPRODUZIONE VIDEO] 680 00:42:00,970 --> 00:42:02,100 >> -Elmetto, si demonio. 681 00:42:02,100 --> 00:42:03,370 Cosa sta succedendo? 682 00:42:03,370 --> 00:42:05,170 Cosa stai facendo per mia figlia? 683 00:42:05,170 --> 00:42:09,910 >> Me-Permettetemi di introdurre il brillante giovane chirurgo plastico, il dottor Phillip 684 00:42:09,910 --> 00:42:13,730 Schlotkin, il più grande naso uomo di lavoro in tutta la 685 00:42:13,730 --> 00:42:16,080 universo, e Beverly Hills. 686 00:42:16,080 --> 00:42:17,210 >> -Vostra Altezza. 687 00:42:17,210 --> 00:42:18,070 >> -Nose lavoro? 688 00:42:18,070 --> 00:42:18,670 Non capisco. 689 00:42:18,670 --> 00:42:20,090 Ha già avuto un lavoro di naso. 690 00:42:20,090 --> 00:42:21,910 E 'stato un dolce sedici presente. 691 00:42:21,910 --> 00:42:22,140 >> -No. 692 00:42:22,140 --> 00:42:23,690 Non è quello che pensi. 693 00:42:23,690 --> 00:42:25,420 E 'molto, molto peggio. 694 00:42:25,420 --> 00:42:30,300 Se non mi dai la combinazione di lo scudo aereo, Dr. Schlotkin sarà 695 00:42:30,300 --> 00:42:34,226 dare tua figlia il suo vecchio naso. 696 00:42:34,226 --> 00:42:35,476 >> -No. 697 00:42:35,476 --> 00:42:38,712 698 00:42:38,712 --> 00:42:40,516 Dove l'hai preso? 699 00:42:40,516 --> 00:42:41,440 >> -Va bene. 700 00:42:41,440 --> 00:42:42,180 Te lo dico. 701 00:42:42,180 --> 00:42:43,381 Te lo dico. 702 00:42:43,381 --> 00:42:44,263 No, papà. 703 00:42:44,263 --> 00:42:45,590 No, non si deve. 704 00:42:45,590 --> 00:42:46,860 >> -Hai ragione, mia cara. 705 00:42:46,860 --> 00:42:48,450 Mi mancherà il tuo nuovo naso. 706 00:42:48,450 --> 00:42:52,090 Ma io non gli dirò la combinazione, non importa quale. 707 00:42:52,090 --> 00:42:53,680 >> -Molto bene. 708 00:42:53,680 --> 00:42:55,685 Dr. Schlotkin, fare la tua peggiore. 709 00:42:55,685 --> 00:42:56,914 >> -Il piacere è mio. 710 00:42:56,914 --> 00:43:00,690 >> [UTENSILI da affilare] 711 00:43:00,690 --> 00:43:01,910 >> -No. 712 00:43:01,910 --> 00:43:02,520 Aspetta. 713 00:43:02,520 --> 00:43:03,836 Aspetta. 714 00:43:03,836 --> 00:43:05,300 Te lo dico. 715 00:43:05,300 --> 00:43:06,880 Te lo dico. 716 00:43:06,880 --> 00:43:09,130 >> -Sapevo che avrebbe funzionato. 717 00:43:09,130 --> 00:43:09,900 Bene. 718 00:43:09,900 --> 00:43:12,850 Dallo a me. 719 00:43:12,850 --> 00:43:16,918 >> -La combinazione è uno. 720 00:43:16,918 --> 00:43:17,406 >> -One. 721 00:43:17,406 --> 00:43:18,382 >> -One. 722 00:43:18,382 --> 00:43:19,358 >> -Two. 723 00:43:19,358 --> 00:43:19,846 >> -Two. 724 00:43:19,846 --> 00:43:20,822 >> -Two. 725 00:43:20,822 --> 00:43:21,310 >> -Tre. 726 00:43:21,310 --> 00:43:21,798 >> -Tre. 727 00:43:21,798 --> 00:43:22,774 >> -Tre. 728 00:43:22,774 --> 00:43:23,262 >> -Four. 729 00:43:23,262 --> 00:43:23,750 >> -Four. 730 00:43:23,750 --> 00:43:26,150 >> -Four. 731 00:43:26,150 --> 00:43:27,010 >> -Five. 732 00:43:27,010 --> 00:43:27,670 >> -Five. 733 00:43:27,670 --> 00:43:29,010 >> -Five. 734 00:43:29,010 --> 00:43:34,770 >> -Quindi, la combinazione è uno, due, tre, quattro, cinque. 735 00:43:34,770 --> 00:43:37,460 Questa è la combinazione più stupida Io abbia mai sentito in vita mia. 736 00:43:37,460 --> 00:43:39,710 Questo è il genere di cosa che un idiota avrebbe sui suoi bagagli. 737 00:43:39,710 --> 00:43:42,000 >> -Grazie, Altezza. 738 00:43:42,000 --> 00:43:43,530 >> -Che cosa hai fatto? 739 00:43:43,530 --> 00:43:44,490 >> -Ho spento il muro. 740 00:43:44,490 --> 00:43:45,420 >> -No non l'hai fatto. 741 00:43:45,420 --> 00:43:45,840 Si è disattivato l'intero film. 742 00:43:45,840 --> 00:43:46,930 >> -Devo aver premuto il pulsante sbagliato. 743 00:43:46,930 --> 00:43:48,265 >> -Beh, rimetterlo su. 744 00:43:48,265 --> 00:43:49,110 Mettere il filmato su. 745 00:43:49,110 --> 00:43:49,510 >> -Si, signore. 746 00:43:49,510 --> 00:43:49,917 Sì, signore. 747 00:43:49,917 --> 00:43:50,324 >> -Andiamo, Arnold. 748 00:43:50,324 --> 00:43:51,140 Vieni, Gretchen. 749 00:43:51,140 --> 00:43:53,060 Certo, tu sai che io sarò ancora devono fatturare per questo. 750 00:43:53,060 --> 00:43:53,440 >> [END RIPRODUZIONE VIDEO] 751 00:43:53,440 --> 00:43:54,690 >> ROB BODEN: Va bene. 752 00:43:54,690 --> 00:43:59,690 753 00:43:59,690 --> 00:44:08,430 Quindi, ora che stiamo già parlando sicurezza in qualche modo, bello 754 00:44:08,430 --> 00:44:16,050 piccolo manifesto di film, così negli ultimi giorni, questi problemi con la NSA 755 00:44:16,050 --> 00:44:17,300 monitoraggio di tutto. 756 00:44:17,300 --> 00:44:21,840 757 00:44:21,840 --> 00:44:26,930 Può essere difficile da sentire come si avere una sorta di privacy in 758 00:44:26,930 --> 00:44:34,540 mondo online, anche se non ho potuto dire ti maggior parte dei dettagli di Prism. 759 00:44:34,540 --> 00:44:42,130 Quindi, andando oltre PRISM, non stiamo andando a parlare di questo, ora 760 00:44:42,130 --> 00:44:44,030 pensare al vostro portatile. 761 00:44:44,030 --> 00:44:48,360 Quindi qui, voglio cambiare al mio account reale, 762 00:44:48,360 --> 00:44:50,370 con il mio piccolo pinguino. 763 00:44:50,370 --> 00:44:57,310 Così ho impostata una password, e che password è quello che voglio che sia. 764 00:44:57,310 --> 00:45:02,430 >> Ma ricordate che quello che sto registrazione con, quindi questo login 765 00:45:02,430 --> 00:45:04,850 richiesta, è qualche programma. 766 00:45:04,850 --> 00:45:07,910 E 'qualche programma che era scritto da qualche persona. 767 00:45:07,910 --> 00:45:13,250 E così, quella persona, se sono particolarmente dannoso, che potevano 768 00:45:13,250 --> 00:45:17,780 hanno detto, va bene, quindi se la password che ho immesso è uguale al mio 769 00:45:17,780 --> 00:45:22,800 password reale, o è uguale ad alcune password speciale - 770 00:45:22,800 --> 00:45:25,550 David è eccezionale o qualcosa del genere - 771 00:45:25,550 --> 00:45:27,190 poi farli entrare 772 00:45:27,190 --> 00:45:33,760 Quindi un programmatore malintenzionato potrebbe avere accesso a tutti i vostri Mac, o 773 00:45:33,760 --> 00:45:36,150 Finestre, o qualsiasi cosa. 774 00:45:36,150 --> 00:45:41,980 >> Così che non è tanto importante, poiché, Voglio dire, questo è il programma di accesso 775 00:45:41,980 --> 00:45:48,720 che è spedito con OS X, centinaia o migliaia di persone hanno 776 00:45:48,720 --> 00:45:50,020 recensito questo codice. 777 00:45:50,020 --> 00:45:55,330 E così, se, nel codice da qualche parte, si dire se la stringa è uguale uguale 778 00:45:55,330 --> 00:45:58,860 David è eccezionale, login, poi qualcuno è sta per essere, come, attendere. 779 00:45:58,860 --> 00:45:59,800 Questo non è giusto. 780 00:45:59,800 --> 00:46:01,790 Questo non dovrebbe essere qui. 781 00:46:01,790 --> 00:46:06,650 Ecco, questo è un modo otteniamo le cose ad essere di tipo sicuro. 782 00:46:06,650 --> 00:46:10,300 >> Ma pensa anche programmi che si scrive. 783 00:46:10,300 --> 00:46:13,000 Diciamo che avete scritto il programma di login. 784 00:46:13,000 --> 00:46:20,440 Quindi questo programma di login che hai scritto, così ovviamente, sei un buon 785 00:46:20,440 --> 00:46:21,210 programmatore. 786 00:46:21,210 --> 00:46:25,610 Tu non stai andando a mettere qualsiasi dannoso se x è uguale uguale David è impressionante 787 00:46:25,610 --> 00:46:27,860 nel codice. 788 00:46:27,860 --> 00:46:31,930 Ma questo programma, quello che fate utilizzare per compilare questo programma? 789 00:46:31,930 --> 00:46:34,180 Qualcosa di simile Clang. 790 00:46:34,180 --> 00:46:38,460 Quindi, cosa succede se la persona che è accaduto a scrivere Clang speciale alloggiati in Clang 791 00:46:38,460 --> 00:46:44,310 qualcosa di simile, se io sono la compilazione del programma di login, quindi immettere il codice 792 00:46:44,310 --> 00:46:49,720 nel programma di login che dice, se x è uguale uguale David è fantastico? 793 00:46:49,720 --> 00:46:59,890 Quindi non ancora abbastanza, ma abbiamo la stessa emettere qui, dove Clang, bene, 794 00:46:59,890 --> 00:47:03,790 migliaia, se non decine di migliaia di persone, hanno esaminato Clang, hanno 795 00:47:03,790 --> 00:47:07,160 guardato le sue linee di codice e ha detto, tutto bene, non c'è niente di male qui. 796 00:47:07,160 --> 00:47:10,680 Ovviamente, nessuno sta facendo nulla di questo dannoso. 797 00:47:10,680 --> 00:47:15,780 >> Ma ciò che si sta clang, come, cosa succede se compilo Clang? 798 00:47:15,780 --> 00:47:20,900 Cosa succede se ho qualche compilatore che compila Clang che inserisce in Clang 799 00:47:20,900 --> 00:47:25,610 questo hack speciale che dice, va bene, quando compilo Clang, poi il 800 00:47:25,610 --> 00:47:31,290 eseguibile ottengo dovrei appositamente guardare all'interno del programma di login e l'inserto 801 00:47:31,290 --> 00:47:34,230 questa password, uguale uguale Dave è incredibile? 802 00:47:34,230 --> 00:47:37,990 Quindi ricorda che il compilatore stesso deve essere compilato a un certo punto. 803 00:47:37,990 --> 00:47:42,810 Quindi, se ciò che si sceglie di compilare Clang con, è di per sé dannoso, allora si 804 00:47:42,810 --> 00:47:45,580 potrebbe essere avvitata tutta senso giù la linea. 805 00:47:45,580 --> 00:47:49,630 >> Così qui, abbiamo Ken Thompson e Dennis Ritchie. 806 00:47:49,630 --> 00:47:53,780 Quindi questa è una foto iconica. 807 00:47:53,780 --> 00:47:55,470 Dennis Ritchie è sulla destra. 808 00:47:55,470 --> 00:47:58,740 Lui è un grande - 809 00:47:58,740 --> 00:48:03,640 praticamente ha scritto C. Così si può lo ringrazio per questa classe. 810 00:48:03,640 --> 00:48:04,840 Ken Thomson è sulla sinistra. 811 00:48:04,840 --> 00:48:07,780 I due fondamentalmente scritto UNIX. 812 00:48:07,780 --> 00:48:10,140 Beh, erano maggiori contribuenti in UNIX. 813 00:48:10,140 --> 00:48:11,310 Ci sono stati alcuni altri. 814 00:48:11,310 --> 00:48:16,240 Così Ken Thompson, a un certo punto, vince il Premio Turing. 815 00:48:16,240 --> 00:48:20,860 E il premio Turing, ho sempre sentito si fa riferimento in questo modo, è il 816 00:48:20,860 --> 00:48:23,100 Premio Nobel dell'informatica. 817 00:48:23,100 --> 00:48:27,500 >> Così alla Turing Award, deve dare il suo discorso di accettazione. 818 00:48:27,500 --> 00:48:31,790 E lui dà questo molto famoso discorso ora, chiamato Riflessioni sulla Fidarsi 819 00:48:31,790 --> 00:48:35,620 Trust, che abbiamo collegato Per il sito web del corso. 820 00:48:35,620 --> 00:48:41,670 E in questo discorso, egli dice, va bene, così ho scritto UNIX, e ora tutto 821 00:48:41,670 --> 00:48:43,320 si la gente utilizza UNIX. 822 00:48:43,320 --> 00:48:46,960 Ora, ricordate oggi che Linux è un discendente diretto di UNIX. 823 00:48:46,960 --> 00:48:50,140 OS X utilizza direttamente UNIX. 824 00:48:50,140 --> 00:48:53,810 Windows non fa tanto, ma molto delle idee sono state prese da UNIX. 825 00:48:53,810 --> 00:48:59,220 >> Così si sale sul palco e dice: tutto bene, ho scritto UNIX. 826 00:48:59,220 --> 00:49:03,940 E così voi ragazzi sapete, io sono in grado di accedere in ogni 827 00:49:03,940 --> 00:49:05,590 un unico dei computer. 828 00:49:05,590 --> 00:49:14,280 Da quando ho messo uno di questi speciale se x uguale uguale Ken Thomson è impressionante, 829 00:49:14,280 --> 00:49:16,350 allora io sono autorizzato a effettuare il login. 830 00:49:16,350 --> 00:49:18,370 Quindi le persone sono come, bene, come hai fatto? 831 00:49:18,370 --> 00:49:21,090 Abbiamo guardato il programma login e nulla c'è. 832 00:49:21,090 --> 00:49:24,700 E 'come, beh, ho modificato il compilatore per accedere al programma di login 833 00:49:24,700 --> 00:49:30,490 in modo che il programma login adesso dovrà che x è uguale uguale a Ken Thompson 834 00:49:30,490 --> 00:49:31,700 è impressionante. 835 00:49:31,700 --> 00:49:33,120 >> E dicono, beh, questo non è vero. 836 00:49:33,120 --> 00:49:35,740 Stiamo guardando il compilatore e il compilatore non ha linee di 837 00:49:35,740 --> 00:49:36,400 codice come tale. 838 00:49:36,400 --> 00:49:40,540 E 'come, OK, ma quello che sono compilazione del compilatore con? 839 00:49:40,540 --> 00:49:44,810 E pensano, e lui è, come, beh, Sono quello che ti ha dato il compilatore 840 00:49:44,810 --> 00:49:50,580 si utilizza per compilare il compilatore, in modo si sta compilando un compilatore, che 841 00:49:50,580 --> 00:49:56,390 è di per sé dannoso, e rompere il programma login. 842 00:49:56,390 --> 00:49:59,360 Quindi, in pratica, a quel punto, c'è nessun modo si poteva guardare alla fonte 843 00:49:59,360 --> 00:50:02,450 codice del programma di accesso per vedere ciò che è sbagliato. 844 00:50:02,450 --> 00:50:04,220 Non si poteva nemmeno guardare in codice sorgente del compilatore 845 00:50:04,220 --> 00:50:06,790 per vedere ciò che è sbagliato. 846 00:50:06,790 --> 00:50:11,940 >> Si avrebbe bisogno di guardare la macchina codice, il binario effettiva del 847 00:50:11,940 --> 00:50:16,760 compilatore compilato a vedere, aspettare, questi righe di codice non dovrebbero essere qui. 848 00:50:16,760 --> 00:50:22,130 Ma Ken Thompson ha preso un passo oltre e ha detto, beh, ci sono 849 00:50:22,130 --> 00:50:25,980 questi programmi speciali che in realtà aiutano a leggere il binario di programmi, 850 00:50:25,980 --> 00:50:29,340 e quindi se qualcuno ha utilizzato quel programma per leggere il binario, che avrebbero visto questi 851 00:50:29,340 --> 00:50:30,490 righe di codice. 852 00:50:30,490 --> 00:50:34,020 Ha modificato i programmi da dire, tutti a destra, se stai guardando il 853 00:50:34,020 --> 00:50:38,460 compilatore, non mostrano questo particolare insieme di binario. 854 00:50:38,460 --> 00:50:42,830 >> Allora avete bisogno di prendere che un passo ulteriormente e sostanzialmente, che potrebbe avere 855 00:50:42,830 --> 00:50:46,210 prese livelli multipli di indirezione, e ad un certo punto, nessuno in realtà 856 00:50:46,210 --> 00:50:47,990 andando a controllare. 857 00:50:47,990 --> 00:50:52,590 Quindi la morale della storia è, sei non andare di scrivere 858 00:50:52,590 --> 00:50:54,340 Clang in questa classe. 859 00:50:54,340 --> 00:50:57,020 Hai intenzione di utilizzare l'arrampicata Clang molto in questa classe. 860 00:50:57,020 --> 00:51:00,490 Per tutti sapete, Clang è un maligno programma che sta sabotando ogni 861 00:51:00,490 --> 00:51:03,520 unico programma hai mai compilato. 862 00:51:03,520 --> 00:51:08,206 E per lasciare su quel molto inquietante nota, ci vediamo il Mercoledì. 863 00:51:08,206 --> 00:51:10,030 >> [Applausi] 864 00:51:10,030 --> 00:51:12,935 >> SPEAKER 2: Alla prossima CS50. 865 00:51:12,935 --> 00:51:14,580 >> SPEAKER 3: Non ti azzardare a dire che. 866 00:51:14,580 --> 00:51:15,930 Si può fare questo. 867 00:51:15,930 --> 00:51:19,440 Hai fatto questo prima, si può fare questo Oggi, si può fare domani. 868 00:51:19,440 --> 00:51:20,930 Hai fatto questo per anni. 869 00:51:20,930 --> 00:51:22,790 Basta andare lì e farlo. 870 00:51:22,790 --> 00:51:24,310 Si può fare questo. 871 00:51:24,310 --> 00:51:26,102 >> [GIOCO MUSICA]