1 00:00:00,000 --> 00:00:06,180 2 00:00:06,180 --> 00:00:07,820 >> JASON HIRSCHHORN: Benvenuto A5, tutti. 3 00:00:07,820 --> 00:00:11,270 Abbiamo una settimana emozionante davanti a noi, soprattutto perché ci sono così tanti nuovi 4 00:00:11,270 --> 00:00:12,350 volti in questa stanza. 5 00:00:12,350 --> 00:00:12,920 E 'meraviglioso. 6 00:00:12,920 --> 00:00:15,740 Molti di voi sono qui per caso, che è ancora meglio. 7 00:00:15,740 --> 00:00:18,220 Quindi spero che manterrai unirsi a noi. 8 00:00:18,220 --> 00:00:20,220 >> Questa settimana andremo a spendere la maggior parte di sezione 9 00:00:20,220 --> 00:00:21,870 preparazione per il quiz. 10 00:00:21,870 --> 00:00:26,580 Quindi per la nostra agenda, stiamo andando a parlare un po 'di risorse per la classe, 11 00:00:26,580 --> 00:00:30,350 ma anche per il quiz, e poi, di nuovo, trascorrere la maggior parte della classe di parlare 12 00:00:30,350 --> 00:00:31,390 su domande. 13 00:00:31,390 --> 00:00:33,900 Una volta che abbiamo finito di rispondere alla tua domande, o se le vostre domande 14 00:00:33,900 --> 00:00:39,010 naturalmente ci portano a qualche codifica, mi avere problemi di esempio dal midterms 15 00:00:39,010 --> 00:00:43,180 passato che ci codificare in tempo reale nella sezione insieme che portano anche qualche altro 16 00:00:43,180 --> 00:00:45,420 argomenti buoni per coprire. 17 00:00:45,420 --> 00:00:48,280 >> Quindi, in primo luogo, come abbiamo passato per la ultime due settimane per ricordare 18 00:00:48,280 --> 00:00:51,700 ragazzi, ci sono un sacco di risorse disponibili per questo corso. 19 00:00:51,700 --> 00:00:55,020 Molti di loro saranno incredibilmente disponibile a voi come si continua a 20 00:00:55,020 --> 00:00:57,280 studiare per quiz 0, perché è Martedì pomeriggio. 21 00:00:57,280 --> 00:00:59,630 Quindi tutti voi sono stati studiare per un po '. 22 00:00:59,630 --> 00:01:02,640 >> Ci sono dispense e fonte codice che si dovrebbe 23 00:01:02,640 --> 00:01:04,050 sicuramente check out. 24 00:01:04,050 --> 00:01:05,019 Guarda i pantaloncini. 25 00:01:05,019 --> 00:01:07,470 Scopri study.cs50.net. 26 00:01:07,470 --> 00:01:11,770 E poi, di seguito elencati, un numero di altre risorse. 27 00:01:11,770 --> 00:01:14,020 >> Ancora una volta, quiz 0 è domani alle 01:00. 28 00:01:14,020 --> 00:01:18,230 Se non è stato già fatto, controllare il proposito di quiz 0 documento sul 29 00:01:18,230 --> 00:01:21,370 homepage del corso per capire dove si sta prendendo il quiz. 30 00:01:21,370 --> 00:01:25,770 Il quiz inizia alle 01:10 e termina 70 minuti più tardi. 31 00:01:25,770 --> 00:01:29,610 Quindi, se ti presenti dopo 01:10, siete andando ad ottenere che molti meno minuti 32 00:01:29,610 --> 00:01:30,940 oltre il 70 per prendere il quiz. 33 00:01:30,940 --> 00:01:33,570 Quindi assicuratevi che ci sei in tempo. 34 00:01:33,570 --> 00:01:38,690 Se sei uno studente di estensione o di avere alcune altre considerazioni di prova, essa 35 00:01:38,690 --> 00:01:40,400 potrebbe non essere a 1:00 di domani. 36 00:01:40,400 --> 00:01:43,540 Ma ancora una volta, controllare il proposito di quiz 0 documento per assicurarsi di sapere quando 37 00:01:43,540 --> 00:01:44,760 si sta prendendo il quiz. 38 00:01:44,760 --> 00:01:46,440 Ho scritto 75 minuti qui. 39 00:01:46,440 --> 00:01:48,580 Penso che sia giusto, non 70. 40 00:01:48,580 --> 00:01:53,420 >> Esso copre tutto il materiale da una settimana 0 alla conferenza della scorsa settimana il Mercoledì. 41 00:01:53,420 --> 00:01:59,350 E ancora, per questo quiz, a che documento, si ottiene uno su due lati e 8 42 00:01:59,350 --> 00:02:03,770 1/2 da 11 fogli di carta che si ottiene da utilizzare come appunti durante il quiz. 43 00:02:03,770 --> 00:02:08,570 Molte persone, se non la maggior parte delle persone, hanno scoperto che il modo più utile un'unica 44 00:02:08,570 --> 00:02:11,970 a studiare per il quiz è di fare un foglio di studio, un 45 00:02:11,970 --> 00:02:13,730 uno-sider, di loro. 46 00:02:13,730 --> 00:02:17,710 Quindi, guardare a quelle passate, se hai visto quelle passate. 47 00:02:17,710 --> 00:02:19,960 Entrare in contatto con gli amici per vedere cosa stanno mettendo a loro. 48 00:02:19,960 --> 00:02:23,610 >> Ma le mani verso il basso, il modo migliore è possibile studio è quello di passare attraverso tutto e 49 00:02:23,610 --> 00:02:26,530 whittle giù a ciò che dovrebbe o deve non fanno parte su tale foglio di 50 00:02:26,530 --> 00:02:30,570 carta, perché è solo una realtà modo utile per voi per assicurarsi 51 00:02:30,570 --> 00:02:33,620 stai passando tutto e avere una certa familiarità con esso. 52 00:02:33,620 --> 00:02:36,690 La maggior parte delle persone, si trovano, anche se hanno il foglio di carta seduto proprio 53 00:02:36,690 --> 00:02:39,840 accanto a loro il quiz, non girare ad esso, perché, ancora una volta, che molto 54 00:02:39,840 --> 00:02:43,290 processo di passare attraverso le informazioni li ha aiutati a imparare. 55 00:02:43,290 --> 00:02:45,370 >> Qualcuno ha domande su quiz 0? 56 00:02:45,370 --> 00:02:50,120 57 00:02:50,120 --> 00:02:51,450 Ha tutti - 58 00:02:51,450 --> 00:02:53,230 Non ho intenzione di fare per alzata di mano. 59 00:02:53,230 --> 00:02:53,550 Si figuri. 60 00:02:53,550 --> 00:02:54,790 Stavo per chiedere chi iniziato a studiare. 61 00:02:54,790 --> 00:02:58,360 Ma io non voglio farti non tutti di alzare le mani. 62 00:02:58,360 --> 00:03:01,290 Così come ho detto - sì, Avi, andare avanti. 63 00:03:01,290 --> 00:03:04,205 >> AVI: Quale sarebbe una cosa utile di mettere sul one-pager? 64 00:03:04,205 --> 00:03:05,875 >> STUDENTE: Ecco a voi. 65 00:03:05,875 --> 00:03:08,210 >> JASON HIRSCHHORN: Si ottiene per utilizzare il vostro giudizio. 66 00:03:08,210 --> 00:03:13,220 Cose utili da mettere in un pager, se siete confusi circa la grande O 67 00:03:13,220 --> 00:03:17,510 tempo di esecuzione di diversi tipi di ricerca e sorta, che mettono in là in un 68 00:03:17,510 --> 00:03:18,760 a portata di mano chart damerino. 69 00:03:18,760 --> 00:03:22,250 In questo modo, se ti viene chiesto che il quiz, non è necessario cercare di figura 70 00:03:22,250 --> 00:03:23,560 fuori o ragione attraverso il runtime. 71 00:03:23,560 --> 00:03:24,730 Si può semplicemente copiare il basso. 72 00:03:24,730 --> 00:03:28,320 Se si guarda al quiz passato, un sacco di volte, ci sta funzionando questioni di tempo. 73 00:03:28,320 --> 00:03:34,150 Quindi sarebbe un esempio di un buon cosa mettere sul vostro one-pager. 74 00:03:34,150 --> 00:03:37,450 >> Altre cose buone da mettere su, se siete confuso su come dichiarare un 75 00:03:37,450 --> 00:03:40,570 funzione o quanto le varie parti la dichiarazione di funzione sono, scrivere 76 00:03:40,570 --> 00:03:43,400 che lì, una versione generica e poi magari un esempio. 77 00:03:43,400 --> 00:03:47,290 Se siete confusi su puntatori, un diagramma di come puntatori lavoro 78 00:03:47,290 --> 00:03:48,660 Probabilmente davvero utile. 79 00:03:48,660 --> 00:03:52,440 Se siete confusi su ricorsione, un Campione funzione ricorsiva in là 80 00:03:52,440 --> 00:03:54,980 potrebbe anche rivelarsi davvero utile. 81 00:03:54,980 --> 00:03:57,290 Ritiene che vi darà qualche idea? 82 00:03:57,290 --> 00:04:01,820 >> AVI: è necessario comprendere la intero processo di compilazione, come 83 00:04:01,820 --> 00:04:03,220 come che tutte le opere? 84 00:04:03,220 --> 00:04:06,620 >> JASON HIRSCHHORN: Everything che è stato coperto potrebbe 85 00:04:06,620 --> 00:04:08,060 presentarsi sul quiz. 86 00:04:08,060 --> 00:04:08,930 Domande - 87 00:04:08,930 --> 00:04:11,300 ma ancora una volta, alcune cose saranno ponderati pesantemente di altri. 88 00:04:11,300 --> 00:04:14,330 Alcune cose sono venuti di nuovo e ancora in classe, in 89 00:04:14,330 --> 00:04:15,590 lezione, e la sezione. 90 00:04:15,590 --> 00:04:17,220 Altre cose non hanno venire spesso. 91 00:04:17,220 --> 00:04:22,900 >> Abbiamo parlato molto di # include e Qualcosa-l e ciò significa quelle in 92 00:04:22,900 --> 00:04:24,390 il processo di compilazione. 93 00:04:24,390 --> 00:04:29,120 Abbiamo parlato molto di GDB, aggrapparsi, queste diverse bandiere che usiamo quando 94 00:04:29,120 --> 00:04:33,100 compiliamo qualcosa, e che cosa make15, per esempio, molto 95 00:04:33,100 --> 00:04:34,510 mezzi e lo fa davvero. 96 00:04:34,510 --> 00:04:38,110 Non abbiamo parla tanto di ogni singola fase 97 00:04:38,110 --> 00:04:39,240 il processo di compilazione. 98 00:04:39,240 --> 00:04:40,410 Abbiamo ancora parlato. 99 00:04:40,410 --> 00:04:42,550 Quindi è ancora qualcosa che si dovrebbe essere a conoscenza. 100 00:04:42,550 --> 00:04:44,610 Ma ancora una volta, non stiamo andando ad essere - 101 00:04:44,610 --> 00:04:49,140 cose che vengono più spesso in classe sono più propensi a venire più 102 00:04:49,140 --> 00:04:52,495 spesso e più pesante ponderati sul quiz. 103 00:04:52,495 --> 00:04:53,280 >> Freddo. 104 00:04:53,280 --> 00:04:54,580 Tutte le altre domande circa quiz 0? 105 00:04:54,580 --> 00:04:57,660 106 00:04:57,660 --> 00:05:00,050 >> Ok, così ho messo una lista di argomenti sulla scheda. 107 00:05:00,050 --> 00:05:01,550 Sono andato attraverso il programma. 108 00:05:01,550 --> 00:05:07,340 Sono andato attraverso la sezione recensione della la scorsa notte e quelle diapositive a venire 109 00:05:07,340 --> 00:05:13,710 con un elenco non esaustivo di temi che abbiamo coperto finora in CS50 110 00:05:13,710 --> 00:05:16,800 e le cose che potrebbero apparire sul quiz. 111 00:05:16,800 --> 00:05:19,900 Quindi io non ho intenzione di passare attraverso ognuno di questi. 112 00:05:19,900 --> 00:05:22,370 Che avrebbe preso molto di più tempo di quello che abbiamo ora. 113 00:05:22,370 --> 00:05:26,880 Ma ho messo questo qui si spera di jog la memoria da cose che possono 114 00:05:26,880 --> 00:05:28,420 o potrebbe non essere così familiarità con voi. 115 00:05:28,420 --> 00:05:32,850 >> E mi piacerebbe trascorrere la maggior parte del sezione di rispondere alle vostre domande su 116 00:05:32,850 --> 00:05:35,130 Questi temi, argomenti che non sono coperti qui. 117 00:05:35,130 --> 00:05:36,130 Possiamo scrivere pseudo codice. 118 00:05:36,130 --> 00:05:40,010 Siamo in grado di scrivere il codice vero e proprio per garantire che - 119 00:05:40,010 --> 00:05:44,280 Posso rispondere alla tua domanda e aiuto tutti fondamentalmente capire un 120 00:05:44,280 --> 00:05:48,330 Molti di questi argomenti così vi sentirete preparato e comodo andare in 121 00:05:48,330 --> 00:05:50,150 domani quiz. 122 00:05:50,150 --> 00:05:52,300 Quindi, leggere sopra l'elenco. 123 00:05:52,300 --> 00:05:54,780 Si spera venuti alla sezione con alcune domande pure. 124 00:05:54,780 --> 00:05:58,480 Quando sei pronto, alzare la mano e noi cominciamo. 125 00:05:58,480 --> 00:06:01,590 126 00:06:01,590 --> 00:06:05,200 >> Tenete a mente, le domande che hanno, non ci sono domande stupide. 127 00:06:05,200 --> 00:06:06,250 Abbiamo sentito che un sacco. 128 00:06:06,250 --> 00:06:09,490 E le domande che avete, io sono disposto a scommettere, molte altre persone, sia 129 00:06:09,490 --> 00:06:11,740 seduto qui e guardare linea avere pure. 130 00:06:11,740 --> 00:06:13,770 Così si può solo aiutare le persone facendo domande. 131 00:06:13,770 --> 00:06:15,070 Marcus. 132 00:06:15,070 --> 00:06:18,040 >> MARCUS: Tra stack e il mucchio, c'è un pre-assegnati 133 00:06:18,040 --> 00:06:22,880 percentuale di memoria che è definita come questo è per lo stack o per mucchio? 134 00:06:22,880 --> 00:06:25,010 Oppure, come funziona, esattamente? 135 00:06:25,010 --> 00:06:26,230 >> JASON HIRSCHHORN: Ottima domanda. 136 00:06:26,230 --> 00:06:28,640 Ho intenzione di tornare tracciare un po '. 137 00:06:28,640 --> 00:06:30,910 Fa tutti - 138 00:06:30,910 --> 00:06:31,660 si prega di essere onesti qui. 139 00:06:31,660 --> 00:06:34,130 So che ti sto chiedendo di alzare la mano davanti ai vostri coetanei. 140 00:06:34,130 --> 00:06:38,510 Ma ci sono persone che si sentono disagio con lo stack e heap 141 00:06:38,510 --> 00:06:42,980 e vorrei andare oltre che e che quelli significa? 142 00:06:42,980 --> 00:06:43,880 Alzi la mano chi - 143 00:06:43,880 --> 00:06:44,420 OK. 144 00:06:44,420 --> 00:06:45,120 Grazie. 145 00:06:45,120 --> 00:06:48,420 Quindi stiamo per andare oltre lo stack e l'heap molto velocemente e poi 146 00:06:48,420 --> 00:06:50,370 entrare nel rispondere alla tua domanda. 147 00:06:50,370 --> 00:06:58,250 >> Quindi se tracciamo una scatola di rappresentare la memoria del computer, quali sono alcuni 148 00:06:58,250 --> 00:07:02,160 cose che vanno in questa scatola? 149 00:07:02,160 --> 00:07:03,630 Principale. 150 00:07:03,630 --> 00:07:04,020 Una funzione principale. 151 00:07:04,020 --> 00:07:05,890 Dove va a finire principale? 152 00:07:05,890 --> 00:07:08,090 >> STUDENTE: [incomprensibile]. 153 00:07:08,090 --> 00:07:09,390 >> JASON HIRSCHHORN: Così faremo mettere principale qui. 154 00:07:09,390 --> 00:07:12,180 155 00:07:12,180 --> 00:07:13,430 Cos'altro va in questa scatola? 156 00:07:13,430 --> 00:07:16,000 157 00:07:16,000 --> 00:07:18,140 >> STUDENTE: Le funzioni che si chiama. 158 00:07:18,140 --> 00:07:19,020 >> JASON Hirschhorn: Le funzioni che chiamiamo. 159 00:07:19,020 --> 00:07:20,440 E dove vanno? 160 00:07:20,440 --> 00:07:21,300 >> STUDENTE: Nel stack. 161 00:07:21,300 --> 00:07:22,380 >> JASON HIRSCHHORN: Si andare in pila. 162 00:07:22,380 --> 00:07:27,350 Quindi stiamo andando a chiamare questo cosa quaggiù lo stack. 163 00:07:27,350 --> 00:07:31,880 E in alto, abbiamo l'heap. 164 00:07:31,880 --> 00:07:35,450 Così la memoria non è un contenitore, proprio come questo. 165 00:07:35,450 --> 00:07:37,330 Ma in realtà è piuttosto simile. 166 00:07:37,330 --> 00:07:40,840 Sta andando essere un sacco di scatole su e oltre, a seconda di quanto è grande il tuo 167 00:07:40,840 --> 00:07:43,730 computer è o quanto è grande la vostra memoria è. 168 00:07:43,730 --> 00:07:46,950 >> A quote-unquote "bottom" è la pila. 169 00:07:46,950 --> 00:07:50,880 E ci sono più cose che vanno in pila. 170 00:07:50,880 --> 00:07:53,840 E quelli dipendono dalle funzioni avete nel vostro codice. 171 00:07:53,840 --> 00:07:57,780 Si ha sempre una funzione nella vostra codice chiamato principale, quindi c'è sempre un 172 00:07:57,780 --> 00:08:00,480 sezione qui nella impilare dedicato alla principale. 173 00:08:00,480 --> 00:08:03,980 >> Queste sezioni nello stack sono chiamati stack frame. 174 00:08:03,980 --> 00:08:09,580 Quando si chiama un'altra funzione, diciamo principale chiama una funzione di ricerca binaria, 175 00:08:09,580 --> 00:08:11,075 abbiamo messo un altro frame nello stack. 176 00:08:11,075 --> 00:08:13,830 177 00:08:13,830 --> 00:08:17,320 Più in particolare, ci accingiamo a donare un pezzo di memoria sul nostro 178 00:08:17,320 --> 00:08:22,960 computer per memorizzare ricerca binaria del locale variabili e di eseguire il binario 179 00:08:22,960 --> 00:08:24,150 codice di ricerca. 180 00:08:24,150 --> 00:08:26,810 >> Così chiamiamo la ricerca binaria. 181 00:08:26,810 --> 00:08:30,440 182 00:08:30,440 --> 00:08:33,340 In questo pezzo di memoria, stiamo andando per memorizzare le sue variabili locali. 183 00:08:33,340 --> 00:08:35,270 Stiamo per archiviare i propri chiamate printf. 184 00:08:35,270 --> 00:08:38,159 Qualunque cosa accada, che la funzione è andando ad essere conservato proprio lì. 185 00:08:38,159 --> 00:08:40,350 Ricerca binaria sta per eseguire. 186 00:08:40,350 --> 00:08:42,210 Si sta per completare l'esecuzione. 187 00:08:42,210 --> 00:08:47,450 Qual è la parola in C che significa che una funzione deve 188 00:08:47,450 --> 00:08:49,306 completare la sua esecuzione? 189 00:08:49,306 --> 00:08:50,040 >> STUDENTE: Return. 190 00:08:50,040 --> 00:08:50,870 >> JASON HIRSCHHORN: di ritorno. 191 00:08:50,870 --> 00:08:53,230 Così ogni volta che vedete una dichiarazione di ritorno, le estremità funzionali 192 00:08:53,230 --> 00:08:54,350 quando colpisce che. 193 00:08:54,350 --> 00:08:56,740 Ricerca in modo binario colpirà il suo ritorno. 194 00:08:56,740 --> 00:09:01,360 Questa parte della memoria sarà essenzialmente essere liberato. 195 00:09:01,360 --> 00:09:03,510 Ed principale tornerà esecuzione. 196 00:09:03,510 --> 00:09:07,240 Quindi principale andrà in pausa, ovunque fosse, chiamata ricerca binaria, ottenere qualche valore di ritorno, 197 00:09:07,240 --> 00:09:08,700 e continuare l'esecuzione. 198 00:09:08,700 --> 00:09:10,840 Questo stack frame andrà via. 199 00:09:10,840 --> 00:09:14,810 >> Se chiamiamo una funzione ricorsiva, che è una funzione che si chiama over 200 00:09:14,810 --> 00:09:18,480 e oltre, potremmo ottenere - diciamo ha fatto ricerca binaria in modo ricorsivo. 201 00:09:18,480 --> 00:09:21,520 Potremmo ottenere la ricerca binaria versione uno, ricerca binaria due, ricerca binaria 202 00:09:21,520 --> 00:09:24,090 tre, ricerca binaria quattro, ricerca binaria cinque. 203 00:09:24,090 --> 00:09:27,950 E poi questa finale ricerca binaria cinque colpirà il caso base, e lo stack 204 00:09:27,950 --> 00:09:31,010 cornici andrà indietro e mantenere la chiusura fino a quando torniamo a principale. 205 00:09:31,010 --> 00:09:32,530 Siamo in grado di andare oltre la ricorsione in un po '. 206 00:09:32,530 --> 00:09:35,530 Ma tutto questo è da dire, se siete chiamando più funzioni contemporaneamente, 207 00:09:35,530 --> 00:09:39,250 ci sarà pila multipla frame nello stack. 208 00:09:39,250 --> 00:09:42,900 >> Il mucchio, d'altra parte, fino qui, non è per funzioni, 209 00:09:42,900 --> 00:09:44,380 non per le variabili locali. 210 00:09:44,380 --> 00:09:48,920 E 'per allocata dinamicamente variabili. 211 00:09:48,920 --> 00:09:57,210 Quindi questi sono variabili che possono essere inizializzato sia principale o un 212 00:09:57,210 --> 00:09:58,640 funzione che chiama principali. 213 00:09:58,640 --> 00:10:00,790 Ovunque nel codice, che può essere inizializzato. 214 00:10:00,790 --> 00:10:04,360 E per inizializzare un dinamico variabile assegnata. 215 00:10:04,360 --> 00:10:06,970 Quale funzione in C usiamo? 216 00:10:06,970 --> 00:10:07,600 >> STUDENTE: Malloc. 217 00:10:07,600 --> 00:10:09,240 >> JASON HIRSCHHORN: Malloc. 218 00:10:09,240 --> 00:10:10,800 Si chiama malloc. 219 00:10:10,800 --> 00:10:12,260 Si ottiene uno spazio di memoria. 220 00:10:12,260 --> 00:10:15,020 E che lo spazio di memoria è sul mucchio. 221 00:10:15,020 --> 00:10:18,840 E quello spazio di memoria rimane lì finché non si chiama libero. 222 00:10:18,840 --> 00:10:22,670 >> Così variabili allocate dinamicamente in esisterà heap per tutto il tempo che 223 00:10:22,670 --> 00:10:25,250 vogliono loro di esistere, e non lo faranno andare via fino a quando non esplicitamente 224 00:10:25,250 --> 00:10:26,760 dire loro di andare via. 225 00:10:26,760 --> 00:10:29,670 È possibile creare in una funzione. 226 00:10:29,670 --> 00:10:31,930 Stack di tale funzione telaio andrà via. 227 00:10:31,930 --> 00:10:35,490 Ma la variabile esisterà ancora nel mucchio finché non viene liberato, 228 00:10:35,490 --> 00:10:39,650 potenzialmente dalla funzione che ha chiamato ricerca binaria o qualsiasi altra cosa. 229 00:10:39,650 --> 00:10:42,580 >> Quindi queste variabili heap rimanere lì per tutto il tempo che vuoi 230 00:10:42,580 --> 00:10:43,490 loro di rimanere lì. 231 00:10:43,490 --> 00:10:46,090 E ottengono messo qui. 232 00:10:46,090 --> 00:10:47,450 E poi quella successiva viene messo lì. 233 00:10:47,450 --> 00:10:50,210 Tengono sempre compilato, e rimanere lì fino a quando si chiama libero. 234 00:10:50,210 --> 00:10:52,870 >> E in sostanza, l'heap e stack, arrivare alla domanda di Marcus, 235 00:10:52,870 --> 00:10:54,500 crescere verso l'altro. 236 00:10:54,500 --> 00:10:57,730 E se corrono l'uno nell'altro, hai utilizzata tutta la memoria nel vostro 237 00:10:57,730 --> 00:11:01,330 computer e il programma si chiuderà perché non si dispone di più memoria 238 00:11:01,330 --> 00:11:02,420 lasciato da usare. 239 00:11:02,420 --> 00:11:07,290 Tra questi, ci sono potenzialmente altre cose. 240 00:11:07,290 --> 00:11:10,980 Ma per lo scopo di questo corso, non c'è bisogno di preoccuparsi di questo. 241 00:11:10,980 --> 00:11:12,020 >> Quindi era la risposta alla tua domanda. 242 00:11:12,020 --> 00:11:13,520 Non si preoccupi. 243 00:11:13,520 --> 00:11:15,550 Ma quella era la risposta lunga. 244 00:11:15,550 --> 00:11:17,800 Tutto quello che devi sapere è la heap e lo stack sarà - 245 00:11:17,800 --> 00:11:18,900 si inizia nella parte inferiore. 246 00:11:18,900 --> 00:11:19,570 Lo stack fa. 247 00:11:19,570 --> 00:11:20,790 L'heap è lassù. 248 00:11:20,790 --> 00:11:21,990 Essi avvicinarsi l'uno all'altro. 249 00:11:21,990 --> 00:11:23,110 >> E se toccano, questo è un problema. 250 00:11:23,110 --> 00:11:24,500 A corto di memoria. 251 00:11:24,500 --> 00:11:28,760 Ma anche, oltre a sapere dove essi sono, ciò che è memorizzato sia nella 252 00:11:28,760 --> 00:11:30,512 impilare e heap. 253 00:11:30,512 --> 00:11:31,410 Curtis. 254 00:11:31,410 --> 00:11:33,570 >> CURTIS: Quando si scontrano, è che un overflow dello stack? 255 00:11:33,570 --> 00:11:35,670 >> JASON HIRSCHHORN: Quando si scontrano, che non è un overflow dello stack. 256 00:11:35,670 --> 00:11:38,340 Un overflow dello stack è una zona diversa che possiamo andare oltre se si vuole. 257 00:11:38,340 --> 00:11:40,020 OK, torneremo a quello un po '. 258 00:11:40,020 --> 00:11:42,730 >> STUDENTE: Qual è la parola chiamata quando colpiscono l'altro, la 259 00:11:42,730 --> 00:11:44,450 impilare e il mucchio? 260 00:11:44,450 --> 00:11:46,640 >> JASON HIRSCHHORN: Per ora, non ti preoccupare. 261 00:11:46,640 --> 00:11:47,750 Basta sapere - 262 00:11:47,750 --> 00:11:50,530 Risponderò a questa domanda dopo le lezioni. 263 00:11:50,530 --> 00:11:52,680 Se si incontrano a vicenda, è stato eseguito fuori della memoria, perché non c'è più 264 00:11:52,680 --> 00:11:53,330 spazio c'è. 265 00:11:53,330 --> 00:11:55,450 >> STUDENTE: Mi dispiace, che cosa è un errore seg? 266 00:11:55,450 --> 00:11:58,710 >> JASON HIRSCHHORN: un segmento guasto può essere chiamato per - 267 00:11:58,710 --> 00:12:02,240 dipende perché chiamato il guasto seg. 268 00:12:02,240 --> 00:12:06,260 A volte, il vostro stack overflow, sarà dire seg guasto come l'errore. 269 00:12:06,260 --> 00:12:08,180 >> STUDENTE: Che dire dereferenziando una variabile nullo? 270 00:12:08,180 --> 00:12:10,040 È che un guasto seg? 271 00:12:10,040 --> 00:12:11,480 >> JASON HIRSCHHORN: Dereferenziare un puntatore nullo - 272 00:12:11,480 --> 00:12:17,850 OK, quindi se avete un puntatore che si impostare uguale a null, puntatori, richiamo, 273 00:12:17,850 --> 00:12:20,270 indirizzi di memoria negozio come i loro valori. 274 00:12:20,270 --> 00:12:23,660 E un puntatore nullo è essenzialmente memorizzare 0, 0-esimo 275 00:12:23,660 --> 00:12:26,670 affrontare in quella variabile. 276 00:12:26,670 --> 00:12:30,010 Così 0x, 0, 0, 0, 0, et cetera. 277 00:12:30,010 --> 00:12:35,030 Che 0-esimo indirizzo in memoria che non è a nostra immagine, che è lassù 278 00:12:35,030 --> 00:12:38,800 da qualche parte, che è riservato per il computer. 279 00:12:38,800 --> 00:12:40,130 Noi non ci è permesso di toccarlo. 280 00:12:40,130 --> 00:12:44,680 >> Così, quando il programma è in esecuzione, se qualcosa sta cercando di andare a memoria 281 00:12:44,680 --> 00:12:48,990 indirizzo 0, sa che cioè un valore vuoto. 282 00:12:48,990 --> 00:12:50,820 Si sa nulla dovrebbe essere lì. 283 00:12:50,820 --> 00:12:53,420 Quindi, se si cerca di usare qualcosa lì e trattare qualcosa come lì o 284 00:12:53,420 --> 00:12:58,355 cercando di andare a quella posizione, sei andando ad ottenere un guasto SEG o un errore. 285 00:12:58,355 --> 00:13:00,520 Questo risponde alla tua domanda? 286 00:13:00,520 --> 00:13:03,170 >> E adesso ci torneremo di overflow dello stack. 287 00:13:03,170 --> 00:13:09,560 Le cose nello stack, come voi ragazzi hanno visto prima, in - cerchiamo di disegnare una stretta 288 00:13:09,560 --> 00:13:11,966 up di uno stack frame. 289 00:13:11,966 --> 00:13:15,050 Chiunque può vedere che? 290 00:13:15,050 --> 00:13:16,650 Quindi abbiamo il nostro stack frame. 291 00:13:16,650 --> 00:13:23,260 Stiamo risparmiando un array in un locale variabile in funzione. 292 00:13:23,260 --> 00:13:29,510 Quindi dire che la nostra matrice ha cinque punti. 293 00:13:29,510 --> 00:13:33,230 Tutti e cinque di questi verranno memorizzati in tale stack frame. 294 00:13:33,230 --> 00:13:37,540 >> Se cominciamo a scrivere al di là del limiti di questa matrice - 295 00:13:37,540 --> 00:13:43,990 quindi se cominciamo a scrivere in, diciamo che è 0. 296 00:13:43,990 --> 00:13:46,800 Questi sono i cinque indici della nostra matrice. 297 00:13:46,800 --> 00:13:50,980 Se cominciamo a scrivere in indice 5, che non abbiamo quando abbiamo un 298 00:13:50,980 --> 00:13:55,900 array di dimensione 5, cominciamo a scrivere in indice 6, 7, 8, 9, possiamo ottenere un Stack 299 00:13:55,900 --> 00:13:57,960 Errore di overflow. 300 00:13:57,960 --> 00:14:00,510 >> Generalmente non è - 301 00:14:00,510 --> 00:14:04,910 probabilmente otterrete nei guai se si va oltre uno. 302 00:14:04,910 --> 00:14:08,640 Ma in generale, si otterrà in maggior parte dei problemi se si va oltre da un sacco 303 00:14:08,640 --> 00:14:12,770 e si va così lontano sopra che si scrive sopra l'indirizzo di ritorno di quel 304 00:14:12,770 --> 00:14:16,080 funzione, che si trova nella inferiore dello stack frame. 305 00:14:16,080 --> 00:14:16,520 >> Perché, giusto? 306 00:14:16,520 --> 00:14:17,670 È - in - sorry. 307 00:14:17,670 --> 00:14:18,550 Not "perché giusto". 308 00:14:18,550 --> 00:14:20,470 >> Nel stack frame, avete le variabili locali. 309 00:14:20,470 --> 00:14:27,090 Nella parte inferiore della pila frame è l'indirizzo di ritorno. 310 00:14:27,090 --> 00:14:28,790 Ecco dove la funzione va quando è finita. 311 00:14:28,790 --> 00:14:33,750 E se si sovrascrive quel ritorno indirizzo, poi quando questo stack frame, 312 00:14:33,750 --> 00:14:36,680 quando si sta andando attraverso lo stack inquadrare e l'esecuzione di ogni linea, sei 313 00:14:36,680 --> 00:14:40,350 per andare al tuo nuovo indirizzo di ritorno che è scritto lì, invece del 314 00:14:40,350 --> 00:14:40,910 quello attuale. 315 00:14:40,910 --> 00:14:45,050 Ed è così che abbiamo visto alcune violazioni della sicurezza 316 00:14:45,050 --> 00:14:46,780 può accadere con i computer. 317 00:14:46,780 --> 00:14:52,760 >> Di overflow dello stack Quindi, in breve, è quando si sovrascrive la parte dello stack 318 00:14:52,760 --> 00:14:55,440 si suppone di utilizzare il locale variabile che si suppone di utilizzare, e 319 00:14:55,440 --> 00:14:58,070 in particolare quando si avvia la sovrascrittura cose importanti come l' 320 00:14:58,070 --> 00:14:59,100 indirizzo di ritorno. 321 00:14:59,100 --> 00:15:00,090 Ed è qui che si otterrà un errore. 322 00:15:00,090 --> 00:15:03,980 O magari si potrebbe iniziare anche la scrittura in - 323 00:15:03,980 --> 00:15:05,370 dicono ricerca binaria era proprio sopra principale. 324 00:15:05,370 --> 00:15:07,790 Se si sovrascritto molto, sapevano scrivere in principale. 325 00:15:07,790 --> 00:15:10,230 Ma in generale, si ottiene un errore prima poi, perché il computer sa 326 00:15:10,230 --> 00:15:12,270 si sta facendo qualcosa che si non dovrebbe fare. 327 00:15:12,270 --> 00:15:12,560 Già. 328 00:15:12,560 --> 00:15:13,910 >> STUDENTE: Qual è la differenza tra un overflow dello stack 329 00:15:13,910 --> 00:15:16,940 e un buffer overflow? 330 00:15:16,940 --> 00:15:19,420 >> JASON HIRSCHHORN: Buffer overflow è un tipo più generico di 331 00:15:19,420 --> 00:15:20,395 quello che ho appena descritto. 332 00:15:20,395 --> 00:15:22,610 >> STUDENTE: Quindi un overflow dello stack è un esempio di un buffer overflow. 333 00:15:22,610 --> 00:15:23,420 >> JASON HIRSCHHORN: Esattamente. 334 00:15:23,420 --> 00:15:28,700 Si tratta di un array possiamo pensare come un tampone, uno spazio per le cose vadano dentro 335 00:15:28,700 --> 00:15:30,600 Questo è un buffer overflow dello stack. 336 00:15:30,600 --> 00:15:33,210 Potremmo avere un overflow del buffer di heap. 337 00:15:33,210 --> 00:15:36,870 Se ci fosse un buffer, che spesso ci è un array heap, e noi 338 00:15:36,870 --> 00:15:40,600 sovrascritto questi limiti, allora avremmo avere un overflow del buffer di heap. 339 00:15:40,600 --> 00:15:44,870 >> E oltre lo scopo di questo corso, stanno rilevato un po 'diverso. 340 00:15:44,870 --> 00:15:48,040 Il compilatore è speciale modi di individuare ciascuno. 341 00:15:48,040 --> 00:15:50,660 Ma un buffer overflow è un più generico tipo di quello che ho descritto, 342 00:15:50,660 --> 00:15:54,090 che era un buffer overflow dello stack. 343 00:15:54,090 --> 00:15:56,240 Forse che risponde alla tua domanda? 344 00:15:56,240 --> 00:15:57,910 Dolce. 345 00:15:57,910 --> 00:16:01,850 >> C'erano altre domande correlate allo stack o heap? 346 00:16:01,850 --> 00:16:04,920 347 00:16:04,920 --> 00:16:05,510 Già. 348 00:16:05,510 --> 00:16:08,220 >> STUDENTE: So che hai in stringhe gratis perché sono nel mucchio 349 00:16:08,220 --> 00:16:09,305 e non si vuole perdere la memoria. 350 00:16:09,305 --> 00:16:12,240 Ma bisogna liberare le variabili globali e cose del genere? 351 00:16:12,240 --> 00:16:14,335 O sono liberati automaticamente? 352 00:16:14,335 --> 00:16:15,700 >> JASON HIRSCHHORN: Bella domanda. 353 00:16:15,700 --> 00:16:22,340 Quindi, in CS50.H, creiamo questa cosa per voi chiamato una stringa. 354 00:16:22,340 --> 00:16:23,800 Una stringa è davvero quello? 355 00:16:23,800 --> 00:16:24,810 >> STUDENTE: Char stella. 356 00:16:24,810 --> 00:16:29,180 >> JASON HIRSCHHORN: Una stella char, un puntatore ad un carattere, un puntatore 357 00:16:29,180 --> 00:16:30,650 un array di caratteri. 358 00:16:30,650 --> 00:16:32,210 Questo è ciò che la stringa è. 359 00:16:32,210 --> 00:16:36,050 Quindi abbiamo bisogno di liberare, perché GetString, che abbiamo utilizzato un sacco - 360 00:16:36,050 --> 00:16:38,370 string name uguale GetString - 361 00:16:38,370 --> 00:16:43,560 che mallocs per noi qualche ricordo sul heap e poi ritorna un puntatore al 362 00:16:43,560 --> 00:16:47,230 primo carattere che stringa, una stella char. 363 00:16:47,230 --> 00:16:52,760 >> Quindi, apparentemente, se non siete stati la scrittura libera su una qualsiasi delle corde 364 00:16:52,760 --> 00:16:55,600 che hai chiamato finora, avete stato che perde un po 'di memoria. 365 00:16:55,600 --> 00:16:57,430 Naturalmente non abbiamo parlato di , quindi nessuno ha ottenuto in 366 00:16:57,430 --> 00:16:58,520 guai per farlo. 367 00:16:58,520 --> 00:16:59,980 Ma andando avanti, sì. 368 00:16:59,980 --> 00:17:03,990 Quando si chiama getstring, sei mallocing po 'di spazio sul mucchio. 369 00:17:03,990 --> 00:17:07,640 E se non si chiama gratuitamente in seguito che stringa, si ha una perdita di memoria. 370 00:17:07,640 --> 00:17:09,440 Questo risponde alla tua domanda? 371 00:17:09,440 --> 00:17:10,606 >> Sì 372 00:17:10,606 --> 00:17:15,020 >> STUDENTE: Quindi, per fare questo, usiamo destra libera prima di ritorno? 373 00:17:15,020 --> 00:17:18,510 Come, nel campo di applicazione, credo che se diciamo, come, int principale, all'interno della 374 00:17:18,510 --> 00:17:24,410 campo di applicazione del codice che è tra quelle parentesi graffe, subito prima - 375 00:17:24,410 --> 00:17:26,140 sai dove ti piacerebbe di solito mettere ritorno. 376 00:17:26,140 --> 00:17:27,950 Ti metti libero prima? 377 00:17:27,950 --> 00:17:31,000 >> JASON HIRSCHHORN: Così si può mettere libero dove vuoi mettere gratuitamente. 378 00:17:31,000 --> 00:17:33,810 Perché questi sono allocati dinamicamente variabili, perché possono 379 00:17:33,810 --> 00:17:39,170 vivere oltre l'ambito di una particolare funzione, se si chiama malloc in un 380 00:17:39,170 --> 00:17:44,140 funzione separata, per esempio, GetString, è possibile chiamare gratuitamente in main. 381 00:17:44,140 --> 00:17:46,050 Non è necessario chiamare nella funzione specifica 382 00:17:46,050 --> 00:17:47,570 dove malloc è chiamato. 383 00:17:47,570 --> 00:17:50,340 Ma si ha bisogno di chiamare prima del ritorno principali. 384 00:17:50,340 --> 00:17:51,120 >> E in realtà dipende. 385 00:17:51,120 --> 00:17:54,960 Dipende dal motivo per cui si malloced che spazio in primo luogo. 386 00:17:54,960 --> 00:17:57,320 Alcune persone chiameranno liberare abbastanza rapidamente. 387 00:17:57,320 --> 00:17:59,220 Alcune persone non chiameranno libero fino Alla fine del loro programma. 388 00:17:59,220 --> 00:18:00,660 E faranno passare attraverso e libera tutto. 389 00:18:00,660 --> 00:18:03,597 Dipende dal motivo per cui si chiama malloc. 390 00:18:03,597 --> 00:18:11,270 >> STUDENTE: E cosa diresti se si chiama uso GetString? 391 00:18:11,270 --> 00:18:13,320 Si direbbe libero che cosa? 392 00:18:13,320 --> 00:18:20,040 >> JASON HIRSCHHORN: Quindi la sintassi gratuitamente è semplicemente libero, parentesi aperte, chiudere 393 00:18:20,040 --> 00:18:22,130 parentesi, e il nome del puntatore. 394 00:18:22,130 --> 00:18:26,410 Quindi, se si scrivere il nome uguale a corda GetString, metti il ​​nome qui. 395 00:18:26,410 --> 00:18:27,760 Questo è il nome del puntatore. 396 00:18:27,760 --> 00:18:30,570 E si sa per liberare quella memoria. 397 00:18:30,570 --> 00:18:33,920 >> STUDENTE: Quindi, quando si libera quella memoria, il puntatore punta ancora a quel posto 398 00:18:33,920 --> 00:18:34,970 nella memoria? 399 00:18:34,970 --> 00:18:39,020 O è il puntatore anche svuotato di l'indirizzo a cui punta. 400 00:18:39,020 --> 00:18:40,290 >> JASON HIRSCHHORN: Dovremmo provare che. 401 00:18:40,290 --> 00:18:41,430 Dovremmo codice che. 402 00:18:41,430 --> 00:18:43,880 Torniamo quando arriviamo al codifica, e facciamo il codice che. 403 00:18:43,880 --> 00:18:46,000 E se si vuole capire la risposta a ciò, si può anche codice che 404 00:18:46,000 --> 00:18:46,690 nel frattempo. 405 00:18:46,690 --> 00:18:49,100 Ma questa è una grande domanda. 406 00:18:49,100 --> 00:18:53,480 >> STUDENTE: E 'possibile qualcosa di gratuito troppo presto? 407 00:18:53,480 --> 00:18:58,530 Quindi, hai ancora bisogno per il vostro programma, e liberato quello spazio di memoria? 408 00:18:58,530 --> 00:18:59,200 >> JASON HIRSCHHORN: sì. 409 00:18:59,200 --> 00:19:03,020 E 'possibile, se si libera qualcosa e poi lo si utilizza ancora una volta, si vuole 410 00:19:03,020 --> 00:19:06,890 incorrere in un errore. 411 00:19:06,890 --> 00:19:10,810 Ma questo è su di te, perché hai liberato qualcosa e poi ha chiamato più tardi. 412 00:19:10,810 --> 00:19:13,940 Così che è stato l'errore di un programmatore. 413 00:19:13,940 --> 00:19:14,780 Ma sì. 414 00:19:14,780 --> 00:19:17,760 Si potrebbe scrivere che. 415 00:19:17,760 --> 00:19:19,240 >> Altre domande su - 416 00:19:19,240 --> 00:19:19,760 Sì. 417 00:19:19,760 --> 00:19:22,820 >> STUDENTE: Quindi, se si suppone di appena liberarlo in generale prima 418 00:19:22,820 --> 00:19:25,490 programma termina, vuol dire che se l' programma termina e non liberarla, 419 00:19:25,490 --> 00:19:27,580 che la memoria è ancora allocata? 420 00:19:27,580 --> 00:19:31,330 >> JASON HIRSCHHORN: Se il programma termina e si dimentica di liberare qualcosa, poi 421 00:19:31,330 --> 00:19:34,390 che la memoria è stata allocata in tutta la durata del programma. 422 00:19:34,390 --> 00:19:37,670 Quando il programma si chiude completamente, che la memoria non sta andando 423 00:19:37,670 --> 00:19:39,490 rimanere lì per sempre. 424 00:19:39,490 --> 00:19:42,080 Il computer è abbastanza intelligente da sapere che quando il programma si chiude, 425 00:19:42,080 --> 00:19:46,440 dovrebbe sbarazzarsi di tutta la memoria che è stato associato con quel programma. 426 00:19:46,440 --> 00:19:51,240 >> Tuttavia, ci sono strumenti che è possibile eseguire su un programma di rilevare se, quando la 427 00:19:51,240 --> 00:19:54,720 programma finito, ti sei dimenticato per liberare la memoria. 428 00:19:54,720 --> 00:19:57,960 E per il tuo prossimo problema posto dove userete malloc e l'utilizzo di 429 00:19:57,960 --> 00:20:02,610 puntatori, si sarà in esecuzione questo programmare sul vostro programma per vedere se, 430 00:20:02,610 --> 00:20:06,530 quando ritorna principali, hai avuto qualche cose che sono stati lasciati unfreed. 431 00:20:06,530 --> 00:20:09,130 >> Quindi non stanno andando per rimanere malloced per sempre nel vostro computer. 432 00:20:09,130 --> 00:20:11,720 Sarebbe uno spreco, perché molto rapidamente, computer 433 00:20:11,720 --> 00:20:12,960 avrebbe esaurito la memoria. 434 00:20:12,960 --> 00:20:16,450 Ma se corrono fino alla fine del programmare e non sono liberati e la vostra 435 00:20:16,450 --> 00:20:20,260 programma esce, questo è ancora un problema che questo strumento vi aiuterà a risolvere. 436 00:20:20,260 --> 00:20:21,520 >> STUDENTE: È che Valgrind? 437 00:20:21,520 --> 00:20:22,910 >> JASON HIRSCHHORN: E ' chiamato Valgrind. 438 00:20:22,910 --> 00:20:23,520 E sarete - 439 00:20:23,520 --> 00:20:25,780 >> STUDENTE: Ma noi non dobbiamo sapere che per il quiz, però? 440 00:20:25,780 --> 00:20:27,600 Voglio dire, si è parlato un po 'di lezione. 441 00:20:27,600 --> 00:20:33,600 >> JASON HIRSCHHORN: Così Valgrind è il nome di questo strumento. 442 00:20:33,600 --> 00:20:37,180 Conoscere ciò che fa è sufficiente per il quiz. 443 00:20:37,180 --> 00:20:40,200 Ma non avete ancora utilizzato su problema impostare perché non abbiamo avuto una 444 00:20:40,200 --> 00:20:43,520 problema di set che ha esplicitamente affrontato con malloc o usando malloc. 445 00:20:43,520 --> 00:20:45,330 Così non è stato ancora utilizzato Valgrind. 446 00:20:45,330 --> 00:20:47,760 Ma si intende utilizzare prima piuttosto che dopo. 447 00:20:47,760 --> 00:20:48,710 >> STUDENTE: Puoi ripetere cosa Valgrind è? 448 00:20:48,710 --> 00:20:49,190 >> JASON HIRSCHHORN: Sorry? 449 00:20:49,190 --> 00:20:51,240 >> STUDENTE: Si può ripetere quanto lo scopo del Valgring è? 450 00:20:51,240 --> 00:20:53,100 >> JASON HIRSCHHORN: Valgrind è il nome - 451 00:20:53,100 --> 00:20:59,890 come GDB aiuta il test del programma, Valgrind aiuta a capire se 452 00:20:59,890 --> 00:21:03,210 le cose non sono stati liberati quando il programma si chiude. 453 00:21:03,210 --> 00:21:05,110 Quindi dovrete eseguirlo sul vostro programma. 454 00:21:05,110 --> 00:21:09,230 E il programma esce e si dirà il vostro programma chiamato malloc questo molti 455 00:21:09,230 --> 00:21:13,670 volte per questo molti byte, e si solo chiamati libero molte volte. 456 00:21:13,670 --> 00:21:16,520 E così te ne sei andato da tanti byte senza essere liberato. 457 00:21:16,520 --> 00:21:18,050 Oppure dirà che hai liberato tutto. 458 00:21:18,050 --> 00:21:19,070 Buon lavoro. 459 00:21:19,070 --> 00:21:19,480 >> STUDENTE: OK. 460 00:21:19,480 --> 00:21:21,060 E si chiama Valgring? 461 00:21:21,060 --> 00:21:24,940 >> JASON HIRSCHHORN: V-A-L-G-R-I-N-D. 462 00:21:24,940 --> 00:21:25,970 >> STUDENTE: Una domanda su puntatori. 463 00:21:25,970 --> 00:21:30,080 Quindi dici che hai n stella x è uguale a qualcosa. 464 00:21:30,080 --> 00:21:33,330 Che equivale, qualunque cosa si sta mettendo c'è, è che ciò che è stato messo dentro 465 00:21:33,330 --> 00:21:36,120 cosa x sta indicando a, o il puntatore di x? 466 00:21:36,120 --> 00:21:37,690 >> JASON HIRSCHHORN: si può ripetere la domanda? 467 00:21:37,690 --> 00:21:39,340 Possiamo disegnare mentre lo dici? 468 00:21:39,340 --> 00:21:42,710 >> STUDENTE: Nel quiz, in realtà, l' uno che ci ha inviato, era come, char 469 00:21:42,710 --> 00:21:46,520 verità stella uguale rocce CS50, giusto? 470 00:21:46,520 --> 00:21:52,190 Quindi vuol dire che tale rocce CS50 è ciò che la verità sta puntando? 471 00:21:52,190 --> 00:21:55,810 >> JASON HIRSCHHORN: Quindi stai parlando su una stella in una stringa, come 472 00:21:55,810 --> 00:21:56,460 che funziona? 473 00:21:56,460 --> 00:21:56,890 Già. 474 00:21:56,890 --> 00:21:57,700 OK. 475 00:21:57,700 --> 00:21:59,140 Cerchiamo di disegnare questo qui. 476 00:21:59,140 --> 00:22:07,100 >> [CONVERSAZIONE SIDE] 477 00:22:07,100 --> 00:22:11,130 >> JASON HIRSCHHORN: Quindi questa variabile sta per essere di tipo char stella. 478 00:22:11,130 --> 00:22:14,580 Quanto è grande una variabile di tipo char stella? 479 00:22:14,580 --> 00:22:15,510 Quanti byte? 480 00:22:15,510 --> 00:22:16,450 >> STUDENTI: Quattro. 481 00:22:16,450 --> 00:22:18,210 >> JASON HIRSCHHORN: E 'di quattro byte. 482 00:22:18,210 --> 00:22:21,420 Quante diritti è una variabile di tipo int stella? 483 00:22:21,420 --> 00:22:22,210 >> STUDENTI: Quattro. 484 00:22:22,210 --> 00:22:24,910 >> JASON HIRSCHHORN: quattro byte. 485 00:22:24,910 --> 00:22:28,280 Se è un puntatore, allora è sempre quattro byte, perchè puntatori, la loro 486 00:22:28,280 --> 00:22:30,070 valore è un indirizzo di memoria. 487 00:22:30,070 --> 00:22:35,160 E gli indirizzi di memoria sul CS50 apparecchio sono lunghe quattro byte. 488 00:22:35,160 --> 00:22:42,900 Così, quando chiamiamo getstring, o quando per esempio, Stringname uguale, e poi in 489 00:22:42,900 --> 00:22:46,140 virgolette mettere una stringa, stiamo mettendo - 490 00:22:46,140 --> 00:22:46,920 beh, questo è un po 'diverso. 491 00:22:46,920 --> 00:22:48,630 Faremo GetString come esempio. 492 00:22:48,630 --> 00:22:52,150 O char stella qualcosa uguale alla stringa. 493 00:22:52,150 --> 00:22:54,360 Spiacenti, mi dia l'esempio che hai letto? 494 00:22:54,360 --> 00:22:57,590 >> STUDENTE: char stella verità è uguale "rocce CS50" tra virgolette. 495 00:22:57,590 --> 00:23:02,260 >> JASON HIRSCHHORN: Quindi questa stella, questo chiameremo questa variabile x per il nostro 496 00:23:02,260 --> 00:23:04,060 scopi generici. 497 00:23:04,060 --> 00:23:05,970 Abbiamo creato una variabile chiamata x. 498 00:23:05,970 --> 00:23:07,610 E 'di tipo char stelle. 499 00:23:07,610 --> 00:23:10,950 Si tratta di un puntatore a una serie di caratteri. 500 00:23:10,950 --> 00:23:12,200 Quindi qui - 501 00:23:12,200 --> 00:23:23,710 502 00:23:23,710 --> 00:23:25,890 >> Quindi questo è come questo sarebbe lavorare in memoria. 503 00:23:25,890 --> 00:23:27,410 Ciò memorizzare un indirizzo di memoria. 504 00:23:27,410 --> 00:23:31,770 Sarebbe memorizzare l'indirizzo di memoria il primo carattere nella matrice. 505 00:23:31,770 --> 00:23:33,830 E poi quando hai seguito il puntatore, si farebbe 506 00:23:33,830 --> 00:23:35,200 ottenere il primo carattere. 507 00:23:35,200 --> 00:23:38,780 >> E se stai leggendo questa cosa come una stringa, il computer è intelligente 508 00:23:38,780 --> 00:23:42,930 basta conoscere, di leggere tutta questa cosa fino a quando si arriva a una reazione 0. 509 00:23:42,930 --> 00:23:45,530 Ma se stai leggendo un carattere un tempo, in modo che stai scorrendo 510 00:23:45,530 --> 00:23:49,910 questa stringa, allora si avrà semplicemente leggere un carattere alla volta fino ad arrivare a 511 00:23:49,910 --> 00:23:50,850 backslash 0. 512 00:23:50,850 --> 00:23:52,335 Che potrebbe non rispondere alla tua domanda, però. 513 00:23:52,335 --> 00:23:55,610 >> STUDENTE: Sì, ma tu non hai malloced che lo spazio 514 00:23:55,610 --> 00:23:58,400 ma per tale puntatore. 515 00:23:58,400 --> 00:24:02,510 >> JASON HIRSCHHORN: Quindi io non sono molto sicuro esattamente quello che stai guardando, 516 00:24:02,510 --> 00:24:03,640 perché non ho fatto che quiz. 517 00:24:03,640 --> 00:24:06,370 Questo doveva essere un utile risorse da un altro TF. 518 00:24:06,370 --> 00:24:11,380 Se si sta creando una stringa sul impilare o come variabile locale, sarà 519 00:24:11,380 --> 00:24:16,920 essere solo array di tasse piuttosto che generalmente una stella char che punta a 520 00:24:16,920 --> 00:24:18,600 un'altra stringa. 521 00:24:18,600 --> 00:24:20,550 Ma io non lo so. 522 00:24:20,550 --> 00:24:25,065 Questo potrebbe essere un puntatore ad un'altra stringa in pila pure. 523 00:24:25,065 --> 00:24:27,240 Già. 524 00:24:27,240 --> 00:24:31,116 >> STUDENTE: So che avete bisogno di allocare la memoria se il puntatore è 525 00:24:31,116 --> 00:24:33,360 sempre dichiarata all'interno di un'altra funzione. 526 00:24:33,360 --> 00:24:36,740 Avete bisogno di fare la stessa cosa se si tratta di essere dichiarata all'interno del principale, 527 00:24:36,740 --> 00:24:39,570 si sta utilizzando dentro di principale? 528 00:24:39,570 --> 00:24:43,590 >> JASON HIRSCHHORN: Quindi sì. 529 00:24:43,590 --> 00:24:46,670 È possibile dichiarare un puntatore a qualsiasi indirizzo di memoria nella memoria. 530 00:24:46,670 --> 00:24:51,440 Può essere l'indirizzo di memoria di un locale variabile, anche se spesso, 531 00:24:51,440 --> 00:24:55,760 persone che non dichiarano indirizzi di memoria alle variabili locali perché vanno 532 00:24:55,760 --> 00:24:59,890 via una volta che la funzione restituisce, che è per questo che generalmente malloc cose. 533 00:24:59,890 --> 00:25:04,630 Ma sì, si può dichiarare un puntatore a un'altra variabile locale. 534 00:25:04,630 --> 00:25:06,360 E 'solo genere non fatto. 535 00:25:06,360 --> 00:25:09,480 Ma posso dare un'occhiata a che cosa specifica dopo le lezioni. 536 00:25:09,480 --> 00:25:10,650 Già. 537 00:25:10,650 --> 00:25:12,350 >> STUDENTE: Penso che questo è una sorta di ciò che è stato chiesto. 538 00:25:12,350 --> 00:25:16,930 Sembra strano essere inizializzazione un puntatore non come 539 00:25:16,930 --> 00:25:20,760 indirizzo, ma come quello sembra un valore. 540 00:25:20,760 --> 00:25:25,970 Sembra che il CS50 è quello che c'è dentro la cosa si punta e 541 00:25:25,970 --> 00:25:28,820 non l'indirizzo effettivo, giusto? 542 00:25:28,820 --> 00:25:30,520 >> JASON HIRSCHHORN: Così che è non è il caso, però. 543 00:25:30,520 --> 00:25:32,470 Questo non è ciò che sta accadendo. 544 00:25:32,470 --> 00:25:35,910 Quando si dichiara una stella char, si tratta di un indirizzo di memoria. 545 00:25:35,910 --> 00:25:38,860 I puntatori sono tutti gli indirizzi di memoria che punta a qualcosa d'altro. 546 00:25:38,860 --> 00:25:41,480 Quel qualcos'altro potrebbe essere sulla pila, ma quasi sempre è sul 547 00:25:41,480 --> 00:25:43,440 heap nel modo in cui lo vedremo usato. 548 00:25:43,440 --> 00:25:46,860 549 00:25:46,860 --> 00:25:53,500 Ma Stringname uguale virgolette "GetString," possiamo vedere che e noi 550 00:25:53,500 --> 00:25:55,010 può guardare attraverso quel codice e quello. 551 00:25:55,010 --> 00:26:01,190 stringa getString non viene salvato in quella variabile, o qualsiasi altra cosa la stringa 552 00:26:01,190 --> 00:26:04,580 nome non viene salvato in quel variabile, non perché è così che 553 00:26:04,580 --> 00:26:06,070 puntatori funzionano. 554 00:26:06,070 --> 00:26:06,770 Ritiene che senso? 555 00:26:06,770 --> 00:26:07,170 >> STUDENTE: Già. 556 00:26:07,170 --> 00:26:08,570 >> JASON HIRSCHHORN: OK. 557 00:26:08,570 --> 00:26:11,690 Speriamo, che non era confuso per chiunque. 558 00:26:11,690 --> 00:26:15,732 Ma se fosse, possiamo guardare di nuovo in un po ', perché stiamo effettivamente andando 559 00:26:15,732 --> 00:26:19,240 per codificare qualcosa che si spera lavora con stringhe e aiutare a sentirsi 560 00:26:19,240 --> 00:26:22,170 più a suo agio con loro. 561 00:26:22,170 --> 00:26:24,869 >> Tutte le altre domande relative a questi argomenti o altri argomenti che 562 00:26:24,869 --> 00:26:26,119 Metterò il backup? 563 00:26:26,119 --> 00:26:32,280 564 00:26:32,280 --> 00:26:34,840 E - 565 00:26:34,840 --> 00:26:36,310 proprio ora. 566 00:26:36,310 --> 00:26:37,630 Sì, Alden. 567 00:26:37,630 --> 00:26:39,860 >> ALDEN: Quindi questo è completamente indipendenti, ma possiamo solo andare oltre 568 00:26:39,860 --> 00:26:42,760 molto velocemente quello che dobbiamo sapere la differenza tra un 32 e 569 00:26:42,760 --> 00:26:46,345 Computer a 64 bit? 570 00:26:46,345 --> 00:26:47,740 >> JASON HIRSCHHORN: sì. 571 00:26:47,740 --> 00:26:52,111 Così a 32 bit è il numero di byte? 572 00:26:52,111 --> 00:26:53,060 >> ALDEN: E 'di quattro byte. 573 00:26:53,060 --> 00:26:54,360 >> JASON HIRSCHHORN: E 'di quattro byte. 574 00:26:54,360 --> 00:26:58,420 E 64 bit è il numero di byte? 575 00:26:58,420 --> 00:26:59,112 >> STUDENTE: Eight. 576 00:26:59,112 --> 00:27:00,610 >> JASON HIRSCHHORN: otto byte. 577 00:27:00,610 --> 00:27:03,980 Quindi, di nuovo, otto bit è un byte. 578 00:27:03,980 --> 00:27:08,340 Il vostro apparecchio CS50 è una macchina a 32-bit. 579 00:27:08,340 --> 00:27:13,650 Così indirizzi di memoria sono quattro byte lunghi. 580 00:27:13,650 --> 00:27:17,460 Esistono 2 al 32 indirizzi di memoria. 581 00:27:17,460 --> 00:27:21,310 0 e 2 alla 32 meno 1. 582 00:27:21,310 --> 00:27:27,630 E io non sono positive, ma questo è probabilmente la portata di ciò che è necessario 583 00:27:27,630 --> 00:27:35,230 conoscere per una macchina a 32 bit, che la memoria indirizzi sono, di nuovo, lungo quattro byte, 584 00:27:35,230 --> 00:27:39,620 e questo è l'importo massimo di indirizzi di memoria. 585 00:27:39,620 --> 00:27:41,680 >> Inoltre, i tipi di dati - 586 00:27:41,680 --> 00:27:45,020 questo potrebbe essere qualcosa come bene che è degno di nota. 587 00:27:45,020 --> 00:27:49,610 La dimensione di un tipo di dati dipende la macchina si sta lavorando. 588 00:27:49,610 --> 00:27:56,760 Quindi un char, un singolo carattere, è come molti byte sul nostro apparecchio CS50? 589 00:27:56,760 --> 00:27:57,980 Un byte. 590 00:27:57,980 --> 00:28:02,310 Ed è davvero un byte come bene su una macchina a 64-bit. 591 00:28:02,310 --> 00:28:05,920 >> E la maggior parte dei tipi di dati sono lo stesso numero di byte su entrambe le macchine. 592 00:28:05,920 --> 00:28:11,620 Ma alcuni tipi di dati sarà diverso su entrambe le macchine. 593 00:28:11,620 --> 00:28:14,590 Così che sarebbe potenzialmente la unica cosa che dovete sapere. 594 00:28:14,590 --> 00:28:16,710 >> Ma anche questo, credo, è oltre i limiti - 595 00:28:16,710 --> 00:28:20,990 Sono quasi positivo, se si guarda indietro a vecchi quiz, si dice, assumere per 596 00:28:20,990 --> 00:28:24,090 problemi di codifica si sta utilizzando una macchina a 32-bit. 597 00:28:24,090 --> 00:28:26,620 598 00:28:26,620 --> 00:28:30,620 Ma ci sono, per andare insieme a quella in caso siate interessati, vi sono 599 00:28:30,620 --> 00:28:35,920 tipi di dati che sono uguali dimensioni su tutte le macchine. 600 00:28:35,920 --> 00:28:42,670 >> Se hai visto qualcosa di simile uint32_t, si può o può 601 00:28:42,670 --> 00:28:43,260 non hanno visto quello. 602 00:28:43,260 --> 00:28:44,290 Questo è un tipo di dati. 603 00:28:44,290 --> 00:28:47,570 Che sta dicendo, sia a 32 bit non importa quale macchina è acceso. 604 00:28:47,570 --> 00:28:50,350 Così, quando le persone stanno scrivendo portatile codice, probabilmente non useranno int. 605 00:28:50,350 --> 00:28:53,260 Faranno invece utilizzano questi altri dati tipi che sanno sarà lo stesso 606 00:28:53,260 --> 00:28:54,780 dimensioni su ogni singola macchina. 607 00:28:54,780 --> 00:28:58,080 608 00:28:58,080 --> 00:28:58,250 Madhu. 609 00:28:58,250 --> 00:29:00,150 >> MADHU: Ho avuto una domanda su il processo di compilazione. 610 00:29:00,150 --> 00:29:04,110 Quindi, se si sta scrivendo un programma che utilizza una libreria come CS50 o qualcosa del genere 611 00:29:04,110 --> 00:29:06,840 così, so che quella biblioteca deve, ad un certo punto, essere 612 00:29:06,840 --> 00:29:08,590 compilato e linkato dentro 613 00:29:08,590 --> 00:29:13,380 Ma quanto di ciò che accade durante l' la compilazione del vostro programma? 614 00:29:13,380 --> 00:29:15,880 Quale parte di quel processo biblioteca si verifica quando si è 615 00:29:15,880 --> 00:29:18,560 compilare il vostro programma? 616 00:29:18,560 --> 00:29:24,020 >> JASON HIRSCHHORN: Quindi cerchiamo di andare oltre generalmente le fasi di questo processo. 617 00:29:24,020 --> 00:29:26,280 Si scrive il file. C. 618 00:29:26,280 --> 00:29:33,530 Nel vostro file. C, è # includere il biblioteche di intestazione, ad esempio, cs50.h. 619 00:29:33,530 --> 00:29:39,480 Che cosa significa che sharp includono linea fare per il vostro programma? 620 00:29:39,480 --> 00:29:40,525 Akchar. 621 00:29:40,525 --> 00:29:43,350 >> AKCHAR: Aggiunge i prototipi di le funzioni dall'intestazione 622 00:29:43,350 --> 00:29:45,120 file nelle librerie. 623 00:29:45,120 --> 00:29:45,600 >> JASON HIRSCHHORN: Esattamente. 624 00:29:45,600 --> 00:29:49,870 Aggiunge quei prototipi di funzione al codice. 625 00:29:49,870 --> 00:29:55,230 Così, quando il codice viene compilato in fasi iniziali, il compilatore sa 626 00:29:55,230 --> 00:29:59,250 che esistono realmente queste funzioni, e che da qualche parte sono stati definiti. 627 00:29:59,250 --> 00:30:02,460 I. H file non comprendono il definizioni per queste funzioni o come 628 00:30:02,460 --> 00:30:03,950 lavorano. 629 00:30:03,950 --> 00:30:07,960 Cs50.h include solo qualcosa che dice getstring è una cosa reale che 630 00:30:07,960 --> 00:30:09,270 può accadere. 631 00:30:09,270 --> 00:30:14,240 E standardio.h dice printf è una cosa reale che può accadere. 632 00:30:14,240 --> 00:30:23,190 >> Così il vostro linguaggio C con questo. Intestazione file viene trasformato in qualche 633 00:30:23,190 --> 00:30:27,750 codice leggibile dalla macchina, che alla fine viene trasformato in binario 634 00:30:27,750 --> 00:30:30,030 codice, 0 e 1 di. 635 00:30:30,030 --> 00:30:33,590 E questo è il codice che alla fine viene eseguito. 636 00:30:33,590 --> 00:30:38,550 Il-l linea CS50 - per esempio, quando si scrive Clang - 637 00:30:38,550 --> 00:30:41,830 e poi si include l-CS50, si digita che dentro 638 00:30:41,830 --> 00:30:42,180 E si vede che. 639 00:30:42,180 --> 00:30:43,890 Quando si scrive fare, ti vedere che line up qui. 640 00:30:43,890 --> 00:30:47,740 E vedremo che in un secondo momento codifichiamo o più tardi, quando abbiamo il codice. 641 00:30:47,740 --> 00:30:50,390 >> Ma quel-l linea CS50 fa qualcosa un po 'diverso 642 00:30:50,390 --> 00:30:52,440 le # include cs50.h. 643 00:30:52,440 --> 00:30:56,300 Cosa fa la linea che-l CS50 fare? 644 00:30:56,300 --> 00:30:56,820 Avi? 645 00:30:56,820 --> 00:31:00,310 >> AVI: voglio dire che si collega la biblioteca alla funzione 646 00:31:00,310 --> 00:31:02,710 chiamare, come i file o.. 647 00:31:02,710 --> 00:31:08,200 >> JASON HIRSCHHORN: Quindi molto vicino, se non è spot-on. 648 00:31:08,200 --> 00:31:16,220 Il-l CS50 prende il file binario e si fonde con il vostro file binario. 649 00:31:16,220 --> 00:31:21,410 Quindi cs50.h, non c'è nessun punto a trasformare cs50.h dal linguaggio C in binario ogni 650 00:31:21,410 --> 00:31:23,130 singolo tempo è in uso. 651 00:31:23,130 --> 00:31:26,650 Sarebbe sciocco, perché sarebbe sprecare un sacco di tempo. 652 00:31:26,650 --> 00:31:30,420 Così è già stato compilato e trasformato in un file eseguibile. 653 00:31:30,420 --> 00:31:35,430 E ora sta per essere fusa con il file alla fine. 654 00:31:35,430 --> 00:31:38,370 Quindi questi 1 e 0 sono in corso a fondersi con i vostri 655 00:31:38,370 --> 00:31:39,150 e 0 di alla fine. 656 00:31:39,150 --> 00:31:43,670 Così ora ci troveremo avere l'attuale 1 e 0 che definiscono come GetString, 657 00:31:43,670 --> 00:31:47,890 per esempio, le opere, o come printf, per esempio, funziona. 658 00:31:47,890 --> 00:31:52,750 >> E per ulteriori informazioni, c'è un compilatori corti che Nate dà quella 659 00:31:52,750 --> 00:31:55,410 si dovrebbe verificare che va attraverso questi passaggi. 660 00:31:55,410 --> 00:31:56,050 Ma - 661 00:31:56,050 --> 00:31:56,560 Sì. 662 00:31:56,560 --> 00:32:01,700 >> STUDENTE: Sono sempre in file o. quando sono in forma biblioteca, 663 00:32:01,700 --> 00:32:06,764 pronti per essere uniti, legati - come sono nel codice binario? 664 00:32:06,764 --> 00:32:07,600 >> JASON HIRSCHHORN: OK. 665 00:32:07,600 --> 00:32:08,420 Che - 666 00:32:08,420 --> 00:32:11,780 >> STUDENTE: È sempre il caso per le librerie quando si collegano loro? 667 00:32:11,780 --> 00:32:12,500 >> JASON HIRSCHHORN: sì. 668 00:32:12,500 --> 00:32:17,300 Quindi c'è. S file, che saranno codice macchina, che sarà anche 669 00:32:17,300 --> 00:32:17,975 criptico per voi. 670 00:32:17,975 --> 00:32:19,410 Non c'è bisogno di preoccuparsi di quelli. 671 00:32:19,410 --> 00:32:24,930 Ma in generale, sì, faranno essere in formato. o file pronto ad andare. 672 00:32:24,930 --> 00:32:27,170 >> STUDENTE: Quindi, quando spedite una biblioteca, Spedite solo 673 00:32:27,170 --> 00:32:28,880 l'. he la. o? 674 00:32:28,880 --> 00:32:32,210 Non spedire l'. C o. S. 675 00:32:32,210 --> 00:32:33,070 >> JASON HIRSCHHORN: So - 676 00:32:33,070 --> 00:32:36,260 e questo è in questo breve e, se queste informazioni sembra essere venuta un 677 00:32:36,260 --> 00:32:36,700 poco rapidamente. 678 00:32:36,700 --> 00:32:39,870 Ma il corto di compilatori parla di questo. 679 00:32:39,870 --> 00:32:43,290 Quando si invia una biblioteca, se spedite l'. h, il file di intestazione, quelli 680 00:32:43,290 --> 00:32:46,290 prototipi di funzione, e l'1 e 0 di, questo è tutto ciò che serve a dare. 681 00:32:46,290 --> 00:32:50,640 Non è necessario dare come l' funzione è attiva, il file c.. 682 00:32:50,640 --> 00:32:56,360 Perché il punto di astrazione, o l' punto API, il punto in questo SPL, 683 00:32:56,360 --> 00:32:59,650 biblioteca portatile Stanford, è per non preoccuparsi di come nuovo 684 00:32:59,650 --> 00:33:04,220 GRect funziona, o come muoversi lavori, o come aggiungere funziona. 685 00:33:04,220 --> 00:33:06,520 Tutto quello che dovete sapere è che in lista è una funzione che si può 686 00:33:06,520 --> 00:33:08,880 uso, e lo fa. 687 00:33:08,880 --> 00:33:12,760 Quindi davvero non hanno bisogno di sapere come è scritto in C. Hai solo bisogno di 688 00:33:12,760 --> 00:33:15,460 so, qui sono le funzioni, ciò che fanno, e qui sono i di 1 e 0 689 00:33:15,460 --> 00:33:18,870 quando si vuole veramente usarli. 690 00:33:18,870 --> 00:33:19,530 >> Freddo. 691 00:33:19,530 --> 00:33:26,980 Altre domande sui compilatori o altri argomenti sulla scheda? 692 00:33:26,980 --> 00:33:30,300 >> STUDENTE: Ho una domanda di attuazione di funzioni ricorsive. 693 00:33:30,300 --> 00:33:31,170 Una domanda sulla ricorsione. 694 00:33:31,170 --> 00:33:33,030 Ho avuto la sensazione che sarebbe venuto. 695 00:33:33,030 --> 00:33:38,310 Quindi andiamo rapidamente attraverso ricorsione con una specifica 696 00:33:38,310 --> 00:33:40,690 esempio, una funzione fattoriale. 697 00:33:40,690 --> 00:33:44,920 Poiché questo è un esempio che spesso esce o viene utilizzato 698 00:33:44,920 --> 00:33:46,170 per illustrare la ricorsione. 699 00:33:46,170 --> 00:33:52,390 700 00:33:52,390 --> 00:33:56,410 >> Così "4!" viene letto come 4 fattoriale. 701 00:33:56,410 --> 00:33:59,120 E che cosa fa 4 fattoriale significa? 702 00:33:59,120 --> 00:34:00,696 Che cosa fare? 703 00:34:00,696 --> 00:34:02,235 Come si calcola 4 fattoriale? 704 00:34:02,235 --> 00:34:05,250 705 00:34:05,250 --> 00:34:07,960 4 volte 3 volte 2 volte 1. 706 00:34:07,960 --> 00:34:11,889 >> Così un altro modo di scrivere 4 fattoriale è quello di scrivere questo. 707 00:34:11,889 --> 00:34:16,780 708 00:34:16,780 --> 00:34:19,022 4 volte 3 fattoriale. 709 00:34:19,022 --> 00:34:22,080 Perché 3 fattoriale è 3 volte 2 volte 1. 710 00:34:22,080 --> 00:34:27,580 SO 4 volte 3 fattoriale è 4 volte 3 volte 2 volte 1. 711 00:34:27,580 --> 00:34:32,679 Questo è il motivo fattoriale è un grande candidato per ricorsione, perché è 712 00:34:32,679 --> 00:34:36,630 chiaro che c'è qualcosa che accade più e più e più volte su una 713 00:34:36,630 --> 00:34:39,820 minor numero di cose fino a si raggiunge la fine. 714 00:34:39,820 --> 00:34:42,570 Quando si raggiunge 1, 1 fattoriale è 1. 715 00:34:42,570 --> 00:34:43,719 Non si può fare molto di più. 716 00:34:43,719 --> 00:34:47,219 0 fattoriale è anche definito come 1. 717 00:34:47,219 --> 00:34:50,679 Così, quando si arriva a 1 o 0, sei alla fine, e si può 718 00:34:50,679 --> 00:34:53,219 inizia risalendo. 719 00:34:53,219 --> 00:34:59,540 Quindi, se volessimo scrivere un ricorsiva funzione per calcolare un fattoriale, 720 00:34:59,540 --> 00:35:02,170 stiamo andando a scrivere qualche pseudocodice per ora. 721 00:35:02,170 --> 00:35:03,300 Prima di scrivere che pseudocode - 722 00:35:03,300 --> 00:35:05,660 Darò voi ragazzi un paio di minuti scrivere il codice pseudo o semplicemente pensare 723 00:35:05,660 --> 00:35:09,600 a questo proposito - ci sono due cose che ogni funzione ricorsiva ha bisogno. 724 00:35:09,600 --> 00:35:12,530 Quali sono queste due cose? 725 00:35:12,530 --> 00:35:13,220 >> JACK: Deve chiamare se stesso. 726 00:35:13,220 --> 00:35:13,680 >> JASON HIRSCHHORN: Noah? 727 00:35:13,680 --> 00:35:14,460 Oh, Jack. 728 00:35:14,460 --> 00:35:15,100 Vai avanti. 729 00:35:15,100 --> 00:35:16,640 >> JACK: Deve chiamare se stesso. 730 00:35:16,640 --> 00:35:19,220 >> JASON HIRSCHHORN: Quindi un ricorsiva funzione ha bisogno di una chiamata ricorsiva, un 731 00:35:19,220 --> 00:35:20,220 chiamare a sé. 732 00:35:20,220 --> 00:35:20,770 Questo è uno. 733 00:35:20,770 --> 00:35:21,510 E qual è l'altra cosa? 734 00:35:21,510 --> 00:35:22,250 >> JACK: Un caso base. 735 00:35:22,250 --> 00:35:23,780 >> JASON HIRSCHHORN: Un caso base. 736 00:35:23,780 --> 00:35:26,940 Un caso base è, ecco quando ci fermiamo. 737 00:35:26,940 --> 00:35:29,510 Quindi, la funzione viene chiamata. 738 00:35:29,510 --> 00:35:31,410 Il caso base viene prima. 739 00:35:31,410 --> 00:35:33,710 Volete sapere se siete alla fine. 740 00:35:33,710 --> 00:35:37,110 E se non sei alla fine, si effettuare la chiamata ricorsiva. 741 00:35:37,110 --> 00:35:39,880 E si passa attraverso questa funzione di nuovo, controllare nuovamente il caso base. 742 00:35:39,880 --> 00:35:42,575 Se non sei alla fine, si fanno un'altra chiamata ricorsiva, 743 00:35:42,575 --> 00:35:44,130 et cetera, et cetera. 744 00:35:44,130 --> 00:35:47,110 >> Ecco perché funzioni ricorsive sempre bisogno di quei casi di base e quelli 745 00:35:47,110 --> 00:35:48,210 chiamate ricorsive. 746 00:35:48,210 --> 00:35:51,280 Se non si dispone di una chiamata ricorsiva, si non sarebbe una funzione ricorsiva. 747 00:35:51,280 --> 00:35:53,210 Se non si dispone di un caso base, si dovrebbe andare per sempre e 748 00:35:53,210 --> 00:35:54,780 non ci sarebbe fine. 749 00:35:54,780 --> 00:35:57,870 E il caso di base viene sempre prima, perché si vuole sempre controllare 750 00:35:57,870 --> 00:36:00,420 se siete alla fine prima. 751 00:36:00,420 --> 00:36:04,770 Quindi, prima di fare qualche pseudocodice, perché Non si prende un minuto per pensare 752 00:36:04,770 --> 00:36:09,360 come una funzione ricorsiva fattoriale sarebbe scritto? 753 00:36:09,360 --> 00:36:23,340 754 00:36:23,340 --> 00:36:26,010 >> Inoltre, come molti come si sta facendo, la scrittura fuori su un foglio di carta è 755 00:36:26,010 --> 00:36:27,960 quello che si sta andando ad avere per fare il quiz domani. 756 00:36:27,960 --> 00:36:32,160 Quindi probabilmente buone pratiche per rendere che il codice che si sta scrivendo 757 00:36:32,160 --> 00:36:34,420 giù sul foglio di carta - 758 00:36:34,420 --> 00:36:35,160 o si può fare. 759 00:36:35,160 --> 00:36:36,710 Sai dove i punti e virgola sono. 760 00:36:36,710 --> 00:36:37,660 Ti ricordi la sintassi. 761 00:36:37,660 --> 00:36:40,400 Perché tu non sei in grado di avere una compilatore dire che hai fatto un errore. 762 00:36:40,400 --> 00:37:02,356 763 00:37:02,356 --> 00:37:07,240 >> Inoltre, in tal senso, domani, quando avete problemi di codifica, se si 764 00:37:07,240 --> 00:37:11,490 si precipitò per tempo, o se siete molto confuso su come si suppone di 765 00:37:11,490 --> 00:37:16,030 scrivere la cosa particolare in C, sarebbe doveroso scrivere pseudo-codice 766 00:37:16,030 --> 00:37:18,160 o scrivere commenti in pure. 767 00:37:18,160 --> 00:37:21,940 Perché non c'è credito parziale per un Molte delle domande sul quiz. 768 00:37:21,940 --> 00:37:24,840 Così si potrebbe essere affrettata, o si potrebbe anche essere confuso. 769 00:37:24,840 --> 00:37:28,030 Scrivendo commenti o pseudo-code sono spesso modi che si 770 00:37:28,030 --> 00:37:29,360 può ottenere credito parziale. 771 00:37:29,360 --> 00:37:31,440 >> Quindi non lasciare qualcosa vuoto sul quiz. 772 00:37:31,440 --> 00:37:33,490 Non ci sono sanzioni per mettere le cose dentro 773 00:37:33,490 --> 00:37:37,650 Infatti, mettendo in pseudo-codice o Commenti sta per aiutare il selezionatore 774 00:37:37,650 --> 00:37:40,410 capire se si sa cosa stai parlando, e forse di aggiudicazione 775 00:37:40,410 --> 00:37:42,030 avete qualche credito parziale per questo. 776 00:37:42,030 --> 00:37:44,510 >> Anche in questo senso, scrivere chiaramente. 777 00:37:44,510 --> 00:37:47,650 Se non possiamo davvero quello che si sta scrivendo, non stiamo andando a chiamarti 778 00:37:47,650 --> 00:37:49,900 a mezzanotte di domani la figura su quello che hai scritto. 779 00:37:49,900 --> 00:37:51,520 Stiamo solo andando a togliere punti. 780 00:37:51,520 --> 00:37:56,570 Scrivi in ​​modo chiaro in modo che possiamo sentire, o meglio, possiamo leggere quello che hai scritto. 781 00:37:56,570 --> 00:38:00,230 >> E se dice due frasi, non scrivere un paragrafo. 782 00:38:00,230 --> 00:38:02,280 Seguire le istruzioni. 783 00:38:02,280 --> 00:38:03,500 Scrivere in modo chiaro. 784 00:38:03,500 --> 00:38:07,720 E scrivere in quei commenti o pseudocodice per le domande che potrebbero 785 00:38:07,720 --> 00:38:10,270 riconoscimento del credito parziale. 786 00:38:10,270 --> 00:38:12,520 >> OK, andiamo a fattoriale. 787 00:38:12,520 --> 00:38:15,000 Quindi abbiamo una funzione fattoriale. 788 00:38:15,000 --> 00:38:18,400 789 00:38:18,400 --> 00:38:21,550 Se dovessi scrivere in realtà questo in C, che cosa ho bisogno di mettere prima del nome 790 00:38:21,550 --> 00:38:22,800 della funzione? 791 00:38:22,800 --> 00:38:24,880 792 00:38:24,880 --> 00:38:30,060 Il tipo di ritorno, che, in questo caso, ci diamo int. 793 00:38:30,060 --> 00:38:35,450 E poi all'interno delle parentesi graffe, è ciò che accade dentro le parentesi graffe per 794 00:38:35,450 --> 00:38:36,850 una funzione? 795 00:38:36,850 --> 00:38:37,950 >> STUDENTI: Tipo di argomento. 796 00:38:37,950 --> 00:38:39,150 >> JASON HIRSCHHORN: I suoi argomenti. 797 00:38:39,150 --> 00:38:42,680 Così fattoriale probabilmente prendere un argomento. 798 00:38:42,680 --> 00:38:44,500 Sarà probabilmente solo prendere un argomento. 799 00:38:44,500 --> 00:38:49,450 E diremo che ti prende un intero chiamato x. 800 00:38:49,450 --> 00:38:52,770 E ancora, quando si scrive il prototipo di una funzione o scrivere la funzione 801 00:38:52,770 --> 00:38:57,110 nel codice prima della definizione, è scrivere il tipo di dati e il nome del 802 00:38:57,110 --> 00:39:01,370 tale variabile solo quella funzione. 803 00:39:01,370 --> 00:39:06,350 Così si può passare qualche numero in questo funzione, che sarà indicato come x 804 00:39:06,350 --> 00:39:07,340 internamente. 805 00:39:07,340 --> 00:39:08,755 >> Noi abbiamo la nostra funzione fattoriale. 806 00:39:08,755 --> 00:39:12,030 807 00:39:12,030 --> 00:39:15,850 Abbiamo bisogno di due cose, un caso base e una chiamata ricorsiva. 808 00:39:15,850 --> 00:39:20,900 Qual è lo scenario di base per il fattoriale? 809 00:39:20,900 --> 00:39:24,850 Qualcuno che ha scritto fuori e che non ha ancora parlato, quello che è la base 810 00:39:24,850 --> 00:39:26,100 caso per fattoriale? 811 00:39:26,100 --> 00:39:28,400 812 00:39:28,400 --> 00:39:30,930 >> STUDENTE: Se n è meno di 2, ritorno 1. 813 00:39:30,930 --> 00:39:33,520 >> JASON HIRSCHHORN: Se n è meno di 2, ritorno 1. 814 00:39:33,520 --> 00:39:37,216 Mi piace, perché si prende cura di 0 e 1. 815 00:39:37,216 --> 00:39:45,290 Così faremo x <2, ritorniamo 1. 816 00:39:45,290 --> 00:39:47,870 Se ci passammo 0, se otteniamo superato 1, questa funzione 817 00:39:47,870 --> 00:39:49,790 restituire immediatamente 1. 818 00:39:49,790 --> 00:39:54,020 Se ci passammo qualche numero maggiore o uguale a 2, stiamo andando a 819 00:39:54,020 --> 00:39:55,370 avere la nostra chiamata ricorsiva. 820 00:39:55,370 --> 00:39:57,855 >> E così come è quella di andare a lavorare? 821 00:39:57,855 --> 00:40:01,070 Può qualcun altro che ha lavorato su questo che non ha ancora parlato mi danno la 822 00:40:01,070 --> 00:40:07,380 chiamata ricorsiva per questa funzione in pseudocodice? 823 00:40:07,380 --> 00:40:10,770 Se veniamo passati in un numero x ed è maggiore di 2, ciò 824 00:40:10,770 --> 00:40:13,370 cosa vogliamo fare? 825 00:40:13,370 --> 00:40:17,930 Abbiamo anche un esempio scritto sul laterale che potrebbe dare un suggerimento. 826 00:40:17,930 --> 00:40:20,770 >> STUDENTE: Chiamare x volte l' fattoriale di x meno 1? 827 00:40:20,770 --> 00:40:22,020 >> JASON HIRSCHHORN: Esattamente. 828 00:40:22,020 --> 00:40:24,610 829 00:40:24,610 --> 00:40:37,750 Stiamo per tornare x volte il fattoriale di x meno 1. 830 00:40:37,750 --> 00:40:41,810 E che, anche se ho scritto, in sostanza, quello che hai detto in inglese, 831 00:40:41,810 --> 00:40:44,580 questa funzione fattoriale andranno chiamato di nuovo. 832 00:40:44,580 --> 00:40:46,320 Sarà eseguito in x meno 1. 833 00:40:46,320 --> 00:40:49,320 Sarà di ritorno con qualche intero, e allora sarà moltiplicare questi due 834 00:40:49,320 --> 00:40:52,050 insieme, e questo valore sarà tornato a qualsiasi chiamata questa 835 00:40:52,050 --> 00:40:55,010 funzione fattoriale, che potrebbe essere un'altra istanza di 836 00:40:55,010 --> 00:40:58,420 questa funzione fattoriale. 837 00:40:58,420 --> 00:41:01,360 >> Così che è un esempio di un ricorsiva funzione, molto 838 00:41:01,360 --> 00:41:02,530 semplice funzione ricorsiva. 839 00:41:02,530 --> 00:41:04,530 Ma la maggior parte di loro sarà come questo. 840 00:41:04,530 --> 00:41:11,170 Se volete un buon ricorsiva sfida per il quiz, provate codifica 841 00:41:11,170 --> 00:41:13,230 ricerca binaria in modo ricorsivo. 842 00:41:13,230 --> 00:41:18,950 Perché se avete fatto la ricerca binaria per problema impostare tre, probabilmente fatto 843 00:41:18,950 --> 00:41:21,730 iterativamente in un ciclo while. 844 00:41:21,730 --> 00:41:23,700 >> Ma può anche essere scritta ricorsivamente. 845 00:41:23,700 --> 00:41:26,310 Stai andando ad avere bisogno di scrivere il proprio funzione separata che richiede un po ' 846 00:41:26,310 --> 00:41:29,020 diversi argomenti della riga di comando - o non gli argomenti della riga di comando, alcuni 847 00:41:29,020 --> 00:41:30,910 diversi argomenti appena regolari. 848 00:41:30,910 --> 00:41:33,870 Ma si potrebbe scrivere binario di ricerca ricorsivamente pure. 849 00:41:33,870 --> 00:41:36,190 >> STUDENTE: Così si potrebbe avere anche scritto, invece di x meno 1, è 850 00:41:36,190 --> 00:41:39,502 avrebbe potuto anche scritto x meno meno, o si potrebbe avere 851 00:41:39,502 --> 00:41:40,830 scritto meno meno x. 852 00:41:40,830 --> 00:41:44,740 Si può solo spiegare molto velocemente perché quelli sarebbero cose diverse, 853 00:41:44,740 --> 00:41:49,510 come quello che è la differenza tra x meno meno e meno meno x? 854 00:41:49,510 --> 00:41:51,320 >> JASON HIRSCHHORN: No, io non sono per andare in quella. 855 00:41:51,320 --> 00:41:55,500 Ma voglio parlarti dopo classe. x meno meno, meno meno x 856 00:41:55,500 --> 00:41:57,780 diminuire x di 1. 857 00:41:57,780 --> 00:41:59,090 Ma lo fanno un po 'diverso. 858 00:41:59,090 --> 00:42:00,340 Ma io non voglio andare in quella. 859 00:42:00,340 --> 00:42:04,330 860 00:42:04,330 --> 00:42:09,090 Altre domande sulla ricorsione o questa funzione? 861 00:42:09,090 --> 00:42:10,140 Che non è davvero anche pseudocodice. 862 00:42:10,140 --> 00:42:15,060 Questo è fondamentalmente il codice C si può scrivere per questo. 863 00:42:15,060 --> 00:42:19,393 >> OK, tutte le altre domande su argomenti qui? 864 00:42:19,393 --> 00:42:19,864 Già. 865 00:42:19,864 --> 00:42:23,130 >> STUDENTE: Ho un breve riassunto di virgola mobile e precisione. 866 00:42:23,130 --> 00:42:24,260 >> JASON HIRSCHHORN: Floating punto e precisione. 867 00:42:24,260 --> 00:42:26,920 Può qualcuno veramente in fretta dammi una carrellata di 868 00:42:26,920 --> 00:42:28,210 in virgola mobile e precisione? 869 00:42:28,210 --> 00:42:30,420 È tutto dovuto fare questo per la vostra problema set, quindi siete tutti 870 00:42:30,420 --> 00:42:31,700 familiarità con esso. 871 00:42:31,700 --> 00:42:35,090 O forse non tutti voi. 872 00:42:35,090 --> 00:42:36,602 Chiunque? 873 00:42:36,602 --> 00:42:39,530 Datemi un punto iniziato. 874 00:42:39,530 --> 00:42:40,750 Virgola mobile e precisione. 875 00:42:40,750 --> 00:42:42,380 Qual è il problema? 876 00:42:42,380 --> 00:42:42,960 Sì. 877 00:42:42,960 --> 00:42:43,680 Victoria? 878 00:42:43,680 --> 00:42:44,480 >> VANESSA: Vanessa. 879 00:42:44,480 --> 00:42:45,285 >> JASON HIRSCHHORN: Vanessa. 880 00:42:45,285 --> 00:42:45,680 Scusi. 881 00:42:45,680 --> 00:42:51,550 >> VANESSA: C'è solo un numero finito di numeri che possono essere rappresentati 882 00:42:51,550 --> 00:42:57,930 perché sei su una, nel nostro caso, un sistema a 32 bit. 883 00:42:57,930 --> 00:43:03,080 Così è sorta di necessario fare un po 'di numeri. 884 00:43:03,080 --> 00:43:03,910 >> JASON HIRSCHHORN: Così che è esattamente a destra. 885 00:43:03,910 --> 00:43:08,110 Ci sono solo una certa quantità di numeri che possono essere rappresentati. 886 00:43:08,110 --> 00:43:11,770 Se si moltiplica due numeri molto grandi, potrebbe straripare l'importo 887 00:43:11,770 --> 00:43:13,950 di spazi dovete rappresentare un numero intero. 888 00:43:13,950 --> 00:43:17,930 Ecco perché a volte usiamo un lunga lunga invece di un int. 889 00:43:17,930 --> 00:43:19,210 Che ha più spazi. 890 00:43:19,210 --> 00:43:21,210 Che può contenere un numero maggiore. 891 00:43:21,210 --> 00:43:24,310 >> Precisione in virgola mobile ha a che fare con che, ma ha anche a che fare con la 892 00:43:24,310 --> 00:43:29,300 fatto che i numeri decimali sono Non sempre rappresentato. 893 00:43:29,300 --> 00:43:29,540 Scusi. 894 00:43:29,540 --> 00:43:31,280 Mettiamola questo back up. 895 00:43:31,280 --> 00:43:36,610 Il numero decimale 1.0 non è sempre rappresentata come ci si aspetterebbe, 896 00:43:36,610 --> 00:43:40,770 1,000 milioni. 897 00:43:40,770 --> 00:43:50,360 A volte è rappresentato come 1,000000001 o 0,999999999. 898 00:43:50,360 --> 00:43:52,780 Si potrebbe addirittura 89 generata da qualche parte. 899 00:43:52,780 --> 00:43:56,560 Quindi quei numeri decimali non sono rappresentata esattamente come si farebbe 900 00:43:56,560 --> 00:43:58,430 aspettano di essere rappresentate. 901 00:43:58,430 --> 00:44:00,010 >> Così nel problema set - 902 00:44:00,010 --> 00:44:00,860 era due? - 903 00:44:00,860 --> 00:44:05,290 problema impostare due, dove abbiamo affrontato con numeri in virgola mobile, quando volevamo 904 00:44:05,290 --> 00:44:08,690 loro di rappresentare esattamente quello che volevamo li per rappresentare il numero 905 00:44:08,690 --> 00:44:12,860 di centesimi, o il numero di centesimi, li moltiplichiamo per 100. 906 00:44:12,860 --> 00:44:14,750 Noi li arrotondato. 907 00:44:14,750 --> 00:44:18,660 E poi abbiamo tagliato tutto dietro il punto decimale. 908 00:44:18,660 --> 00:44:22,020 Che era di assicurare che avrebbero in realtà pari esattamente quello che volevamo 909 00:44:22,020 --> 00:44:22,410 loro pari. 910 00:44:22,410 --> 00:44:26,870 >> Perché quando si prende qualcosa che è un galleggiante e trasformarlo in un int, è 911 00:44:26,870 --> 00:44:29,860 tagliare tutto a destra del punto decimale. 912 00:44:29,860 --> 00:44:33,900 Perché c'è qualche virgola mobile imprecisione, 100.000 potrebbe essere 913 00:44:33,900 --> 00:44:37,440 rappresentato come 99,999999999. 914 00:44:37,440 --> 00:44:40,350 E se appena tagliato fuori tutto destra subito, si sta andando ad 915 00:44:40,350 --> 00:44:41,600 ottenere il numero sbagliato. 916 00:44:41,600 --> 00:44:44,050 917 00:44:44,050 --> 00:44:44,180 Già. 918 00:44:44,180 --> 00:44:45,290 >> STUDENTE: Ho avuto una domanda in merito al casting. 919 00:44:45,290 --> 00:44:47,500 Quale ordine si manifesta in? 920 00:44:47,500 --> 00:44:54,480 Se faresti float, staffe, 1 diviso da 10, fa fare 1 diviso per 10, 921 00:44:54,480 --> 00:44:58,910 quindi ottenere 0.1, quindi accendere in un galleggiante? 922 00:44:58,910 --> 00:45:01,470 >> JASON HIRSCHHORN: Se fate galleggiante 1 diviso 10 - 923 00:45:01,470 --> 00:45:02,550 >> STUDENTE: Sì, e poi uguale - 924 00:45:02,550 --> 00:45:04,240 Beh, sarebbe normalmente averlo uguale a - 925 00:45:04,240 --> 00:45:04,690 Già. 926 00:45:04,690 --> 00:45:06,760 Si vuole fare un galleggiante, giusto? 927 00:45:06,760 --> 00:45:12,790 >> JASON HIRSCHHORN: OK, quindi stiamo andando a l'uso che per SEGUE nel capire 928 00:45:12,790 --> 00:45:15,390 le risposte a queste domande attraverso la codifica. 929 00:45:15,390 --> 00:45:18,180 Perché probabilmente avete un sacco di queste domande minute e un buon modo 930 00:45:18,180 --> 00:45:19,100 risolverli è attraverso codifica. 931 00:45:19,100 --> 00:45:21,320 Quindi stiamo andando a codificare questo proprio ora, e poi stiamo per tornare indietro e 932 00:45:21,320 --> 00:45:24,020 codificare la domanda che avevi. 933 00:45:24,020 --> 00:45:24,950 >> Quindi la prima riga - 934 00:45:24,950 --> 00:45:29,390 Non avrei scritto - a quanto è la prima cosa che vogliamo fare quando si 935 00:45:29,390 --> 00:45:32,250 aprire un nuovo file in gedit? 936 00:45:32,250 --> 00:45:34,190 >> STUDENTE: Includi. 937 00:45:34,190 --> 00:45:35,920 >> JASON HIRSCHHORN: Includi cosa? 938 00:45:35,920 --> 00:45:37,952 >> STUDENTE: biblioteca CS50. 939 00:45:37,952 --> 00:45:39,920 >> JASON HIRSCHHORN: OK. 940 00:45:39,920 --> 00:45:42,590 Cos'altro dovremmo includere? 941 00:45:42,590 --> 00:45:46,820 Stiamo solo andando a controllare cosa succede quando lanci qualcosa ad un galleggiante. 942 00:45:46,820 --> 00:45:48,605 Ma cosa dobbiamo includere se siamo intenzione di scrivere un programma in C? 943 00:45:48,605 --> 00:45:49,300 >> STUDENTE: Standard I / O. 944 00:45:49,300 --> 00:45:50,625 >> JASON HIRSCHHORN: stdio.h. 945 00:45:50,625 --> 00:45:54,880 Noi in realtà non abbiamo bisogno, per questo programma, cs50.h, anche se è 946 00:45:54,880 --> 00:45:55,920 sempre disponibile per includerlo. 947 00:45:55,920 --> 00:45:58,260 Ma abbiamo sempre bisogno stdio.h. 948 00:45:58,260 --> 00:45:59,660 >> STUDENTE: Quando si codifica in C? 949 00:45:59,660 --> 00:46:15,770 >> JASON HIRSCHHORN: Quando si codifica in C. 950 00:46:15,770 --> 00:46:17,090 >> Così si salva come questo. File c. 951 00:46:17,090 --> 00:46:18,590 Ottengo qualche bella evidenziazione della sintassi. 952 00:46:18,590 --> 00:46:22,890 Ho scritto vuoto dentro principale. 953 00:46:22,890 --> 00:46:24,792 Cosa significa nulla dire? 954 00:46:24,792 --> 00:46:26,740 >> STUDENTE: Non viene compiuta alcuna argomenti della riga di comando. 955 00:46:26,740 --> 00:46:28,900 >> JASON Hirschhorn: mezzo vuoto, in questo caso, principale non assume alcuna 956 00:46:28,900 --> 00:46:29,700 argomenti della riga di comando. 957 00:46:29,700 --> 00:46:32,720 In altri casi, significa che la funzione non prende argomenti della riga di comando. 958 00:46:32,720 --> 00:46:36,560 O la funzione, se dovessi scrivere nulla main (void), che direbbe principali del 959 00:46:36,560 --> 00:46:38,460 non tornare nulla. 960 00:46:38,460 --> 00:46:39,960 Quindi nulla solo non significa nulla. 961 00:46:39,960 --> 00:46:42,510 Che cosa avrei scritto se dovessi prendere gli argomenti della riga di comando? 962 00:46:42,510 --> 00:46:45,250 963 00:46:45,250 --> 00:46:47,150 >> STUDENTE: int arco c corda dell'arco v 964 00:46:47,150 --> 00:46:49,055 >> JASON HIRSCHHORN: int argc stringhe argv. 965 00:46:49,055 --> 00:46:54,050 966 00:46:54,050 --> 00:46:55,572 È giusto? 967 00:46:55,572 --> 00:46:58,720 >> STUDENTE: E 'char parentesi stella argv. 968 00:46:58,720 --> 00:47:01,730 >> JASON HIRSCHHORN: Così si potrebbe scrivere staffe stringa argv o char stelle argv 969 00:47:01,730 --> 00:47:03,710 parentesi, ma è necessario staffe. 970 00:47:03,710 --> 00:47:06,290 Perché argv è un array di stringhe, ricordare. 971 00:47:06,290 --> 00:47:07,360 Non è solo una stringa. 972 00:47:07,360 --> 00:47:10,350 Così stringa argv è, qui sta una stringa chiamato argv. 973 00:47:10,350 --> 00:47:13,630 Staffe String argv è, ecco un array di stringhe. 974 00:47:13,630 --> 00:47:17,865 Così int argc staffe stringa argv sarebbe qualcosa che io 975 00:47:17,865 --> 00:47:18,810 probabilmente scrittura. 976 00:47:18,810 --> 00:47:23,050 >> Così si voleva salvare in un intero? 977 00:47:23,050 --> 00:47:24,285 >> STUDENTE: Sì, integer. 978 00:47:24,285 --> 00:47:25,840 O in un galleggiante. 979 00:47:25,840 --> 00:47:26,710 >> JASON HIRSCHHORN: In un galleggiante? 980 00:47:26,710 --> 00:47:30,790 Come, float x è uguale a 1 diviso per 10. 981 00:47:30,790 --> 00:47:32,040 >> JASON HIRSCHHORN: OK. 982 00:47:32,040 --> 00:47:40,160 983 00:47:40,160 --> 00:47:42,240 Come faccio a stampare su un galleggiante in printf? 984 00:47:42,240 --> 00:47:45,100 985 00:47:45,100 --> 00:47:46,714 Cosa? 986 00:47:46,714 --> 00:47:47,560 >> STUDENTE:% f. 987 00:47:47,560 --> 00:47:48,300 >> JASON HIRSCHHORN:% f. 988 00:47:48,300 --> 00:47:50,810 Cos'è un intero? 989 00:47:50,810 --> 00:47:52,110 d o i. 990 00:47:52,110 --> 00:47:53,000 Che cos'è una stringa? 991 00:47:53,000 --> 00:47:54,240 >> STUDENTE: s. 992 00:47:54,240 --> 00:47:56,140 >> JASON HIRSCHHORN: s. 993 00:47:56,140 --> 00:47:57,550 Come posso ottenere una nuova linea? 994 00:47:57,550 --> 00:47:58,800 >> STUDENTE: Barra rovesciata n. 995 00:47:58,800 --> 00:48:04,610 996 00:48:04,610 --> 00:48:07,100 >> JASON HIRSCHHORN: Cosa torno se corre principali correttamente? 997 00:48:07,100 --> 00:48:08,360 >> STUDENTE: 0. 998 00:48:08,360 --> 00:48:09,430 Devo scrivere che la linea, però? 999 00:48:09,430 --> 00:48:10,170 >> STUDENTE: No. 1000 00:48:10,170 --> 00:48:11,513 OK, noi non scriverlo, allora. 1001 00:48:11,513 --> 00:48:16,450 1002 00:48:16,450 --> 00:48:17,190 Chiunque può leggere quella? 1003 00:48:17,190 --> 00:48:18,485 Sembra un po 'piccola. 1004 00:48:18,485 --> 00:48:20,160 Chiunque può vedere, o dovrebbe Faccio più grande? 1005 00:48:20,160 --> 00:48:23,480 1006 00:48:23,480 --> 00:48:25,100 Penso che per la fotocamera, faremo un po 'più grande, però. 1007 00:48:25,100 --> 00:48:35,750 1008 00:48:35,750 --> 00:48:38,410 >> JASON HIRSCHHORN: Se voglio trasformare questo File. C in un file eseguibile, cosa 1009 00:48:38,410 --> 00:48:39,260 scrivo? 1010 00:48:39,260 --> 00:48:41,610 >> STUDENTE: make test. 1011 00:48:41,610 --> 00:48:42,080 >> JASON HIRSCHHORN: Sorry? 1012 00:48:42,080 --> 00:48:42,790 >> STUDENTE: make test. 1013 00:48:42,790 --> 00:48:44,040 >> JASON HIRSCHHORN: make test. 1014 00:48:44,040 --> 00:48:46,700 1015 00:48:46,700 --> 00:48:48,410 Stavamo parlando di questa linea precedente. 1016 00:48:48,410 --> 00:48:49,140 Clang. 1017 00:48:49,140 --> 00:48:51,270 Nei clang? 1018 00:48:51,270 --> 00:48:52,200 Il nome del compilatore. 1019 00:48:52,200 --> 00:48:53,920 Cos'è questa linea? 1020 00:48:53,920 --> 00:48:55,580 >> STUDENTE: Imposta su per l'utilizzo di GDB. 1021 00:48:55,580 --> 00:48:59,230 >> JASON Hirschhorn: Sets che per l'utilizzo di GDB. 1022 00:48:59,230 --> 00:49:02,338 Questa linea, che cos'è? 1023 00:49:02,338 --> 00:49:03,290 >> STUDENTE: codice sorgente. 1024 00:49:03,290 --> 00:49:06,010 >> JASON HIRSCHHORN: Questo è il file di origine, il file c.. 1025 00:49:06,010 --> 00:49:08,150 Che cosa significano queste due righe fanno? 1026 00:49:08,150 --> 00:49:10,245 O queste due righe non. 1027 00:49:10,245 --> 00:49:12,300 >> Studente: nomi che prova. 1028 00:49:12,300 --> 00:49:15,410 >> JASON HIRSCHHORN: Così il cruscotto o dice, denominarlo qualcosa di diverso. 1029 00:49:15,410 --> 00:49:16,790 E qui si sta chiamando test. 1030 00:49:16,790 --> 00:49:18,900 Se non avessi che, quale sarebbe chiamare questo? 1031 00:49:18,900 --> 00:49:20,260 >> STUDENTE: a.out. 1032 00:49:20,260 --> 00:49:22,340 >> JASON HIRSCHHORN: a.out. 1033 00:49:22,340 --> 00:49:25,366 Cosa fa questo? 1034 00:49:25,366 --> 00:49:27,670 >> STUDENTE: Collega la libreria matematica. 1035 00:49:27,670 --> 00:49:29,550 >> JASON HIRSCHHORN: Collega la libreria matematica. 1036 00:49:29,550 --> 00:49:32,880 Non abbiamo incluso la libreria matematica, ma dato che è così comune, hanno 1037 00:49:32,880 --> 00:49:35,780 make scritto di includere sempre la libreria matematica. 1038 00:49:35,780 --> 00:49:39,050 E allo stesso modo, questo include la biblioteca CS50. 1039 00:49:39,050 --> 00:49:43,010 >> OK, quindi se elenchiamo, ora abbiamo un eseguibile chiamato test. 1040 00:49:43,010 --> 00:49:45,150 Per eseguirlo, scrivo test. 1041 00:49:45,150 --> 00:49:48,330 Vedo che il mio virgola mobile, come previsto, è uguale a 0. 1042 00:49:48,330 --> 00:49:50,890 1043 00:49:50,890 --> 00:49:51,590 Ritiene che - 1044 00:49:51,590 --> 00:49:52,060 così - 1045 00:49:52,060 --> 00:49:55,210 >> STUDENTE: Quindi se si mette galleggiare ora, come lanci come float - 1046 00:49:55,210 --> 00:49:56,870 >> JASON HIRSCHHORN: Cast 1 a un galleggiante? 1047 00:49:56,870 --> 00:49:59,180 >> STUDENTE: No, scagli la cosa completa - 1048 00:49:59,180 --> 00:49:59,500 sì. 1049 00:49:59,500 --> 00:50:02,460 Se hai appena fatto questo, sarebbe che la rendono 0.1? 1050 00:50:02,460 --> 00:50:07,170 >> JASON HIRSCHHORN: OK, quindi davvero in fretta, 1 diviso 10, questi sono 1051 00:50:07,170 --> 00:50:08,690 interi scissa. 1052 00:50:08,690 --> 00:50:13,580 Quindi, quando si divide interi, sono 0, e si sta salvando che 0 in un 1053 00:50:13,580 --> 00:50:17,170 float, perché la barra è appena divisione intera. 1054 00:50:17,170 --> 00:50:19,180 Così ora stiamo girando qualcosa in un galleggiante. 1055 00:50:19,180 --> 00:50:21,650 >> Vediamo cosa succede. 1056 00:50:21,650 --> 00:50:22,900 Faremo test. 1057 00:50:22,900 --> 00:50:25,870 1058 00:50:25,870 --> 00:50:31,090 Così ora vediamo che tale barra non era divisione intera, che galleggiava 1059 00:50:31,090 --> 00:50:32,640 punto di divisione. 1060 00:50:32,640 --> 00:50:35,700 Perché uno dei suoi argomenti era stato gettato da un galleggiante. 1061 00:50:35,700 --> 00:50:38,380 Così ora si diceva, trattare questa divisione come abbiamo a che fare con 1062 00:50:38,380 --> 00:50:40,140 punti galleggianti, non con numeri interi. 1063 00:50:40,140 --> 00:50:42,760 E così si ottiene la risposta che ci aspettiamo. 1064 00:50:42,760 --> 00:50:44,620 >> Vediamo cosa succede - 1065 00:50:44,620 --> 00:50:47,103 oops. 1066 00:50:47,103 --> 00:50:51,646 Se volessi stampare più decimale macchie, come potrei farlo? 1067 00:50:51,646 --> 00:50:55,550 >> STUDENTE: Punto punto f, o come molti decimali come si desidera. 1068 00:50:55,550 --> 00:51:02,280 1069 00:51:02,280 --> 00:51:04,440 >> JASON HIRSCHHORN: Così stampo 10 punti decimali. 1070 00:51:04,440 --> 00:51:06,610 E ora vediamo che stiamo ottenendo alcune cose strane. 1071 00:51:06,610 --> 00:51:09,650 E che risale alla tua domanda in merito a virgola mobile imprecisione. 1072 00:51:09,650 --> 00:51:10,950 Ci sono cose strane memorizzati qui. 1073 00:51:10,950 --> 00:51:13,650 1074 00:51:13,650 --> 00:51:15,275 >> OK, questo risponde alla tua domanda? 1075 00:51:15,275 --> 00:51:18,550 1076 00:51:18,550 --> 00:51:20,200 Che altro volevi codificare rapidamente? 1077 00:51:20,200 --> 00:51:25,470 >> STUDENTE: Volevo solo vedere se no, se liberato un po 'di puntatore, 1078 00:51:25,470 --> 00:51:30,410 se tale puntatore ancora aveva immagazzinato in è l'indirizzo di quello che era stato 1079 00:51:30,410 --> 00:51:32,170 indicando precedenza. 1080 00:51:32,170 --> 00:51:34,100 >> JASON HIRSCHHORN: OK, quindi cerchiamo di farlo. 1081 00:51:34,100 --> 00:51:38,030 Char ptr stelle, questo crea una variabile chiamata ptr di tipo char stella. 1082 00:51:38,030 --> 00:51:39,280 Come faccio a scrivere malloc? 1083 00:51:39,280 --> 00:51:40,550 Alden? 1084 00:51:40,550 --> 00:51:41,800 >> ALDEN: Just malloc. 1085 00:51:41,800 --> 00:51:44,820 1086 00:51:44,820 --> 00:51:51,040 Ma poi deve essere di dimensioni e in questo caso, credo che ci si 1087 00:51:51,040 --> 00:51:52,465 essere rivolto a char. 1088 00:51:52,465 --> 00:51:54,450 Quindi sarebbe char. 1089 00:51:54,450 --> 00:51:57,520 >> JASON HIRSCHHORN: OK, quindi più genericamente, Inside - 1090 00:51:57,520 --> 00:51:58,770 cerchiamo di modificare. 1091 00:51:58,770 --> 00:52:05,100 1092 00:52:05,100 --> 00:52:09,260 All'interno malloc, vuoi il numero di byte sul mucchio. 1093 00:52:09,260 --> 00:52:12,320 In generale, quello che abbiamo visto che siamo facendo è che andremo a malloc 1094 00:52:12,320 --> 00:52:14,940 stringhe, per esempio, o array di interi. 1095 00:52:14,940 --> 00:52:21,600 Quindi, se vogliamo 10 interi, o 10 caratteri, 10 ci darà 10. 1096 00:52:21,600 --> 00:52:24,370 E poi le dimensioni dei caratteri darebbe noi che dimensioni di caratteri, in cui 1097 00:52:24,370 --> 00:52:25,120 questo caso è 1 byte. 1098 00:52:25,120 --> 00:52:26,250 Otteniamo 10 byte. 1099 00:52:26,250 --> 00:52:28,540 Se dovessimo scrivere la dimensione di int che ci darebbe 40 byte. 1100 00:52:28,540 --> 00:52:31,520 >> Quindi, più genericamente, all'interno di malloc è il numero di byte che si desidera. 1101 00:52:31,520 --> 00:52:34,620 In questo caso, stiamo ottenendo 1 byte. 1102 00:52:34,620 --> 00:52:36,900 Il che sembra un uso strano di malloc, ma per il nostro 1103 00:52:36,900 --> 00:52:38,470 fini ha senso. 1104 00:52:38,470 --> 00:52:40,420 Quindi c'è questo. 1105 00:52:40,420 --> 00:52:43,420 >> Stiamo per chiamare gratuitamente. 1106 00:52:43,420 --> 00:52:47,040 Ci liberiamo di essa e usiamo di nuovo ptr. 1107 00:52:47,040 --> 00:52:48,750 E che cosa si vuole controllare? 1108 00:52:48,750 --> 00:52:50,550 >> STUDENTE: Volevo solo controllare se o non c'era niente 1109 00:52:50,550 --> 00:52:51,900 all'interno di esso. 1110 00:52:51,900 --> 00:52:53,050 >> JASON HIRSCHHORN: Quindi, se essa ha a qualcosa? 1111 00:52:53,050 --> 00:52:57,740 >> STUDENTE: Sì, esattamente, sia aveva ancora un indirizzo di memoria. 1112 00:52:57,740 --> 00:53:02,220 >> JASON HIRSCHHORN: Quindi vuoi per controllare il valore di ptr? 1113 00:53:02,220 --> 00:53:03,470 >> STUDENTE: Sì, esattamente. 1114 00:53:03,470 --> 00:53:07,940 1115 00:53:07,940 --> 00:53:10,160 >> JASON HIRSCHHORN: cosa scrivo qui se voglio controllare il valore della 1116 00:53:10,160 --> 00:53:11,880 punto - che cosa è, Giordania ha detto, il valore? 1117 00:53:11,880 --> 00:53:13,720 O quello che è memorizzato all'interno di ptr? 1118 00:53:13,720 --> 00:53:14,620 >> STUDENTE: un indirizzo di memoria. 1119 00:53:14,620 --> 00:53:16,330 >> JASON HIRSCHHORN: un indirizzo di memoria. 1120 00:53:16,330 --> 00:53:20,520 Quindi se scrivo solo questo, sarà dammi il valore di ptr. 1121 00:53:20,520 --> 00:53:22,800 E come faccio a stampare su un indirizzo di memoria? 1122 00:53:22,800 --> 00:53:26,470 Qual è la stringa di formato per un indirizzo di memoria? 1123 00:53:26,470 --> 00:53:27,430 >> STUDENTE:% p. 1124 00:53:27,430 --> 00:53:28,050 >> JASON HIRSCHHORN:% p. 1125 00:53:28,050 --> 00:53:29,500 % S è una stringa. 1126 00:53:29,500 --> 00:53:30,750 % P per puntatore. 1127 00:53:30,750 --> 00:53:40,820 1128 00:53:40,820 --> 00:53:43,540 È giusto? 1129 00:53:43,540 --> 00:53:44,790 Che è di destra. 1130 00:53:44,790 --> 00:53:49,450 1131 00:53:49,450 --> 00:53:51,040 Così ptr uguale - 1132 00:53:51,040 --> 00:53:53,350 ha ancora qualcosa in esso. 1133 00:53:53,350 --> 00:53:56,110 1134 00:53:56,110 --> 00:53:57,645 Questo è probabilmente un più domanda interessante. 1135 00:53:57,645 --> 00:53:59,198 Che cosa fa il suo effetto? 1136 00:53:59,198 --> 00:54:00,830 >> STUDENTE: guasti Seg. 1137 00:54:00,830 --> 00:54:01,310 >> JASON HIRSCHHORN: Cosa? 1138 00:54:01,310 --> 00:54:02,678 >> STUDENTE: Penso che Seg difetti. 1139 00:54:02,678 --> 00:54:03,574 >> JASON HIRSCHHORN: Hm? 1140 00:54:03,574 --> 00:54:04,920 >> STUDENTE: Penso che sarà Seg colpa. 1141 00:54:04,920 --> 00:54:08,265 >> JASON HIRSCHHORN: Quindi questa linea di codice, stella ptr, cosa 1142 00:54:08,265 --> 00:54:10,152 significa la stella? 1143 00:54:10,152 --> 00:54:11,240 >> STUDENTE: Contenuto. 1144 00:54:11,240 --> 00:54:11,560 >> JASON HIRSCHHORN: Già. 1145 00:54:11,560 --> 00:54:13,910 Andare per ottenere il contenuto di. 1146 00:54:13,910 --> 00:54:16,830 Quindi questo sta per andare alla memoria affrontare lì e mi dia quello. 1147 00:54:16,830 --> 00:54:21,030 Ho usato% c proprio qui, perché ci sono caratteri memorizzate. 1148 00:54:21,030 --> 00:54:23,390 Quindi stiamo per andare a tale indirizzo si appena visto - o probabilmente sarà un 1149 00:54:23,390 --> 00:54:25,190 po 'questo diverso volta corriamo il programma. 1150 00:54:25,190 --> 00:54:28,010 Ma andiamo a questo indirizzo che, come sappiamo esiste ancora 1151 00:54:28,010 --> 00:54:29,260 e vedere cosa c'è. 1152 00:54:29,260 --> 00:54:35,640 1153 00:54:35,640 --> 00:54:37,110 >> Quindi non Seg colpa. 1154 00:54:37,110 --> 00:54:38,970 Semplicemente non ci ha dato nulla. 1155 00:54:38,970 --> 00:54:43,350 Avrebbe potuto effettivamente ci ha dato qualcosa, noi non può vederlo. 1156 00:54:43,350 --> 00:54:45,110 E che risale a questa idea - 1157 00:54:45,110 --> 00:54:47,270 e non stiamo andando ottenere troppo in questo, perché è al di là del 1158 00:54:47,270 --> 00:54:48,460 scopo di questo corso. 1159 00:54:48,460 --> 00:54:51,260 Ma abbiamo parlato qui, se noi è andato oltre i limiti della matrice da 1160 00:54:51,260 --> 00:54:54,890 1, potremmo non finire nei guai. 1161 00:54:54,890 --> 00:54:58,550 >> A volte, quando basta andare fuori da 1, che stai facendo qualcosa di sbagliato, e si 1162 00:54:58,550 --> 00:54:59,220 potrebbe finire nei guai. 1163 00:54:59,220 --> 00:55:00,820 Ma non sempre nei guai. 1164 00:55:00,820 --> 00:55:05,170 Dipende quanto di una cosa negativa si fa, si sta andando a finire nei guai. 1165 00:55:05,170 --> 00:55:07,790 Il che non vuol dire, essere sciatto con il codice. 1166 00:55:07,790 --> 00:55:12,080 Ma è da dire, il programma non sarà sempre uscire, anche se si va da qualche parte 1167 00:55:12,080 --> 00:55:14,130 non dovresti andare. 1168 00:55:14,130 --> 00:55:18,170 >> Un buon esempio di ciò è, un sacco di persone nella loro problema set 3, che 1169 00:55:18,170 --> 00:55:22,350 era 15, non ha controllato l' limiti della pensione. 1170 00:55:22,350 --> 00:55:25,860 Così si guardava a sinistra, guardato al a destra, guardò verso l'alto, sembrava 1171 00:55:25,860 --> 00:55:27,000 al fondo. 1172 00:55:27,000 --> 00:55:31,540 Ma non è stata selezionata per vedere se il top era in realtà sta per essere sulla scheda. 1173 00:55:31,540 --> 00:55:35,220 E un sacco di persone che hanno fatto questo e girato che nel loro programma ha funzionato 1174 00:55:35,220 --> 00:55:38,960 perfettamente, perché dove quel consiglio era in memoria, se sei andato un 1175 00:55:38,960 --> 00:55:42,300 sopra o controllato che la memoria indirizzo, non c'era niente 1176 00:55:42,300 --> 00:55:44,870 particolarmente orribile che, in modo che il programma non è stato 1177 00:55:44,870 --> 00:55:45,970 andando a urlare a voi. 1178 00:55:45,970 --> 00:55:48,870 >> Ma ci sarebbe ancora decollare punti se non è stata selezionata, perché si 1179 00:55:48,870 --> 00:55:50,850 stavano facendo qualcosa che non eri dovuto fare, e si potrebbe avere 1180 00:55:50,850 --> 00:55:51,860 messo nei guai. 1181 00:55:51,860 --> 00:55:54,040 Le probabilità sono, però, probabilmente non l'hai fatto. 1182 00:55:54,040 --> 00:55:57,790 Quindi questo è quello di mostrare che, sì, possiamo ancora andare ad esso. 1183 00:55:57,790 --> 00:55:59,010 E non stiamo ottenendo in problemi in questo caso. 1184 00:55:59,010 --> 00:56:04,000 Se abbiamo cercato di fare leggere il prossimi 100 caratteri, saremmo 1185 00:56:04,000 --> 00:56:06,000 probabilmente finire nei guai. 1186 00:56:06,000 --> 00:56:09,400 E si può codificare leggere il prossimo 100 caratteri se volete facendo qualche 1187 00:56:09,400 --> 00:56:10,110 una sorta di ciclo for. 1188 00:56:10,110 --> 00:56:10,850 Già. 1189 00:56:10,850 --> 00:56:16,250 >> STUDENTE: Dal momento che ci è stata assegnata che spazio un valore reale, non avremmo 1190 00:56:16,250 --> 00:56:17,050 effettivamente in grado di vedere nulla. 1191 00:56:17,050 --> 00:56:21,740 Dovremmo provare con l'impostazione che uguale come C o qualcosa del genere? 1192 00:56:21,740 --> 00:56:22,640 >> JASON HIRSCHHORN: Ottima domanda. 1193 00:56:22,640 --> 00:56:25,340 Come faccio a impostare quel valore - 1194 00:56:25,340 --> 00:56:28,980 Cosa riga di codice faccio a scrivere on line sette a fare quello che hai detto? 1195 00:56:28,980 --> 00:56:34,040 >> STUDENTE: Stella ptr uguale singolo citazione c terminare sola offerta. 1196 00:56:34,040 --> 00:56:36,970 >> JASON HIRSCHHORN: So che sta mettendo un carattere, c, in tale posizione, 1197 00:56:36,970 --> 00:56:40,200 perché ancora una volta, quella stella significa andare a lì. 1198 00:56:40,200 --> 00:56:43,320 E quando viene utilizzato sul lato sinistro un operatore di assegnazione, che equivale a 1199 00:56:43,320 --> 00:56:47,270 segno, non stiamo andando a ottenere che valore tanto quanto impostato tale valore. 1200 00:56:47,270 --> 00:56:48,520 Ora vediamo cosa succede. 1201 00:56:48,520 --> 00:56:54,700 1202 00:56:54,700 --> 00:56:56,770 >> Abbiamo messo qualcosa lì ed era lì. 1203 00:56:56,770 --> 00:56:58,000 Abbiamo chiamato libero. 1204 00:56:58,000 --> 00:57:00,100 Alcune cose probabilmente è accaduto sul mucchio. 1205 00:57:00,100 --> 00:57:01,890 Quindi non è più lì. 1206 00:57:01,890 --> 00:57:07,440 Ma ancora una volta, non stiamo ottenendo nei guai per andare lì. 1207 00:57:07,440 --> 00:57:10,260 >> Io sto facendo questo in codice per illustrare che molti di questi 1208 00:57:10,260 --> 00:57:12,410 domande che avete, sono davvero interessante 1209 00:57:12,410 --> 00:57:13,650 risponde un sacco di tempo. 1210 00:57:13,650 --> 00:57:15,260 E sono davvero buone domande. 1211 00:57:15,260 --> 00:57:19,010 E si può capire su il proprio se, per esempio, 1212 00:57:19,010 --> 00:57:19,990 non siamo in sezione. 1213 00:57:19,990 --> 00:57:20,940 Già. 1214 00:57:20,940 --> 00:57:24,430 >> STUDENTE: Perché non stai inviando l' puntatore ovunque, avete bisogno di 1215 00:57:24,430 --> 00:57:26,530 usare malloc? 1216 00:57:26,530 --> 00:57:28,400 >> JASON HIRSCHHORN: Quindi questo va indietro alla tua domanda iniziale. 1217 00:57:28,400 --> 00:57:28,620 [? ?] 1218 00:57:28,620 --> 00:57:29,980 E 'solo una variabile locale? 1219 00:57:29,980 --> 00:57:32,280 Malloc qui non è convincente. 1220 00:57:32,280 --> 00:57:35,260 L'uso di malloc qui non è che convincente perché è 1221 00:57:35,260 --> 00:57:36,500 solo una variabile locale. 1222 00:57:36,500 --> 00:57:40,970 >> STUDENTE: Allora potresti fare char stella ptr uguale ciao? 1223 00:57:40,970 --> 00:57:41,400 >> JASON HIRSCHHORN: Oh. 1224 00:57:41,400 --> 00:57:43,300 Quindi stiamo andando ora di tornare alla tua domanda iniziale. 1225 00:57:43,300 --> 00:57:46,885 Penso che tu non eri soddisfatto con la mia risposta. 1226 00:57:46,885 --> 00:57:48,220 OK? 1227 00:57:48,220 --> 00:57:49,226 Ti piace questo? 1228 00:57:49,226 --> 00:57:49,682 >> STUDENTE: Già. 1229 00:57:49,682 --> 00:57:50,932 Aspetta. 1230 00:57:50,932 --> 00:57:54,090 1231 00:57:54,090 --> 00:57:57,850 >> JASON HIRSCHHORN: E dove vuoi stampare? 1232 00:57:57,850 --> 00:58:00,026 Quindi dovremo stampare una stringa del genere? 1233 00:58:00,026 --> 00:58:06,380 1234 00:58:06,380 --> 00:58:07,630 >> STUDENTE: Interessante. 1235 00:58:07,630 --> 00:58:09,900 1236 00:58:09,900 --> 00:58:14,285 >> JASON HIRSCHHORN: Quindi questo lo dice argomento ha il tipo di carattere. 1237 00:58:14,285 --> 00:58:17,200 1238 00:58:17,200 --> 00:58:18,620 Quindi, questo dovrebbe essere un carattere. 1239 00:58:18,620 --> 00:58:25,170 1240 00:58:25,170 --> 00:58:26,280 >> STUDENTE: prende solo il primo. 1241 00:58:26,280 --> 00:58:28,610 >> JASON HIRSCHHORN: Quindi questo è quello che ho detto prima. 1242 00:58:28,610 --> 00:58:34,240 Come ho detto, non è memorizzare la stringa all'interno puntatore variabile. 1243 00:58:34,240 --> 00:58:35,120 E 'la memorizzazione - 1244 00:58:35,120 --> 00:58:36,350 >> STUDENTE: Il primo valore della stringa. 1245 00:58:36,350 --> 00:58:40,810 >> JASON HIRSCHHORN: L'indirizzo del il primo valore della stringa. 1246 00:58:40,810 --> 00:58:46,940 Se dovessimo stampare questo, siamo ottenere il valore all'interno del puntatore. 1247 00:58:46,940 --> 00:58:51,005 E vedremo che è, in effetti, un indirizzo di memoria. 1248 00:58:51,005 --> 00:58:53,595 1249 00:58:53,595 --> 00:58:56,440 >> Ritiene che senso? 1250 00:58:56,440 --> 00:58:56,940 Scusi. 1251 00:58:56,940 --> 00:58:58,996 Aspetta, questo risponde alla tua questione, però? 1252 00:58:58,996 --> 00:58:59,790 >> STUDENTE: Già. 1253 00:58:59,790 --> 00:59:05,830 >> JASON HIRSCHHORN: questa riga di codice è la creazione di una stringa e poi un altro 1254 00:59:05,830 --> 00:59:09,115 puntatore variabile che sta puntando a tale stringa, tale matrice. 1255 00:59:09,115 --> 00:59:14,320 1256 00:59:14,320 --> 00:59:14,980 Già. 1257 00:59:14,980 --> 00:59:19,200 >> STUDENTE: Quindi, se siamo andati un ricordo affrontare ulteriormente, potremmo ottenere l'h? 1258 00:59:19,200 --> 00:59:21,990 1259 00:59:21,990 --> 00:59:23,150 È stato memorizzato come una stringa? 1260 00:59:23,150 --> 00:59:24,400 >> JASON HIRSCHHORN: Come, abbiamo fatto - 1261 00:59:24,400 --> 00:59:28,540 1262 00:59:28,540 --> 00:59:30,790 quindi questo è prezioso per fare. 1263 00:59:30,790 --> 00:59:33,780 Questo è il punto aritmetica, che voi ragazzi ha visto prima e dovrebbe essere 1264 00:59:33,780 --> 00:59:35,550 relativamente a proprio agio. 1265 00:59:35,550 --> 00:59:36,905 Questo è simile alla scrittura - 1266 00:59:36,905 --> 00:59:41,980 1267 00:59:41,980 --> 00:59:46,350 se dovessimo scrivere questa riga di codice, abbiamo visto notazione di matrice prima. 1268 00:59:46,350 --> 00:59:55,900 Questo ci dovrebbe dare la seconda valore in questo array, h. 1269 00:59:55,900 --> 01:00:05,010 >> Se abbiamo fatto questo, questo dovrebbe anche dare noi il secondo valore in tale matrice. 1270 01:00:05,010 --> 01:00:08,320 Perché non sta per la memoria indirizzo la prima cosa, ma la 1271 01:00:08,320 --> 01:00:10,530 indirizzo di memoria della cosa uno sopra. 1272 01:00:10,530 --> 01:00:14,360 E poi le dereferenziazioni operatore stelle tale puntatore. 1273 01:00:14,360 --> 01:00:16,940 E ancora, vediamo. 1274 01:00:16,940 --> 01:00:18,664 Otteniamo nuovamente h. 1275 01:00:18,664 --> 01:00:20,980 >> STUDENTE: Cosa fa esattamente dereferenziare significa? 1276 01:00:20,980 --> 01:00:23,650 >> JASON HIRSCHHORN: Dereference è una parola di fantasia per andare. 1277 01:00:23,650 --> 01:00:26,390 Vai a questo e ottenere quello che c'è è quello di dereference un puntatore. 1278 01:00:26,390 --> 01:00:28,240 E 'solo una parola di fantasia per questo. 1279 01:00:28,240 --> 01:00:29,986 >> STUDENTE: Se volessimo stampa l'intera stringa, potremmo 1280 01:00:29,986 --> 01:00:31,930 fare puntatore commerciale? 1281 01:00:31,930 --> 01:00:33,490 >> JASON HIRSCHHORN: OK, siamo andando a mettere in pausa qui. 1282 01:00:33,490 --> 01:00:35,480 Stiamo andando a finire qui. 1283 01:00:35,480 --> 01:00:41,760 Ampersand ti dà l'indirizzo di un posizione, in modo che quando si fa commerciale di 1284 01:00:41,760 --> 01:00:44,080 una variabile, ti dà l'indirizzo in cui è memorizzata la variabile. 1285 01:00:44,080 --> 01:00:48,580 Puntatore Ampersand vi darà l' Indirizzo di ptr dove ptr è in memoria. 1286 01:00:48,580 --> 01:00:50,140 >> Non abbiamo intenzione di andare avanti con questo esempio. 1287 01:00:50,140 --> 01:00:52,640 Si può capire questi cose da soli. 1288 01:00:52,640 --> 01:00:55,740 Ma ancora una volta, questo potrebbe anche essere sull'orlo di un po 'oltre quello che è necessario sapere per 1289 01:00:55,740 --> 01:00:58,000 lo scopo di questo medio termine - 1290 01:00:58,000 --> 01:00:59,070 o questo quiz, piuttosto. 1291 01:00:59,070 --> 01:01:00,270 Scusi. 1292 01:01:00,270 --> 01:01:03,770 >> Stiamo per andare avanti, perché vorrei piacerebbe fare un problema di codifica 1293 01:01:03,770 --> 01:01:05,100 prima che il tempo è scaduto. 1294 01:01:05,100 --> 01:01:09,340 E ci accingiamo a codificare ciò che penso è il più interessante di questi 1295 01:01:09,340 --> 01:01:11,020 esempi, atoi. 1296 01:01:11,020 --> 01:01:14,520 Quindi questa era una domanda su un quiz due anni fa. 1297 01:01:14,520 --> 01:01:17,810 E ho sul bordo qui. 1298 01:01:17,810 --> 01:01:20,680 >> La gente è stato chiesto il quiz - 1299 01:01:20,680 --> 01:01:23,640 sono stati dati un po 'più in tesxt la domanda, ma ho eliminato l' 1300 01:01:23,640 --> 01:01:26,640 testo perché era inutile per i nostri scopi momento. 1301 01:01:26,640 --> 01:01:29,180 Era solo alcuni retroscena su ciò che atoi fatto. 1302 01:01:29,180 --> 01:01:31,425 Ma tutti voi conoscete e siete molto familiarità con atoi. 1303 01:01:31,425 --> 01:01:35,620 >> Vi suggerisco di codificare questo su un foglio di carta. 1304 01:01:35,620 --> 01:01:39,310 Suggerisco anche di usare la strategia che siamo andati oltre 1305 01:01:39,310 --> 01:01:41,040 molto nella nostra sezione. 1306 01:01:41,040 --> 01:01:44,130 In primo luogo, assicurarsi di aver compreso cosa atoi sta facendo. 1307 01:01:44,130 --> 01:01:47,580 Fai un disegno o trovare un qualche immagine mentale di esso nella vostra testa. 1308 01:01:47,580 --> 01:01:51,120 Avanti, scrivere pseudocodice per questo. 1309 01:01:51,120 --> 01:01:53,120 Sul quiz, se tutti si ottiene è pseudocodice, almeno si 1310 01:01:53,120 --> 01:01:54,550 mettere giù qualcosa. 1311 01:01:54,550 --> 01:02:00,070 E poi la mappa che pseudocode su C. Se si dispone di un controllo nella vostra 1312 01:02:00,070 --> 01:02:03,760 pseudocodice, come controllare se qualcosa è 1, che le mappe su un caso 1313 01:02:03,760 --> 01:02:05,750 condizioni e così via. 1314 01:02:05,750 --> 01:02:07,850 E, infine, il codice del programma in C. 1315 01:02:07,850 --> 01:02:15,000 >> Quindi, tornare a atoi e prendere cinque minuti codificare ciò su un foglio di 1316 01:02:15,000 --> 01:02:19,480 carta, che è probabilmente sulla quantità di tempo che si sarebbe assumere un 1317 01:02:19,480 --> 01:02:21,260 quiz a atoi codice. 1318 01:02:21,260 --> 01:02:27,060 Cinque a 15 minuti, cinque a 12, cinque a 10 minuti, è del numero di 1319 01:02:27,060 --> 01:02:30,150 il tempo che ci si spende su questo domanda del quiz. 1320 01:02:30,150 --> 01:02:31,670 Quindi prendere cinque minuti adesso, per favore. 1321 01:02:31,670 --> 01:02:35,957 E se avete domande, sollevare la tua mano e vengo in giro. 1322 01:02:35,957 --> 01:06:39,570 1323 01:06:39,570 --> 01:06:41,066 >> [CONVERSAZIONI LATERALI] 1324 01:06:41,066 --> 01:08:35,279 1325 01:08:35,279 --> 01:08:37,580 >> JASON HIRSCHHORN: OK, così che era di cinque minuti. 1326 01:08:37,580 --> 01:08:39,880 Questo è stato probabilmente circa la quantità di volta che si era speso per che in un quiz, 1327 01:08:39,880 --> 01:08:42,120 forse la fascia bassa di quel tempo. 1328 01:08:42,120 --> 01:08:44,010 Ti ricapitolare un po '. 1329 01:08:44,010 --> 01:08:45,740 Cominciamo questa codifica. 1330 01:08:45,740 --> 01:08:49,479 E se non otteniamo tutto il percorso attraverso, le risposte a questo e questo 1331 01:08:49,479 --> 01:08:54,189 quiz domanda sono disponibili, ancora una volta, Autunno 2011 è quando questa domanda 1332 01:08:54,189 --> 01:08:54,913 apparso sul quiz. 1333 01:08:54,913 --> 01:08:57,830 >> E ne è valsa otto punti il quiz poi. 1334 01:08:57,830 --> 01:09:01,140 Otto punti è sulla fascia alta del quantità di punti qualcosa vale la pena. 1335 01:09:01,140 --> 01:09:04,790 La maggior parte delle domande sono nell'intervallo da uno a sei punti. 1336 01:09:04,790 --> 01:09:08,500 Quindi questo è un più impegnativo domanda, di sicuro. 1337 01:09:08,500 --> 01:09:09,750 Qualcuno può farmi iniziare? 1338 01:09:09,750 --> 01:09:13,260 1339 01:09:13,260 --> 01:09:15,380 >> In generale, che cosa stiamo andando a voler fare con questo 1340 01:09:15,380 --> 01:09:17,550 funzione atoi, logicamente? 1341 01:09:17,550 --> 01:09:19,569 Che cosa vogliamo fare? 1342 01:09:19,569 --> 01:09:22,279 Quindi stiamo andando a scrivere alcuni pseudocodice. 1343 01:09:22,279 --> 01:09:24,090 >> STUDENTE: Convertire caratteri in numeri interi. 1344 01:09:24,090 --> 01:09:26,700 >> JASON HIRSCHHORN: Convertire caratteri in numeri interi. 1345 01:09:26,700 --> 01:09:27,479 OK. 1346 01:09:27,479 --> 01:09:30,870 Quindi, quanti caratteri siamo andando ad avere bisogno di passare attraverso? 1347 01:09:30,870 --> 01:09:32,295 >> STUDENTE: Tutti loro. 1348 01:09:32,295 --> 01:09:34,100 >> STUDENTE: Tutti i personaggi nella stringa. 1349 01:09:34,100 --> 01:09:35,540 >> JASON HIRSCHHORN: Tutte le caratteri della stringa. 1350 01:09:35,540 --> 01:09:42,180 Quindi se volevamo passare attraverso ogni carattere di una stringa, che cosa è una cosa 1351 01:09:42,180 --> 01:09:44,560 in C abbiamo visto che ha permesso noi di andare attraverso ogni 1352 01:09:44,560 --> 01:09:45,939 carattere di una stringa? 1353 01:09:45,939 --> 01:09:46,819 >> STUDENTI: Un ciclo for. 1354 01:09:46,819 --> 01:09:48,069 >> JASON HIRSCHHORN: Un ciclo for. 1355 01:09:48,069 --> 01:09:52,020 1356 01:09:52,020 --> 01:09:55,330 Quindi stiamo andando a scorrere ogni personaggio in s. 1357 01:09:55,330 --> 01:10:00,940 >> Allora che cosa stiamo andando a voler fare quando otteniamo un carattere specifico? 1358 01:10:00,940 --> 01:10:02,480 Dire che siamo sempre passati a 90. 1359 01:10:02,480 --> 01:10:03,460 Otteniamo il 9. 1360 01:10:03,460 --> 01:10:04,240 E 'un personaggio. 1361 01:10:04,240 --> 01:10:07,440 Che cosa vogliamo fare con quel personaggio 9? 1362 01:10:07,440 --> 01:10:10,082 >> STUDENTE: Sottrarre dal carattere 0? 1363 01:10:10,082 --> 01:10:11,860 >> STUDENTE: Aggiungi 0? 1364 01:10:11,860 --> 01:10:13,350 >> JASON HIRSCHHORN: Sottrarre dal carattere 0? 1365 01:10:13,350 --> 01:10:13,800 >> STUDENTE: Già. 1366 01:10:13,800 --> 01:10:15,573 >> JASON HIRSCHHORN: Perché vuoi fare? 1367 01:10:15,573 --> 01:10:16,560 >> STUDENTE: [incomprensibile] 1368 01:10:16,560 --> 01:10:17,010 valore. 1369 01:10:17,010 --> 01:10:18,380 Il suo valore int. 1370 01:10:18,380 --> 01:10:21,580 >> JASON HIRSCHHORN: OK, quindi prendiamo il carattere 9, sottrarre da 1371 01:10:21,580 --> 01:10:25,820 carattere 0 per ottenere un integer reale 9. 1372 01:10:25,820 --> 01:10:27,070 Dolce. 1373 01:10:27,070 --> 01:10:31,255 1374 01:10:31,255 --> 01:10:37,000 E come fai a sapere che carattere 9 minus 0 personaggio è 9? 1375 01:10:37,000 --> 01:10:39,222 Cosa tabella hai guardato? 1376 01:10:39,222 --> 01:10:43,130 >> STUDENTE: Ci sono logicamente nove posti tra 9 e 0. 1377 01:10:43,130 --> 01:10:44,620 Oppure si potrebbe guardare la tabella ASCII. 1378 01:10:44,620 --> 01:10:45,120 >> JASON HIRSCHHORN: tabella ASCII. 1379 01:10:45,120 --> 01:10:46,490 Ma sì, siete sulla strada giusta pure. 1380 01:10:46,490 --> 01:10:47,780 Quindi sottraiamo 0. 1381 01:10:47,780 --> 01:10:49,010 Così ora abbiamo l'intero 9. 1382 01:10:49,010 --> 01:10:49,970 E cosa vogliamo fare con questo? 1383 01:10:49,970 --> 01:10:54,970 Se abbiamo 90, è il primo intero abbiamo, cosa vogliamo fare? 1384 01:10:54,970 --> 01:10:58,180 >> STUDENTE: avevo messo in un intero temporaneo array, quindi fare matematica ad esso 1385 01:10:58,180 --> 01:11:02,088 successivamente a farne una fine. 1386 01:11:02,088 --> 01:11:03,020 >> JASON HIRSCHHORN: OK. 1387 01:11:03,020 --> 01:11:06,990 >> STUDENTE: Si può iniziare alla fine del la matrice e poi andare avanti così 1388 01:11:06,990 --> 01:11:10,350 che ogni volta che si sposta in avanti, si moltiplica per 10. 1389 01:11:10,350 --> 01:11:10,830 >> JASON HIRSCHHORN: OK. 1390 01:11:10,830 --> 01:11:12,250 Che suona come un bel idea convincente. 1391 01:11:12,250 --> 01:11:16,040 Possiamo iniziare alla fine del nostro array, e possiamo usare strleng. 1392 01:11:16,040 --> 01:11:17,030 Possiamo usare strleng qui. 1393 01:11:17,030 --> 01:11:18,870 Avremo la lunghezza della nostra stringa. 1394 01:11:18,870 --> 01:11:20,100 Partiamo dalla fine. 1395 01:11:20,100 --> 01:11:29,170 E + il primo, dobbiamo solo prendere che intero, e magari creiamo come un 1396 01:11:29,170 --> 01:11:32,270 nuova variabile intera sulla parte superiore dove stiamo memorizzare tutto. 1397 01:11:32,270 --> 01:11:37,340 Così abbiamo ciclo attraverso ogni carattere in s da posteriore a quella anteriore, sottraiamo 0, e 1398 01:11:37,340 --> 01:11:42,790 poi lo prendiamo e, a seconda dove si trova, lo moltiplichiamo 1399 01:11:42,790 --> 01:11:45,860 da una potenza di 10. 1400 01:11:45,860 --> 01:11:50,644 Perché il primo, quello che facciamo moltiplicare il carattere più a destra da? 1401 01:11:50,644 --> 01:11:51,440 >> STUDENTE: 10 a 0. 1402 01:11:51,440 --> 01:11:53,170 >> JASON HIRSCHHORN: 10 a 0. 1403 01:11:53,170 --> 01:11:56,010 Cosa ci moltiplichiamo la seconda carattere più a destra da? 1404 01:11:56,010 --> 01:11:57,450 >> STUDENTE: [incomprensibile]. 1405 01:11:57,450 --> 01:11:57,960 >> JASON HIRSCHHORN: Cosa? 1406 01:11:57,960 --> 01:11:59,150 >> STUDENTE: 10 a 1. 1407 01:11:59,150 --> 01:12:00,420 >> JASON HIRSCHHORN: 10 a 1. 1408 01:12:00,420 --> 01:12:03,754 Il carattere terza a destra? 1409 01:12:03,754 --> 01:12:04,580 >> STUDENTE: 10 a 2. 1410 01:12:04,580 --> 01:12:05,350 >> JASON HIRSCHHORN: 10 a 2. 1411 01:12:05,350 --> 01:12:07,200 >> STUDENTE: Mi dispiace, non capisco quello che stiamo facendo qui. 1412 01:12:07,200 --> 01:12:08,640 >> JASON HIRSCHHORN: OK, Torniamo, allora. 1413 01:12:08,640 --> 01:12:12,500 Quindi stiamo andando ottenere passato in una stringa. 1414 01:12:12,500 --> 01:12:14,470 Perché stiamo scrivendo atoi. 1415 01:12:14,470 --> 01:12:15,260 Così otteniamo passati in una stringa. 1416 01:12:15,260 --> 01:12:17,640 Dire che siamo sempre passati nella stringa 90. 1417 01:12:17,640 --> 01:12:19,930 >> La prima cosa che andremo a fare è impostare una nuova variabile intera che siamo 1418 01:12:19,930 --> 01:12:22,150 solo andando a creare come il nostro nuovo intero. 1419 01:12:22,150 --> 01:12:24,630 Questo è quello che stiamo andando per tornare alla fine. 1420 01:12:24,630 --> 01:12:30,110 Abbiamo bisogno di passare attraverso ogni carattere la stringa perché abbiamo stabilito 1421 01:12:30,110 --> 01:12:34,430 che abbiamo bisogno di toccare ciascuno e quindi aggiungere al nostro nuovo intero. 1422 01:12:34,430 --> 01:12:36,330 >> Ma non possiamo aggiungere come un numero. 1423 01:12:36,330 --> 01:12:38,270 Non possiamo prendere 9 e aggiungere 9 al nostro numero intero. 1424 01:12:38,270 --> 01:12:40,560 Dipende da quale posto è nella stringa. 1425 01:12:40,560 --> 01:12:42,960 Stiamo andando ad avere bisogno di moltiplicare esso da una potenza di 10. 1426 01:12:42,960 --> 01:12:45,580 Perché questo è il modo base di 10 opere. 1427 01:12:45,580 --> 01:12:49,050 >> Quindi stiamo andando ad ottenere l'attuale carattere, o l'intero effettivo 1428 01:12:49,050 --> 01:12:53,860 numero, sottraendo carattere 0 dal carattere 9 come abbiamo fatto con 1429 01:12:53,860 --> 01:12:57,560 sottraendo capitali carattere A da qualunque personaggio che abbiamo avuto in una delle 1430 01:12:57,560 --> 01:12:58,120 questi problemi. 1431 01:12:58,120 --> 01:13:04,190 Quindi dovremo effettivamente ottenere un numero da 0 a 9 salvato come un numero reale, e ti 1432 01:13:04,190 --> 01:13:07,590 moltiplicarlo per una potenza di 10 a seconda dove siamo nella stringa. 1433 01:13:07,590 --> 01:13:19,430 1434 01:13:19,430 --> 01:13:22,575 E poi stiamo andando ad aggiungere di nuovo nella nostra nuova variabile intera. 1435 01:13:22,575 --> 01:13:32,840 1436 01:13:32,840 --> 01:13:37,890 >> Così che cosa sarebbe simile farebbe essere - disegneremo qui. 1437 01:13:37,890 --> 01:13:40,086 Se veniamo passati nella stringa di 90 - 1438 01:13:40,086 --> 01:13:41,336 >> STUDENTE: [incomprensibile]. 1439 01:13:41,336 --> 01:13:43,190 1440 01:13:43,190 --> 01:13:45,540 >> JASON HIRSCHHORN: Ma atoi prende una stringa. 1441 01:13:45,540 --> 01:13:46,350 Quindi stiamo per passare attraverso l'azienda. 1442 01:13:46,350 --> 01:13:49,900 Ti avere superato nel 90. 1443 01:13:49,900 --> 01:13:51,540 Usciamo dal retro al fronte. 1444 01:13:51,540 --> 01:13:53,920 Prendiamo il 0. 1445 01:13:53,920 --> 01:13:55,080 >> STUDENTE: Mi dispiace. 1446 01:13:55,080 --> 01:13:55,880 Forse questo è stupido. 1447 01:13:55,880 --> 01:13:59,440 Se stiamo ottenendo passati in una stringa, perché è 90 ciò che siamo 1448 01:13:59,440 --> 01:14:00,260 sempre passato in? 1449 01:14:00,260 --> 01:14:03,160 Dato che 90 è un numero intero. 1450 01:14:03,160 --> 01:14:06,820 >> JASON HIRSCHHORN: Perché atoi prende una stringa e lo trasforma in numero intero 1451 01:14:06,820 --> 01:14:08,320 rappresentazione di quella stringa. 1452 01:14:08,320 --> 01:14:13,650 Ma la stringa 90 non è il numero intero 90 o il numero 90. 1453 01:14:13,650 --> 01:14:17,920 La stringa 90 è un array di due, o tre personaggi, anzi, il 9 1454 01:14:17,920 --> 01:14:22,740 carattere, il carattere 0, e il backslash carattere 0. 1455 01:14:22,740 --> 01:14:26,260 >> E stiamo scrivendo atoi perché, per esempio, quando si prende il comando 1456 01:14:26,260 --> 01:14:30,230 argomento della riga, ed è salvato in argv, viene salvato come stringa. 1457 01:14:30,230 --> 01:14:32,940 Ma se si vuole trattare come un numero, è necessario convertirlo in un 1458 01:14:32,940 --> 01:14:34,700 integer reale. 1459 01:14:34,700 --> 01:14:37,210 Che abbiamo fatto una delle nostre serie di problemi. 1460 01:14:37,210 --> 01:14:38,800 Che abbiamo fatto in un numero dei nostri insiemi di problemi. 1461 01:14:38,800 --> 01:14:41,690 Ognuno che ha preso un intero come argomento della riga di comando. 1462 01:14:41,690 --> 01:14:46,490 Ecco perché la nostra funzione atoi prende una stringa. 1463 01:14:46,490 --> 01:14:51,910 >> Quindi, di nuovo, nel nostro esempio qui, siamo andando a prendere l'ultimo. 1464 01:14:51,910 --> 01:14:55,050 Stiamo andando a sottrarre il carattere 0 da esso, perché i caratteri 0 1465 01:14:55,050 --> 01:14:58,810 sottratto dal carattere 0 ti dà il numero effettivo 0, secondo 1466 01:14:58,810 --> 01:15:00,950 la matematica ASCII che facciamo. 1467 01:15:00,950 --> 01:15:04,870 >> Poiché i caratteri sono rappresentati come diverso da quello reale - la 1468 01:15:04,870 --> 01:15:08,830 un carattere, per esempio, minuscola è 97. 1469 01:15:08,830 --> 01:15:10,260 Non è - oops! 1470 01:15:10,260 --> 01:15:13,290 Non è quello che ci si aspetterebbe che sia, 0, per esempio. 1471 01:15:13,290 --> 01:15:16,200 Quindi bisogna sottrarre l' personaggio una per ottenere 0. 1472 01:15:16,200 --> 01:15:18,950 >> Quindi stiamo andando a farlo qui per ottenere il numero effettivo. 1473 01:15:18,950 --> 01:15:22,560 E poi ci accingiamo a moltiplicarlo per una potenza di 10 a seconda di dove 1474 01:15:22,560 --> 01:15:27,030 è nella stringa, e poi che e aggiungerlo alla nostra segnaposto 1475 01:15:27,030 --> 01:15:32,520 variabile in modo da poter venire con il nostro nuovo integer finale. 1476 01:15:32,520 --> 01:15:35,080 Ritiene che abbia un senso per tutti? 1477 01:15:35,080 --> 01:15:37,730 >> Quindi non stiamo andando a codificare questa in questo momento, perché siamo 1478 01:15:37,730 --> 01:15:38,830 sempre a corto di tempo. 1479 01:15:38,830 --> 01:15:40,860 Mi scuso per la tempistica di questo. 1480 01:15:40,860 --> 01:15:44,620 Ma questo è ciò che, si spera, si farebbe essere in grado di fare il quiz - al 1481 01:15:44,620 --> 01:15:47,710 molto meno, ottenere questo pseudocodice scritto fuori. 1482 01:15:47,710 --> 01:15:50,840 >> E poi, se dovessimo scrivere il pseudocodice, in realtà, si potrebbe fare questo 1483 01:15:50,840 --> 01:15:51,490 abbastanza rapidamente. 1484 01:15:51,490 --> 01:15:55,230 Ogni riga di commenti che abbiamo scritto qui si traduce in circa 1485 01:15:55,230 --> 01:15:56,970 una riga di codice C. 1486 01:15:56,970 --> 01:16:01,780 Dichiarare una nuova variabile, la scrittura un loop, alcuni sottrazione, alcune 1487 01:16:01,780 --> 01:16:07,070 moltiplicazione, e alcuni assegnazione. 1488 01:16:07,070 --> 01:16:09,020 Probabilmente Ci piacerebbe Vogliamo anche scrivere una riga di ritorno. 1489 01:16:09,020 --> 01:16:12,040 Potremmo anche mettere alcuni controlli a qui. 1490 01:16:12,040 --> 01:16:12,655 Già. 1491 01:16:12,655 --> 01:16:15,720 >> STUDENTE: Quindi possiamo trattare s come la stringa effettiva? 1492 01:16:15,720 --> 01:16:18,730 Perché io so che è solo un indirizzo. 1493 01:16:18,730 --> 01:16:22,090 Come, come è possibile ottenere la lunghezza di la stringa viene passata attraverso? 1494 01:16:22,090 --> 01:16:25,310 >> JASON HIRSCHHORN: Così come ha fatto la lunghezza di una stringa? 1495 01:16:25,310 --> 01:16:25,830 Strlen. 1496 01:16:25,830 --> 01:16:26,660 >> STUDENTE: strlen, sì. 1497 01:16:26,660 --> 01:16:30,550 Ma si può mettere s come argomento per questo? 1498 01:16:30,550 --> 01:16:34,620 >> JASON HIRSCHHORN: Così strlen prende una stella char. 1499 01:16:34,620 --> 01:16:38,090 E ne consegue che char stella, e continua a contare fino a raggiungere un 1500 01:16:38,090 --> 01:16:41,865 backslash 0. strlen era in realtà uno degli altri programmi che 1501 01:16:41,865 --> 01:16:42,850 stavano andando al codice. 1502 01:16:42,850 --> 01:16:44,560 Questa è un'altra buona al codice. 1503 01:16:44,560 --> 01:16:47,270 Quello è un po 'più facile, perché se si sta andando a pensare che 1504 01:16:47,270 --> 01:16:47,830 concettualmente - 1505 01:16:47,830 --> 01:16:51,620 Ho solo detto ad alta voce - strlen segue un puntatore e mantiene in corso e 1506 01:16:51,620 --> 01:16:54,210 conteggio e tenere traccia fino si raggiunge un backslash 0. 1507 01:16:54,210 --> 01:16:56,530 >> STUDENTE: Ok, capito. 1508 01:16:56,530 --> 01:17:00,200 >> JASON HIRSCHHORN: So meglio di fortuna quiz 0 domani. 1509 01:17:00,200 --> 01:17:03,170 Se avete domande, io essere al di fuori dopo questo. 1510 01:17:03,170 --> 01:17:05,610 Sentitevi liberi di scrivermi. 1511 01:17:05,610 --> 01:17:08,480 Raggiungere il proprio TF se sei non nella mia sezione, o avere il mio 1512 01:17:08,480 --> 01:17:10,005 e-mail se si desidera. 1513 01:17:10,005 --> 01:17:13,140 >> Se si vuole fuori di testa e basta inviare me an email, una email Freakout, io 1514 01:17:13,140 --> 01:17:16,710 inviare indietro, come, una faccina sorridente, o, come, uno scherzo o qualcosa del genere. 1515 01:17:16,710 --> 01:17:18,190 Quindi sentitevi liberi di fare anche quello. 1516 01:17:18,190 --> 01:17:20,750 Buona fortuna ancora una volta, e io vedere tutti voi la settimana prossima. 1517 01:17:20,750 --> 01:17:23,435