1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
1
00:00:00,000 --> 00:00:02,395
>> [MUZIKO Ludante]

2
00:00:02,395 --> 00:00:05,750

3
00:00:05,750 --> 00:00:06,506
>> DOUG LLOYD: OK.

4
00:00:06,506 --> 00:00:08,880
Ni laboris kun entjeroj,
ni laboris kun karakteroj,

5
00:00:08,880 --> 00:00:11,930
ni laboris kaleŝegoj,
duobloj, kordoj, kaj bools.

6
00:00:11,930 --> 00:00:14,870
Ni elĉerpis preskaux cxiujn
de la [inaudible] tipoj kiuj

7
00:00:14,870 --> 00:00:17,100
estis disponebla al ni ĉiuj kune.

8
00:00:17,100 --> 00:00:19,430
Sed nun ni volas fari ion pli.

9
00:00:19,430 --> 00:00:20,210
Kiel ni faru tion?

10
00:00:20,210 --> 00:00:22,560
Kiel ni krei malsamaj datumtipoj?

11
00:00:22,560 --> 00:00:26,130
Ni povas fari tion uzante strukturojn.

12
00:00:26,130 --> 00:00:30,180
Do strukturoj permesus nin unuigi
variabloj de malsamaj tipoj

13
00:00:30,180 --> 00:00:34,810
en ununuran, nova variablo tipo,
kion ni povas atribui lian propran tipon nomo.

14
00:00:34,810 --> 00:00:37,570
Jen vere fortaj
afero por povi fari,

15
00:00:37,570 --> 00:00:40,900
ĉar ni povas nun grupo
elementoj de malsamaj datumtipoj

16
00:00:40,900 --> 00:00:43,910
kune kiuj havas logikan rilaton.

17
00:00:43,910 --> 00:00:46,440
Ni povis fari tion
kun tabeloj ia, dekstra?

18
00:00:46,440 --> 00:00:49,540
Ni povas grupigi variabloj
de la sama datumtipo

19
00:00:49,540 --> 00:00:53,410
kune en granda unuo
de memoro, tabelo.

20
00:00:53,410 --> 00:00:56,660
>> Sed ni ne povis miksi
supren malsamaj datumtipoj kune.

21
00:00:56,660 --> 00:01:02,610
Ni ne povas, diru, duo entjero,
kaj karaktero, kaj duobla ĉiuj

22
00:01:02,610 --> 00:01:05,330
en la sama afero kaj
voku ke ununura unuo.

23
00:01:05,330 --> 00:01:08,830
Sed kun strukturoj, aŭ
ofte referita kiel structs,

24
00:01:08,830 --> 00:01:09,585
ni efektive povas.

25
00:01:09,585 --> 00:01:12,370
Do strukturo estas speco
de kiel la super variablo.

26
00:01:12,370 --> 00:01:16,530
Ĝi estas variablo kiu enhavas
aliaj variabloj ene de ĝi.

27
00:01:16,530 --> 00:01:19,650
Do jen ekzemplo de
tre simpla strukturo.

28
00:01:19,650 --> 00:01:23,380
Jen kion la sintakso aspektus
ŝatas krei strukturon por aŭto.

29
00:01:23,380 --> 00:01:25,250
Nun, ni iru tra la sintakso tie.

30
00:01:25,250 --> 00:01:27,400
Struct, jen la
ŝlosilvorto kiu indikas

31
00:01:27,400 --> 00:01:30,270
ke mi kreas novan datumtipo tie.

32
00:01:30,270 --> 00:01:33,860
En aparta, la datumtipo nomiĝas
tuj esti struct aŭto, kiel ni vidos.

33
00:01:33,860 --> 00:01:36,640
Sed tiu estas la speco de beko
ekstere al la tradukilo ke ĉi

34
00:01:36,640 --> 00:01:42,440
kiel grupo de variabloj kiuj tuj
esti konsiderita parto de la sama tipo

35
00:01:42,440 --> 00:01:44,010
en minuto.

36
00:01:44,010 --> 00:01:46,340
>> Aŭtoj, nur la nomo de la strukturo.

37
00:01:46,340 --> 00:01:50,590
Denove, la datumtipo tie tuj
esti struct aŭto, ne nur aŭtoj.

38
00:01:50,590 --> 00:01:53,060
Sed se vi havas different--
se vi krei multoblajn structs

39
00:01:53,060 --> 00:01:56,950
en la sama programo, vi devas
distingi inter struct kaj struct.

40
00:01:56,950 --> 00:02:00,140
Do struct aŭto, mi mem povas havi
struct studento, ekzemple,

41
00:02:00,140 --> 00:02:01,790
en la sama programo.

