[MUZIKO Ludante] DOUG LLOYD: Bone. Speco de stranga temo, ĉu ne? Magia nombroj. Kio cervino li signifas kiam li estas parolante pri magiaj numeroj? Nu, kelkaj el la programoj ke ni skribis en CS50 ĝis nun havis kelkajn strangajn nombroj speco de ĵetita en ili. Eble pro kialoj ni ne tute kompreni ĝuste nun. Ekzemple, en la Mario problemo, ni haltigataj la alteco de la piramido ĉe 23. Ni eksplicite diris vin ne iru pli alten ol 23. Sed kion signifas 23 signifas? Nu, se vi legas la Spec zorgeme, vi eble vidis ke la kialo ni haltigataj ĝin ĉe 23 Estas ĉar la norma alteco de terminalprograo estas 24. Kaj do se ni havas la piramido esti pli alta ol tiu, ĝi povus fari ĉi strangaĵon kie kuras for la ekrano. Kaj vi scias, kion faras signifas en kunteksto, ĉu ne? Estas la signifo de 23 tuj preterlasas al iu kiu rigardas vian programon kaj eble havas malsaman grandeco terminalfenestro? Probable ne. Ŝajnas kiel, OK. Nu, kial estas ĝi nur malpli ol 23? Ĝenerale, ĝi estas speco de malbona kutimo reale skribi konstantoj en vian kodon. En fari tion, kiam vi reale fari Skribi konstanta en via kodo, ĝi estas iam referis al kiel uzanta magio nombroj, kiu estas io ni ĝenerale volas klopodi eviti. Ekzemple, ni rigardu ĉe tiu simpla funkcio tie. Evidente ne estas datumoj tipo en C nomita karto aŭ ferdeko. Do simple toleru min. Estas iomete da _pseudocode_ miksita tie. Tiu estas funkcio nomita trakti karto kiu ŝajne prenas ferdeko kiel ĝia parametro, kaj volo eligo min sola karto. Kaj mi faras ion tie, kie mi havas buklo kiu kuras de 0 al 52, kaj mi trakti karto. Nu, ni hvas magio numeron tien, dekstren. Ĉu vi vidas kion la magia nombro estas? Aŭ pli grave, ĉu vi vidi kion la problemo estas tie? Aparte se ĉi estas nur unu funkcio en ĝia propra dosiero en dosierujo kiu enhavas faskon de malsamaj dosierojn, ĉiu el kiuj faras alian aferon por ludkartaro de kartoj. Eble ludkartaro ilin, aŭ traktas Mano de kvin kartoj anstataŭ sola karto. Ĉu vi vidas kion la problemo povus esti tie? Ĉu vi vidas la magia nombro Mi injektita en la kodo? Estas 52, dekstre. Kiel, intuicie vi probable scias, OK. Kiel norma ferdeko de kartoj enhavas 52 kartojn. Sed en nia programo, estas nur ia ŝvebantan en tie. Estas kiel subite ekzistas 52. Unu maniero solvi tiun problemo estas fari tion. Ni estas tre eksplicite nun vokante la ferdeko grandeco kiel 52. Ĝi donas iom pli intuicia Signifanta kiam en la por buklo poste ni diru, i estas malpli ol ferdeko grandeco. Ĝi nur ŝajnas bona ol jene 52. Nun ĉi faras efektive riparas la problemon. Ĝi donas iun simbolan signifon al la konstanto. Sed ĝi faras specon de reale enkonduki alian problemon ke ne povus esti tuj evidenta. Eĉ se tiu variablo estas deklarita globally-- ĉu vi memoras kion ĝi signifas kiam ni deklaras ŝanĝiĝema tutmonde kontre loke? Eĉ se ni deklari variablon tutmonde, kio se estas alian funkcion en nia suite de funkcioj ke interkonsento kun karto manipulado ke distrite ŝanĝas ferdeko grandeco, aŭ ĝi pliigas ĝin 1 aŭ malpliigas ŝin por 1. Tio povus literumi problemojn, ĉu ne? Speciale se ni pritraktas aron de kartoj kie barajando la plenan ferdekon estas bezonata. Se ferdeko grandeco estas malpliigita por 1, ekzemple, al 51, ni fakte ne barajar ĉiuj kartoj eble. Ni lasas unu el ili ekstere. Kaj ke valoro povus eble esti antaŭdiris aŭ ekspluatita por malbona aktoro. C disponigas kio nomiĝas antaŭtraktilo direktivo kiu estas ankaŭ nomata makroo por krei simbolajn konstantoj. Kaj fakte, vi jam vidita antaŭtraktilo direktivo, eĉ se vi ne auxdis vokis ke kun #include. Ĝi estas alia ekzemplo de makroo aŭ antaŭtraktilo direktivo. La maniero krei simbolaj konstantoj, aŭ donante nomo al konstanta tiel ke ĝi havas pli Signifanta, estas kiel sekvas. #define, nomo, anstataŭaĵo. Vere grava flanken tie vere rapida. Ne metu punktokomo ĉe la fino de via #defines. Do estas #define, nomo, anstataŭaĵo. Kiam via programo estas kompilita, kio vere okazas estas la kompililo se irante iri tra via kodo kaj anstataŭi ĉiu petskribo de la vorto "nomo" kun kiom vi metis kiel anstataŭaĵo. Analoge, se #include estas speco de simila al kopii kaj bati, tiam #define estas ia simila al trovi kaj anstataŭigi, se vi iam uzis tiun karakterizaĵon en tekstoprilaborado programo, ekzemple. Do ekzemple, se mi #define pi kiel 3.14159265, se vi estas bona matematike klinita kaj vi subite vidi 3.14159265 flugado ĉirkaŭe en via kodo, Vi verŝajne konas ĝin parolas pri pi. Sed eble ni povas doni al ĝi iom pli simbolan signifon. Kaj ni povas anstataŭe diri #define pi kiel tiu buŝplenon de nombroj ke mi ne tuj teni legi super kaj super. Kaj kio okazos poste ĉe kompili tempo estas kiam la programo estas kompilita, la unua afero, kiun okazos estas ĝi trairos kaj ĝi anstataŭos ĉiufoje vidas ĉefurbo P, majuskla, gxi devos laŭvorte anstataŭigi ĝin per 3.14 kaj tiel plu, por ke vi ne devas tajpi ĝin ĉiufoje tempo dum via programo ankoraŭ havas la funcionalidad kiu vi atendi, ĉar vi laboras kun manipulado, multiplikante, dividadon, kion ajn ĝi estas de pi. Vi ne estas limigita al tiu anstataŭo por nombroj nur. Ekzemple, mi povus #define kurso kiel la kordo CS50. En tiu kazo, kiam la programo estas kompilita, #define trairos la kodo anstataŭigenda ĉiufoje ĝi vidas "kurson" kun la kordo CS50. Vi rimarkos ĉi tie ankaŭ ke mi ofte #define ĉiuj miaj difinita simbola konstantoj, por tiel diri, ĉiam en ĉiuj ĉapoj. Ĝi estas konvencio. Ĝi ne estas bezonata. La kialo ĝenerale homoj uzos ĉiuj ĉefurboj kiam ili estas #defining Estas nur por igi ĝin vere klara ke tiu aparta elemento de mia kodo estas difinita konstanto. Se estis minuskla, eblas ke ĝi povus esti konfuzita kun ŝanĝiĝema. Kaj tio estas probable ne estas bona afero por fari. Do tiu aparta solvo estas multe pli bona ol ĉiu el ambaŭ de la antaŭaj. Se mi unue #define ferdeko grandeco 52, tiam nun mia uzo de 52, aŭ ferdeko grandecon tie ĉi, estas multe pli intuitivo kaj multe pli sekura. Vi ne povas manipuli konstanta. Vi ne povas diri 52 plus alpago. Tio ne tuj konverti ĝin al 53. Vi ne povas ŝanĝi 52 al io. Vi povas ŝanĝi variablon kies valoro estas 52, kiu estis la unua fix ni havis antaŭe. Kaj vi povus pliigi ke variablo al 53. Sed vi ne povas diri 52 plus plus kaj havas ke subite turnas 52 en 53. 52 estas ĉiam 52. Kaj tial vi ne povas preterintence ŝanĝi ferdeko grandeco tie manipulante ĝin, Alia bona flanko efiko de tiu kvankam estas ke vi konscias ke ne ĉiuj landoj ĉirkaŭ la mondo Uzi ludkartaro de grandeco 52? Ekzemple, ĝi estas vere komuna en Germanio uzi ferdeko grandeco de 32, kie forstreku iuj de la malsupra valoro kartoj. Kaj en ĉi tiu kazo, mi volis havenon mia suite de funkcioj kiuj traktas karton manipulado al Germanio. Mi povis en la unua petskribo nin montris, devi iri kaj anstataŭigi ĉiuj okazoj de 52 en mia kodo kun 32. Sed ĉi tie, se mi #define ferdeko grandeco kiel 32 ĉe la plejsupro de mia kodo, se mi devas ŝanĝi ŝin, mi povas simple iri kaj ŝanĝi tiun unu aferon. Rekompili mian kodon, kaj ĉiuj Subite ĝi propagas tra. Fakte, ni povas ŝanĝi ferdeko grandeco por ajna valoro ni volas. Ĉu mi interesos vin en ludo de ferdeko grandeco pickup? Mi Doug Lloyd. Kaj tiu estas CS50.