>> [MUZIKO Ludante]
>> DOUG LLOYD: OK.
Ni laboris kun entjeroj, ni laboris kun karakteroj,
ni laboris kaleŝegoj, duobloj, kordoj, kaj bools.
Ni elĉerpis preskaux cxiujn de la [inaudible] tipoj kiuj
estis disponebla al ni ĉiuj kune.
Sed nun ni volas fari ion pli.
Kiel ni faru tion?
Kiel ni krei malsamaj datumtipoj?
Ni povas fari tion uzante strukturojn.
Do strukturoj permesus nin unuigi variabloj de malsamaj tipoj
en ununuran, nova variablo tipo, kion ni povas atribui lian propran tipon nomo.
Jen vere fortaj afero por povi fari,
ĉar ni povas nun grupo elementoj de malsamaj datumtipoj
kune kiuj havas logikan rilaton.
Ni povis fari tion kun tabeloj ia, dekstra?
Ni povas grupigi variabloj de la sama datumtipo
kune en granda unuo de memoro, tabelo.
>> Sed ni ne povis miksi supren malsamaj datumtipoj kune.
Ni ne povas, diru, duo entjero, kaj karaktero, kaj duobla ĉiuj
en la sama afero kaj voku ke ununura unuo.
Sed kun strukturoj, aŭ ofte referita kiel structs,
ni efektive povas.
Do strukturo estas speco de kiel la super variablo.
Ĝi estas variablo kiu enhavas aliaj variabloj ene de ĝi.
Do jen ekzemplo de tre simpla strukturo.
Jen kion la sintakso aspektus ŝatas krei strukturon por aŭto.
Nun, ni iru tra la sintakso tie.
Struct, jen la ŝlosilvorto kiu indikas
ke mi kreas novan datumtipo tie.
En aparta, la datumtipo nomiĝas tuj esti struct aŭto, kiel ni vidos.
Sed tiu estas la speco de beko ekstere al la tradukilo ke ĉi
kiel grupo de variabloj kiuj tuj esti konsiderita parto de la sama tipo
en minuto.
>> Aŭtoj, nur la nomo de la strukturo.
Denove, la datumtipo tie tuj esti struct aŭto, ne nur aŭtoj.
Sed se vi havas different-- se vi krei multoblajn structs
en la sama programo, vi devas distingi inter struct kaj struct.
Do struct aŭto, mi mem povas havi struct studento, ekzemple,
en la sama programo.
Ene de la krispa krampoj estas ĉiuj la tn kampoj,
aŭ membroj de la strukturo.
Do kio estas kelkaj de la aferoj ke estas imanenta en aŭto?
Nu, ĝi kutime havas jaron, ankoraŭ modelo nomo, kaj numerplato,
an odómetro kiu kutime havas iu nombro da mejloj sur ĝi,
kaj eble motoro grandeco.
Kaj kiel vi povas vidi, mi intermiksis entjeroj kaj karakteroj kaj duobloj.
Ili ĉiuj tuj estos parto de tiu nova datumtipo.
>> Finfine, la lasta afero mi devas fari, ne forgesu tion iom punktokomo
je la fino.
Post ni finas difinante la strukturon, ni bezonas meti punktokomo ĉe la fino.
Ĝi estas tre komuna sintaksaj eraro, ĉar kun funkcio,
ekzemple, vi simple havas malfermita krispa streĉa, proksime frizita streĉa.
Vi ne metis punktokomo ĉe la fino de funkcio difino.
Tiu aspektas kiel funkcio difinon, sed ĝi ne estas,
kaj tiel la punktokomo tie estas nur rememorigilo ke vi
bezonas meti ĝin tien, ĉar La tradukilo alie ne
scias kion fari per ĝi.
Ĝi estas tre komuna eraro hazarde fari
kiam vi unua difinanta strukturoj.
>> BONE.
Do ni kutime difini nian strukturoj ĉe la plejsupro de niaj programoj
ĉar ili probable tuj uzota de pluraj funkcioj.
Ni ne volas difini struct ene de funkcio,
ĉar tiam ni povas only-- la amplekson de la strukturo vere
nur ekzistas ene de tiu funkcio.
Necesus kompreneble volas difini strukturo tiel ni povas uzi ĝin en multnombraj funkcioj,
aŭ eble en multoblaj dosierojn kiuj estas ligitaj kune
krei nia ununura programo.
Kelkfoje ankaŭ anstataŭ difini la strukturon
ĉe la plejsupro kiu ekpasxos via funto inkludas kaj via funto difinas,
ekzemple, vi povus meti ilin en aparta punkto h dosieroj, kiujn vi tiam
funto inkludas mem.
>> Do ni havas strukturojn, sed nun ni devas akiri ene de ili.
Kiel ni akiras ene de strukturon al aliro
tiuj sub-variablojn, tiuj variabloj kiuj ekzistas ene la strukturo?
Nu, ni havas ion nomita la skalara operatoro, kiu permesas nin
aliri la kampoj de la strukturo.
Do ekzemple, ni diru mi deklaris miaj strukturo datumtipo ie
ĉe la supro de mia programo, aux eble en skalara h dosieron kiu mi havas funto inkluditaj.
Se mi tiam volas krei novan variablo de tiu datumtipo, mi povas diri,
struct aŭton, mia aŭto, punktokomo.
Ĝuste kiel mi povus diri int x, aŭ ŝnuro nomo punktokomo.
>> La datumtipo tie estas struct aŭto, la nomo de la variablo estas mia aŭto,
kaj tiam mi povas uzi la skalara operatoro al aliri la diversajn kampojn de mia aŭto.
Do mi povas diri mian aŭton skalara jaro egalas 2011.
Jen perfekte bela.
Jaro, se vi memoras, estis difinita kiel entjera kampo ene de ĉi struct aŭto
datumtipo.
Do ajna variablo de la struct aŭto datumoj tipo, kiel ekzemple mia aŭto, mi povas diri mian aŭton
skalara jaro egalas kaj tiam asigni ĝi iu entjero valoro, 2011.
Mia aŭto skalara telero egalas CS50.
Mia karto skalara odómetro egalas 50505 punktokomo.
Ĉiuj el tiuj estas perfekte bone kaj tio estas
kiel ni aliras la kampoj de la strukturo.
Strukturoj, kvankam, ne bezonas esti kreita sur la stako.
Nur kiel ajna alia variablo, ni povas dinamike destini ilin.
Se ni havas programon kiu povus esti generante multaj strukturoj,
Ni ne scias kiom da ni tuj bezonas,
tiam ni bezonas dinamike rezervu tiujn strukturojn
kiel nia programo kuras.
Kaj do se ni tuj aliri la kampoj de strukturo en tiu kunteksto,
Memoru ke ni unue bezonas dereference la puntero al la strukturo,
kaj tiam iam ni dereference la montrilo, tiam ni povas aliri la kampoj.
Se ni nur havas sagon al la strukturo,
ni ne povas simple diri montrilo skalara kampo Nomo kaj atingi kion ni serĉas.
Jen la ekstran paŝon de dereferencing.
Do diru ke anstataŭ la previous--
ĝuste kiel la antaŭa ekzemplo, anstataŭ deklarante ĝin
sur la stako, struct aŭton, mia aŭto, punktokomo, mi diras struct aŭto,
stelo, puntero al struct aŭto nomis mia aŭto,
egalas malloc grandeco de struct aŭton.
Grandeco de ni elkompreni kiel multaj bajtoj via nova datumtipo dissxutas.
Vi ne nepre nur bezonas uzi grandeco de, larĝo, int, aŭ char aŭ iu
de la enkonstruita datumtipoj.
La tradukilo estas sufiĉe lertaj elkompreni kiel multaj bitokoj
deviĝas per via nova strukturo.
Do mi malloc mem unuo de memoro sufiĉe granda por teni struct aŭto,
kaj mi ricevas puntero reen al tiu bloko de memoro,
kaj ke puntero estas atribuita al mia aŭto.
>> Nun, se mi volas aliri la kampoj de mia aŭto,
Mi unue dereference mia aŭto uzanta la dereference operatoro, stelo
ke ni vidis el la punteros videos, kaj tiam post mi dereference,
tiam mi povas uzi la skalara operatoro al aliri la diversajn kampojn de mia aŭto.
Stelo mia aŭto skalara jaro egalas 2011.
Tio havus la efikon ni volas en tiu kazo,
ĉar ni dinamike asignitaj mia aŭto.
>> Tio estas speco de ĝenaj, tamen, ĉu ne?
Tie estas 2-paŝo procezo nun.
Nun ni devas dereference-- ni havas stelon operatoro,
kaj ni havas skalara operatoro.
Kaj kiel vi povus atendi, ĉar C programistoj amas pli mallongaj formoj
fari aferojn, estas mallonga maniero fari tion.
Ekzistas alia operatoro nomita sago, kion faras ĉi procezo multe pli facila.
La vojo sago laboras estas ĝin unue dereferences
la montrilo sur la maldekstra flanko de la operatoro,
kaj tiam, post esti dereferenced la montrilo sur la maldekstra,
ĝi aliroj la kampo dekstre.
Kaj tial ni antaŭe havis tiun specon de Star mia aŭto dot ĉiuj ĉi aferoj,
kiel estis multa okazas tie.
Sed kion ni povas fari anstataŭ estas this-- mia aŭto sago jaro egalas 2011.
>> Denove, kio okazas ĉi tie?
Unue, mi dereferencing mia aŭto.
Kiu denove, estas puntero tie.
Tiam, post havi dereferenced mia aŭto, mi
tiam povas aliri la kampoj jaro, plato, kaj odómetro
samkiel mi povis antaŭ havantaj unua uzita stelo dereference mia aŭto,
kaj punktas aliri la kampo.
Do vi povas havi strukturoj, vi povas havi punteros al strukturoj,
kaj vi havas manierojn aliro la kampoj de tiuj strukturoj,
ĉu vi havas punteros al ilin aŭ la variabloj mem.
Dot aŭ sago, depende kiom la variablo estis deklarita.
Mi Doug Lloyd, tiu estas CS50.