42
00:02:01,790 --> 00:02:05,980
Ene de la krispa krampoj estas
ĉiuj la tn kampoj,

43
00:02:05,980 --> 00:02:07,954
aŭ membroj de la strukturo.

44
00:02:07,954 --> 00:02:10,370
Do kio estas kelkaj de la aferoj
ke estas imanenta en aŭto?

45
00:02:10,370 --> 00:02:15,270
Nu, ĝi kutime havas jaron, ankoraŭ
modelo nomo, kaj numerplato,

46
00:02:15,270 --> 00:02:18,000
an odómetro kiu kutime havas
iu nombro da mejloj sur ĝi,

47
00:02:18,000 --> 00:02:19,225
kaj eble motoro grandeco.

48
00:02:19,225 --> 00:02:23,570
Kaj kiel vi povas vidi, mi intermiksis
entjeroj kaj karakteroj kaj duobloj.

49
00:02:23,570 --> 00:02:26,420
Ili ĉiuj tuj estos
parto de tiu nova datumtipo.

50
00:02:26,420 --> 00:02:29,750
>> Finfine, la lasta afero mi devas fari,
ne forgesu tion iom punktokomo

51
00:02:29,750 --> 00:02:30,290
je la fino.

52
00:02:30,290 --> 00:02:34,380
Post ni finas difinante la strukturon,
ni bezonas meti punktokomo ĉe la fino.

53
00:02:34,380 --> 00:02:37,325
Ĝi estas tre komuna sintaksaj
eraro, ĉar kun funkcio,

54
00:02:37,325 --> 00:02:40,200
ekzemple, vi simple havas
malfermita krispa streĉa, proksime frizita streĉa.

55
00:02:40,200 --> 00:02:42,950
Vi ne metis punktokomo ĉe la
fino de funkcio difino.

56
00:02:42,950 --> 00:02:46,430
Tiu aspektas kiel funkcio
difinon, sed ĝi ne estas,

57
00:02:46,430 --> 00:02:49,653
kaj tiel la punktokomo tie
estas nur rememorigilo ke vi

58
00:02:49,653 --> 00:02:52,440
bezonas meti ĝin tien, ĉar
La tradukilo alie ne

59
00:02:52,440 --> 00:02:53,510
scias kion fari per ĝi.

60
00:02:53,510 --> 00:02:56,160
Ĝi estas tre komuna eraro
hazarde fari

61
00:02:56,160 --> 00:02:58,570
kiam vi unua difinanta strukturoj.

62
00:02:58,570 --> 00:02:59,500
>> BONE.

63
00:02:59,500 --> 00:03:02,824
Do ni kutime difini nian strukturoj
ĉe la plejsupro de niaj programoj

64
00:03:02,824 --> 00:03:05,490
ĉar ili probable tuj
uzota de pluraj funkcioj.

65
00:03:05,490 --> 00:03:08,850
Ni ne volas difini
struct ene de funkcio,

66
00:03:08,850 --> 00:03:12,110
ĉar tiam ni povas only-- la
amplekson de la strukturo vere

67
00:03:12,110 --> 00:03:13,790
nur ekzistas ene de tiu funkcio.

68
00:03:13,790 --> 00:03:17,450
Necesus kompreneble volas difini strukturo
tiel ni povas uzi ĝin en multnombraj funkcioj,

69
00:03:17,450 --> 00:03:20,670
aŭ eble en multoblaj
dosierojn kiuj estas ligitaj kune

70
00:03:20,670 --> 00:03:22,920
krei nia ununura programo.

71
00:03:22,920 --> 00:03:24,920
Kelkfoje ankaŭ anstataŭ
difini la strukturon

72
00:03:24,920 --> 00:03:27,961
ĉe la plejsupro kiu ekpasxos via
funto inkludas kaj via funto difinas,

73
00:03:27,961 --> 00:03:32,080
ekzemple, vi povus meti ilin en
aparta punkto h dosieroj, kiujn vi tiam

74
00:03:32,080 --> 00:03:35,020
funto inkludas mem.

75
00:03:35,020 --> 00:03:37,620
>> Do ni havas strukturojn, sed nun
ni devas akiri ene de ili.

76
00:03:37,620 --> 00:03:39,800
Kiel ni akiras ene de
strukturon al aliro

77
00:03:39,800 --> 00:03:43,530
tiuj sub-variablojn, tiuj variabloj
kiuj ekzistas ene la strukturo?

78
00:03:43,530 --> 00:03:46,810
Nu, ni havas ion nomita
la skalara operatoro, kiu permesas nin

79
00:03:46,810 --> 00:03:50,990
aliri la kampoj de la strukturo.

80
00:03:50,990 --> 00:03:55,490
Do ekzemple, ni diru mi deklaris
miaj strukturo datumtipo ie

81
00:03:55,490 --> 00:03:59,020
ĉe la supro de mia programo, aux eble en
skalara h dosieron kiu mi havas funto inkluditaj.

82
00:03:59,020 --> 00:04:03,360
Se mi tiam volas krei novan
variablo de tiu datumtipo, mi povas diri,

83
00:04:03,360 --> 00:04:06,260
struct aŭton, mia aŭto, punktokomo.

84
00:04:06,260 --> 00:04:11,580
Ĝuste kiel mi povus diri int
x, aŭ ŝnuro nomo punktokomo.

85
00:04:11,580 --> 00:04:18,100
>> La datumtipo tie estas struct aŭto,
la nomo de la variablo estas mia aŭto,

86
00:04:18,100 --> 00:04:23,770
kaj tiam mi povas uzi la skalara operatoro al
aliri la diversajn kampojn de mia aŭto.

87
00:04:23,770 --> 00:04:27,494
Do mi povas diri mian aŭton
skalara jaro egalas 2011.

88
00:04:27,494 --> 00:04:28,410
Jen perfekte bela.

89
00:04:28,410 --> 00:04:34,210
Jaro, se vi memoras, estis difinita kiel
entjera kampo ene de ĉi struct aŭto

90
00:04:34,210 --> 00:04:35,200
datumtipo.

91
00:04:35,200 --> 00:04:39,966
Do ajna variablo de la struct aŭto datumoj
tipo, kiel ekzemple mia aŭto, mi povas diri mian aŭton

92
00:04:39,966 --> 00:04:44,030
skalara jaro egalas kaj tiam asigni
ĝi iu entjero valoro, 2011.

93
00:04:44,030 --> 00:04:47,290
Mia aŭto skalara telero egalas CS50.

94
00:04:47,290 --> 00:04:51,180
Mia karto skalara odómetro
egalas 50505 punktokomo.

95
00:04:51,180 --> 00:04:53,270
Ĉiuj el tiuj estas
perfekte bone kaj tio estas

96
00:04:53,270 --> 00:04:57,802
kiel ni aliras la
kampoj de la strukturo.

97
00:04:57,802 --> 00:05:00,260
Strukturoj, kvankam, ne bezonas
esti kreita sur la stako.

98
00:05:00,260 --> 00:05:02,950
Nur kiel ajna alia variablo, ni
povas dinamike destini ilin.

99
00:05:02,950 --> 00:05:06,309
Se ni havas programon kiu povus
esti generante multaj strukturoj,

100
00:05:06,309 --> 00:05:08,100
Ni ne scias kiom da
ni tuj bezonas,

101
00:05:08,100 --> 00:05:10,800
tiam ni bezonas dinamike
rezervu tiujn strukturojn

102
00:05:10,800 --> 00:05:12,960
kiel nia programo kuras.

103
00:05:12,960 --> 00:05:16,600
Kaj do se ni tuj aliri la
kampoj de strukturo en tiu kunteksto,

104
00:05:16,600 --> 00:05:20,660
Memoru ke ni unue bezonas dereference
la puntero al la strukturo,

105
00:05:20,660 --> 00:05:24,810
kaj tiam iam ni dereference la
montrilo, tiam ni povas aliri la kampoj.

106
00:05:24,810 --> 00:05:26,830
Se ni nur havas
sagon al la strukturo,

107
00:05:26,830 --> 00:05:32,120
ni ne povas simple diri montrilo skalara kampo
Nomo kaj atingi kion ni serĉas.

108
00:05:32,120 --> 00:05:34,259
Jen la ekstran paŝon de dereferencing.

109
00:05:34,259 --> 00:05:36,050
Do diru ke
anstataŭ la previous--

110
00:05:36,050 --> 00:05:38,770
ĝuste kiel la antaŭa ekzemplo,
anstataŭ deklarante ĝin

111
00:05:38,770 --> 00:05:43,680
sur la stako, struct aŭton, mia
aŭto, punktokomo, mi diras struct aŭto,

112
00:05:43,680 --> 00:05:48,020
stelo, puntero al
struct aŭto nomis mia aŭto,

113
00:05:48,020 --> 00:05:51,250
egalas malloc grandeco de struct aŭton.

114
00:05:51,250 --> 00:05:54,950
Grandeco de ni elkompreni kiel multaj
bajtoj via nova datumtipo dissxutas.

115
00:05:54,950 --> 00:05:58,570
Vi ne nepre nur bezonas uzi
grandeco de, larĝo, int, aŭ char aŭ iu

116
00:05:58,570 --> 00:05:59,715
de la enkonstruita datumtipoj.

117
00:05:59,715 --> 00:06:02,090
La tradukilo estas sufiĉe lertaj
elkompreni kiel multaj bitokoj

118
00:06:02,090 --> 00:06:04,170
deviĝas per via nova strukturo.

119
00:06:04,170 --> 00:06:09,610
Do mi malloc mem unuo de memoro
sufiĉe granda por teni struct aŭto,

120
00:06:09,610 --> 00:06:12,410
kaj mi ricevas puntero reen
al tiu bloko de memoro,

121
00:06:12,410 --> 00:06:16,090
kaj ke puntero estas atribuita al mia aŭto.

122
00:06:16,090 --> 00:06:18,050
>> Nun, se mi volas aliri
la kampoj de mia aŭto,

123
00:06:18,050 --> 00:06:22,615
Mi unue dereference mia aŭto uzanta
la dereference operatoro, stelo

124
00:06:22,615 --> 00:06:26,620
ke ni vidis el la punteros
videos, kaj tiam post mi dereference,

125
00:06:26,620 --> 00:06:32,200
tiam mi povas uzi la skalara operatoro al
aliri la diversajn kampojn de mia aŭto.

126
00:06:32,200 --> 00:06:35,490
Stelo mia aŭto skalara jaro egalas 2011.

127
00:06:35,490 --> 00:06:38,480
Tio havus la efikon
ni volas en tiu kazo,

128
00:06:38,480 --> 00:06:41,960
ĉar ni dinamike
asignitaj mia aŭto.

129
00:06:41,960 --> 00:06:43,610
>> Tio estas speco de ĝenaj, tamen, ĉu ne?

130
00:06:43,610 --> 00:06:44,818
Tie estas 2-paŝo procezo nun.

131
00:06:44,818 --> 00:06:47,460
Nun ni devas dereference--
ni havas stelon operatoro,

132
00:06:47,460 --> 00:06:48,910
kaj ni havas skalara operatoro.

133
00:06:48,910 --> 00:06:51,660
Kaj kiel vi povus atendi, ĉar
C programistoj amas pli mallongaj formoj

134
00:06:51,660 --> 00:06:53,740
fari aferojn, estas
mallonga maniero fari tion.

135
00:06:53,740 --> 00:06:57,790
Ekzistas alia operatoro nomita sago,
kion faras ĉi procezo multe pli facila.

136
00:06:57,790 --> 00:07:00,750
La vojo sago laboras estas
ĝin unue dereferences

137
00:07:00,750 --> 00:07:03,560
la montrilo sur la maldekstra
flanko de la operatoro,

138
00:07:03,560 --> 00:07:06,620
kaj tiam, post esti dereferenced
la montrilo sur la maldekstra,

139
00:07:06,620 --> 00:07:09,620
ĝi aliroj la kampo dekstre.

140
00:07:09,620 --> 00:07:14,170
Kaj tial ni antaŭe havis tiun specon
de Star mia aŭto dot ĉiuj ĉi aferoj,

141
00:07:14,170 --> 00:07:15,880
kiel estis multa okazas tie.

142
00:07:15,880 --> 00:07:22,040
Sed kion ni povas fari anstataŭ estas this--
mia aŭto sago jaro egalas 2011.

143
00:07:22,040 --> 00:07:23,580
>> Denove, kio okazas ĉi tie?

144
00:07:23,580 --> 00:07:25,720
Unue, mi dereferencing mia aŭto.

145
00:07:25,720 --> 00:07:27,810
Kiu denove, estas puntero tie.

146
00:07:27,810 --> 00:07:31,270
Tiam, post havi
dereferenced mia aŭto, mi

147
00:07:31,270 --> 00:07:35,130
tiam povas aliri la kampoj
jaro, plato, kaj odómetro

148
00:07:35,130 --> 00:07:40,020
samkiel mi povis antaŭ havantaj unua
uzita stelo dereference mia aŭto,

149
00:07:40,020 --> 00:07:42,020
kaj punktas aliri la kampo.

150
00:07:42,020 --> 00:07:45,290
Do vi povas havi strukturoj, vi
povas havi punteros al strukturoj,

151
00:07:45,290 --> 00:07:48,360
kaj vi havas manierojn aliro
la kampoj de tiuj strukturoj,

152
00:07:48,360 --> 00:07:52,600
ĉu vi havas punteros al
ilin aŭ la variabloj mem.

153
00:07:52,600 --> 00:07:57,640
Dot aŭ sago, depende
kiom la variablo estis deklarita.

154
00:07:57,640 --> 00:08:00,510
Mi Doug Lloyd, tiu estas CS50.

155
00:08:00,510 --> 00:08:01,975