ROB Bowden: Hi, aku Rob Bowden, dan mari kita bicara tentang quiz0.
>> Jadi, pertanyaan pertama.
Ini adalah pertanyaan di mana Anda perlu kode nomor
127 di lampu biner.
Jika Anda ingin, Anda bisa melakukan konversi biasa
dari bi-- atau, dari desimal ke biner.
Tapi itu mungkin akan untuk mengambil banyak waktu.
Maksudku, Anda bisa mengetahui bahwa, OK, 1 adalah di sana, 2 di sana,
4 adalah di sana, 8 di sana.
Cara yang lebih mudah, 127 adalah 128 minus satu.
Itu bola lampu paling kiri adalah 128-bit.
Jadi 127 adalah benar-benar hanya semua dari bola lampu lainnya,
karena itulah paling kiri bola lampu minus 1.
Itu saja untuk pertanyaan itu.
>> Pertanyaan satu.
Jadi dengan 3 bit Anda dapat mewakili 8 nilai yang berbeda.
Mengapa, kemudian, adalah 7 terbesar non-negatif bilangan bulat desimal Anda dapat mewakili?
Nah, jika kita hanya bisa mewakili 8 nilai yang berbeda,
maka apa yang kita akan menjadi mewakili adalah 0 sampai 7.
0 mengambil salah satu nilai.
>> Pertanyaan kedua.
Dengan n bit, berapa banyak yang berbeda Nilai-nilai yang dapat Anda mewakili?
Jadi, dengan n bit, Anda memiliki 2 nilai yang mungkin untuk setiap bit.
Jadi kita memiliki 2 nilai yang mungkin untuk bit pertama, 2 nilai yang mungkin
untuk yang kedua, 2 mungkin bagi ketiga.
Dan jadi itu 2 kali 2 kali 2, dan akhirnya jawabannya adalah 2 sampai n.
>> Pertanyaan ketiga.
Apa 0x50 dalam biner?
Jadi ingat bahwa heksadesimal memiliki sangat konversi langsung ke biner.
Jadi di sini, kita hanya perlu melihat 5 dan 0 independen.
Jadi apa 5 dalam biner?
0101, itulah 1 bit dan 4 bit.
Apa 0 dalam biner?
Tidak rumit.
0000.
Jadi hanya menempatkan mereka bersama-sama, dan itu jumlah penuh dalam biner.
01.010.000.
Dan jika Anda ingin Anda bisa melepas bahwa nol paling kiri.
Itu tidak relevan.
>> Jadi alternatif, apa 0x50 dalam desimal?
Jika Anda ingin, Anda could-- jika Anda lebih nyaman dengan biner,
Anda bisa mengambil bahwa jawaban biner dan mengkonversikan menjadi desimal.
Atau kita hanya bisa mengingat bahwa heksadesimal.
Sehingga 0 adalah di tempat-0 th, dan 5 berada di 16 tempat pertama.
Jadi di sini, kami memiliki 5 kali 16 ke pertama, ditambah 0 kali 16 ke nol,
adalah 80.
Dan jika Anda melihat hak atas pertanyaan,
itu CS 80, yang merupakan jenis dari petunjuk untuk jawaban atas masalah ini.
>> Pertanyaan lima.
Kami memiliki naskah Scratch ini, yang diulang 4 kali selai kacang jelly.
Jadi bagaimana kita sekarang kode yang di C?
Yah, kita memiliki di sini-bagian dalam huruf tebal adalah satu-satunya bagian yang Anda harus melaksanakan.
Jadi kita memiliki 4 lingkaran yang looping 4 kali, printf-ing peanut butter jelly,
dengan baris baru sebagai masalah meminta.
>> Pertanyaan enam, masalah Scratch lain.
Kita melihat bahwa kita berada dalam lingkaran selamanya.
Kami mengatakan i variabel dan kemudian incrementing i oleh 1.
Sekarang kita ingin melakukan itu di C. Ada beberapa cara kita bisa melakukan ini.
Di sini kita terjadi untuk kode selamanya lingkaran sebagai sementara (benar).
Jadi kita mendeklarasikan variabel i, hanya seperti kami memiliki variabel i dalam Scratch.
Deklarasikan i variabel, dan selamanya sementara (benar), kita katakan variabel i.
Jadi printf% Aku-- atau Anda sudah bisa digunakan% d.
Kita mengatakan variabel itu, dan kemudian kenaikan itu, i ++.
>> Pertanyaan tujuh.
Sekarang kita ingin melakukan sesuatu yang sangat mirip Mario dot c dari masalah menetapkan satu.
Kami ingin mencetak hashtags ini, kita ingin mencetak lima
oleh tiga persegi panjang hash ini.
Jadi bagaimana yang akan kita melakukan itu?
Yah, kami memberikan seluruh sekelompok kode, dan Anda hanya
harus mengisi fungsi cetak jaringan.
>> Jadi apa PrintGrid terlihat seperti?
Nah Anda melewati lebar dan tinggi.
Jadi kita memiliki outer 4 lingkaran, yang looping
atas semua baris ini grid yang ingin kita mencetak.
Maka kita memiliki antar-bersarang 4 lingkaran, itu mencetak lebih dari setiap kolom.
Jadi untuk setiap baris, kita mencetak untuk setiap kolom, hash tunggal.
Kemudian pada akhir baris kami mencetak baris baru tunggal untuk pergi ke baris berikutnya.
Dan itu untuk seluruh jaringan.
>> Pertanyaan delapan.
Sebuah fungsi seperti PrintGrid dikatakan memiliki efek samping, tapi tidak kembali sebuah
nilai.
Jelaskan perbedaan.
Jadi ini bergantung pada Anda mengingat apa efek samping adalah.
Nah, kembalinya value-- kita tahu PrintGrid tidak
memiliki nilai kembali, karena di sini dikatakan batal.
Jadi apa pun yang mengembalikan void tidak benar-benar kembali apa-apa.
Jadi apa efek samping?
Nah, efek samping adalah apa pun yang semacam berlanjut
setelah fungsi ujung itu tidak hanya kembali,
dan itu bukan hanya dari input.
>> Jadi, misalnya, kita mungkin mengubah variabel global.
Itu akan menjadi efek samping.
Dalam kasus ini, seorang efek samping yang sangat penting
sedang mencetak ke layar.
Jadi itu adalah efek samping PrintGrid yang memiliki.
Kami mencetak hal-hal ini ke layar.
Dan Anda bisa memikirkan bahwa sebagai efek samping,
karena itu sesuatu yang berlanjut setelah fungsi ini berakhir.
Itu sesuatu di luar ruang lingkup fungsi ini yang pada akhirnya
sedang berubah, isi layar.
>> Pertanyaan sembilan.
Pertimbangkan program di bawah ini, yang nomor baris
telah ditambahkan untuk kepentingan diskusi.
Jadi dalam program ini kita hanya memanggil GetString, menyimpannya
dalam variabel ini s, dan kemudian mencetak bahwa variabel s.
OK.
Jadi menjelaskan mengapa satu baris hadir.
# include CS50 dot h.
Mengapa kita perlu # include CS50 dot h?
Yah, kita panggil GetString fungsi,
dan GetString didefinisikan di perpustakaan CS50.
Jadi jika kita tidak memiliki #include CS50 dot h,
kita akan mendapatkan bahwa deklarasi implisit dari kesalahan fungsi GetString
dari compiler.
Jadi kita perlu menyertakan library-- yang kita perlu menyertakan file header,
atau compiler tidak akan mengakui bahwa GetString ada.
>> Jelaskan mengapa garis dua hadir.
Jadi standar io dot h.
Ini persis sama sebagai masalah sebelumnya,
kecuali bukan berurusan dengan GetString, kita sedang berbicara tentang printf.
Jadi jika kita tidak mengatakan kita perlu untuk menyertakan standar io dot h,
maka kita tidak akan mampu untuk menggunakan fungsi printf,
karena compiler tidak akan tahu tentang hal itu.
>> Why-- apa signifikansinya dari membatalkan sejalan empat?
Jadi di sini kita memiliki int main (void).
Itu hanya mengatakan kita bahwa tidak mendapatkan apapun baris perintah
argumen untuk utama.
Ingat bahwa kita bisa mengatakan int utama int argc kurung tali argv.
Jadi di sini kita hanya mengatakan batal untuk mengatakan kami mengabaikan argumen baris perintah.
>> Jelaskan, sehubungan dengan memori, tepatnya apa GetString sejalan enam kembali.
GetString adalah kembali blok memori, sebuah array karakter.
Ini benar-benar mengembalikan pointer ke karakter pertama.
Ingat bahwa string adalah bintang arang.
Jadi s adalah pointer ke pertama karakter dalam apa pun string adalah
bahwa pengguna masuk pada keyboard.
Dan memori yang kebetulan malloced, sehingga memori yang ada di heap.
>> Pertanyaan 13.
Mempertimbangkan program di bawah ini.
Jadi semua program ini adalah melakukan adalah printf-ing 1 dibagi dengan 10.
Jadi ketika dikompilasi dan dieksekusi, program ini
output 0.0, meskipun 1 dibagi dengan 10 adalah 0,1.
Jadi mengapa 0.0?
Nah, hal ini karena dari pembagian integer.
Jadi 1 adalah integer, 10 adalah bilangan bulat.
Jadi 1 dibagi dengan 10, semuanya diperlakukan sebagai bilangan bulat,
dan di C, ketika kita melakukan pembagian integer, kita memotong setiap titik desimal.
Jadi 1 dibagi dengan 10 adalah 0, dan kemudian kami berusaha
untuk mencetak bahwa sebagai pelampung, sehingga nol dicetak sebagai pelampung adalah 0,0.
Dan itulah mengapa kita mendapatkan 0,0.
>> Mempertimbangkan program di bawah ini.
Sekarang kita mencetak 0,1.
Jadi tidak ada pembagian integer, kami hanya mencetak 0,1,
tapi kami mencetaknya 28 tempat desimal.
Dan kami mendapatkan ini 0,1000, seluruh sekelompok dari nol, 5 5 5, bla bla bla.
Jadi pertanyaan di sini adalah mengapa hal itu mencetak bahwa, alih-alih persis 0,1?
>> Jadi alasan di sini sekarang floating point ketidaktepatan.
Ingat bahwa pelampung hanya 32 bit.
Jadi kita hanya dapat mewakili jumlah terbatas floating point nilai dengan orang-orang 32
bit.
Yah ada akhirnya jauh banyak nilai-nilai floating point,
dan ada tak terhingga banyaknya mengambang nilai titik antara 0 dan 1,
dan kami jelas bisa mewakili lebih nilai dari itu.
Jadi kita harus berkorban untuk dapat mewakili sebagian besar nilai-nilai.
>> Jadi nilai seperti 0.1, rupanya kita tidak bisa menyatakan bahwa tepat.
Jadi, bukannya mewakili 0,1 kita melakukan terbaik yang kami dapat mewakili ini 0.100000 5 5
5.
Dan itu cukup dekat, tapi untuk banyak aplikasi
Anda perlu khawatir tentang floating point ketidaktepatan,
karena kita tidak dapat mewakili semua titik mengambang persis.
>> Pertanyaan 15.
Pertimbangkan kode di bawah ini.
Kami hanya mencetak 1 ditambah 1.
Jadi tidak ada trik di sini.
1 ditambah 1 mengevaluasi ke 2, dan kemudian kita cetak itu.
Ini hanya mencetak 2.
>> Pertanyaan 16.
Sekarang kita mencetak karakter 1 ditambah karakter 1.
Jadi mengapa hal ini tidak mencetak hal yang sama?
Nah karakter 1 ditambah karakter 1, karakter 1 memiliki nilai ASCII 49.
Jadi ini benar-benar mengatakan 49 ditambah 49, dan akhirnya ini akan mencetak 98.
Jadi ini tidak mencetak 2.
>> Pertanyaan 17.
Lengkapi pelaksanaan aneh di bawah ini sedemikian rupa
bahwa fungsi mengembalikan nilai true jika n ganjil dan false jika n genap.
Ini adalah tujuan besar untuk operator mod.
Jadi kami mengambil kami argumen n, jika n mod 2 sama dengan 1, baik
yang berarti bahwa n dibagi oleh 2 memiliki sisa a.
Jika n dibagi 2 memiliki sisa, yaitu berarti bahwa n adalah ganjil, jadi kami kembali benar.
Lain kita kembali palsu.
Anda juga bisa melakukan n mod 2 equals nol, kembali palsu, yang lain kembali benar.
>> Pertimbangkan fungsi rekursif di bawah ini.
Jadi jika n kurang dari atau sama dengan 1, kembali 1,
lain kembali n kali f n minus 1.
Jadi apa fungsi ini?
Nah, ini hanya fungsi faktorial.
Ini baik diwakili sebagai n faktorial.
>> Jadi pertanyaan 19 sekarang, kita ingin mengambil fungsi rekursif ini.
Kami ingin membuatnya berulang.
Jadi bagaimana kita melakukannya?
Nah untuk staf solusi, dan lagi ada
beberapa cara Anda bisa melakukannya itu, kita mulai dengan produk int ini
sama dengan 1.
Dan sepanjang ini untuk loop, kita akan
untuk mengalikan produk untuk akhirnya berakhir dengan faktorial lengkap.
Jadi untuk int i sama dengan 2, i adalah kurang dari atau sama dengan n, i ++.
>> Anda mungkin bertanya-tanya mengapa saya sama 2.
Nah, ingat bahwa di sini kita harus pastikan kasus dasar kami adalah benar.
Jadi jika n kurang dari atau sama 1, kami hanya kembali 1.
Jadi di sini, kita mulai dari i sama dengan 2.
Nah jika saya adalah 1, maka the-- atau jika n adalah 1, maka untuk loop
tidak akan mengeksekusi sekali.
Dan jadi kami akan hanya produk kembali, yaitu 1.
Demikian pula, jika n adalah sesuatu yang kurang dari 1--
jika itu 0, 1 negatif, whatever-- kita masih akan kembali 1,
yang persis apa yang Versi rekursif lakukan.
>> Sekarang, jika n lebih besar dari 1, maka kita akan
untuk melakukan setidaknya satu iterasi dari loop ini.
Jadi katakanlah n adalah 5, maka kita akan melakukan kali produk sama dengan 2.
Jadi sekarang produk 2.
Sekarang kita akan melakukan kali produk sama dengan 3.
Sekarang 6.
Kali produk sama dengan 4, sekarang 24.
Kali produk sama dengan 5, sekarang 120.
Jadi pada akhirnya, kita kembali 120, yang benar 5 faktorial.
>> Pertanyaan 20.
Ini adalah satu di mana Anda harus mengisi dalam tabel ini dengan algoritma tertentu,
apa yang kita lihat, bahwa cocok ini algoritmik run
kali ini berjalan kali asimtotik.
Jadi apa yang merupakan algoritma yang adalah omega dari 1, tapi O besar n?
Jadi mungkin ada jauh banyak jawaban di sini.
Salah satu yang kita lihat mungkin yang paling sering hanya pencarian linear.
>> Jadi dalam kasus terbaik skenario, item kami
cari adalah di mulai dari daftar
dan omega dari 1 langkah, hal pertama yang kami periksa,
kita hanya segera kembali bahwa kita menemukan item.
Dalam skenario kasus terburuk, item tersebut di akhir,
atau item tersebut tidak ada dalam daftar sama sekali.
Jadi kita harus mencari seluruh daftar, semua n
elemen, dan itulah mengapa itu o n.
>> Jadi sekarang itu adalah sesuatu yang baik omega n log n, dan O besar n log n.
Nah hal yang paling relevan kita lihat di sini adalah menggabungkan semacam.
Jadi menggabungkan semacam, ingat, akhirnya theta
n log n, di mana theta didefinisikan jika kedua omega dan O besar adalah sama.
Kedua n log n.
>> Apa sesuatu yang omega n, dan O n kuadrat?
Nah, sekali lagi ada beberapa kemungkinan jawaban.
Di sini kita kebetulan mengatakan bubble sort.
Insertion sort juga akan bekerja di sini.
Ingat bahwa bubble sort memiliki optimasi yang mana,
jika Anda bisa mendapatkan melalui seluruh daftar
tanpa perlu melakukan apapun swap, maka, baik,
kita bisa langsung kembali bahwa daftar diurutkan untuk memulai.
Jadi dalam skenario kasus terbaik, itu hanya omega n.
Jika tidak hanya baik diurutkan daftar untuk memulai dengan,
maka kita harus O n kuadrat swap.
Dan akhirnya, kita memiliki pilihan semacam untuk n kuadrat, baik omega dan besar O.
>> Pertanyaan 21.
Apa integer overflow?
Nah lagi, mirip dengan sebelumnya, kita hanya memiliki finitely banyak bit
untuk mewakili integer, jadi mungkin 32 bit.
Katakanlah kita memiliki integer ditandatangani.
Kemudian akhirnya tertinggi angka positif kita dapat mewakili
adalah 2 sampai 31 minus 1.
Jadi apa yang terjadi jika kita mencoba untuk kemudian increment integer yang?
Yah, kita akan pergi dari 2 ke 31 minus 1, sepanjang jalan turun ke negatif 2
ke 31.
Jadi integer overflow ini ketika Anda terus incrementing,
dan pada akhirnya Anda tidak bisa mendapatkan lebih tinggi dan hanya
membungkus sepanjang perjalanan kembali sekitar untuk nilai negatif.
>> Bagaimana buffer overflow?
Jadi buffer overflow-- ingat apa penyangga adalah.
Ini hanya sepotong memori.
Sesuatu seperti sebuah array adalah buffer.
Jadi buffer overflow adalah ketika Anda mencoba untuk mengakses memori
di luar akhir array.
Jadi jika Anda memiliki array ukuran 5 dan Anda
mencoba untuk mengakses berbagai braket 5 atau bracket 6 atau braket 7,
atau apa pun di luar end, atau bahkan apa pun
below-- Array braket negatif 1-- semua dari mereka adalah buffer overflows.
Anda menyentuh memori dengan cara yang buruk.
>> Pertanyaan 23.
Jadi dalam satu ini Anda perlu untuk melaksanakan strlen.
Dan kami memberitahu Anda bahwa Anda bisa menganggap s tidak akan null,
sehingga Anda tidak perlu melakukan cek untuk null.
Dan ada beberapa cara Anda bisa melakukan ini.
Di sini kita hanya mengambil mudah.
Kita mulai dengan counter, n. n adalah menghitung berapa banyak karakter ada.
Jadi kita mulai dari 0, dan kemudian kita iterate atas seluruh daftar.
>> Apakah s braket 0 sama dengan karakter null terminator?
Ingat kita sedang mencari karakter null terminator
untuk menentukan berapa lama string kita adalah.
Itu akan mengakhiri string yang relevan.
Begitu juga s braket 0 sama untuk null terminator?
Jika tidak, maka kita akan melihat s bracket 1, s braket 2.
Kami terus berjalan sampai kita menemukan null terminator.
Setelah kami telah menemukan itu, maka n mengandung total panjang string,
dan kami hanya dapat kembali itu.
>> Pertanyaan 24.
Jadi ini adalah satu di mana Anda harus membuat trade off.
Jadi satu hal yang baik dalam satu cara, tapi dengan cara apa itu buruk?
Jadi di sini, menggabungkan semacam cenderung lebih cepat dari bubble sort.
Setelah mengatakan itu-- baik, ada adalah beberapa jawabannya di sini.
Tapi yang utama adalah bahwa bubble sort adalah omega n untuk daftar diurutkan.
>> Ingat bahwa meja kami hanya lihat sebelumnya.
Jadi gelembung macam omega dari n, skenario kasus terbaik
adalah itu bisa saja pergi daftar sekali, menentukan
hey hal ini sudah diurutkan, dan kembali.
Menggabungkan semacam, tidak peduli apa Anda lakukan, adalah omega n log n.
Jadi untuk daftar diurutkan, gelembung semacam akan menjadi lebih cepat.
>> Sekarang bagaimana terkait daftar?
Jadi linked list dapat tumbuh dan menyusut cocok sebagai banyak unsur yang diperlukan.
Setelah mengatakan itu-- begitu biasanya perbandingan langsung
akan menjadi terkait daftar dengan array.
Jadi meskipun array dapat mudah tumbuh dan menyusut
cocok sebagai banyak unsur sesuai kebutuhan, sebuah linked list
dibandingkan dengan sebuah array-- Array memiliki akses acak.
Kami dapat mengindeks ke setiap elemen tertentu dari array.
>> Jadi untuk sebuah linked list, kita tidak bisa hanya pergi ke elemen kelima,
kita harus melintasi dari awal sampai kita sampai ke elemen kelima.
Dan itu akan mencegah kita dari melakukan sesuatu seperti pencarian biner.
Berbicara tentang pencarian biner, pencarian biner cenderung lebih cepat daripada pencarian linear.
Setelah mengatakan itu-- jadi, satu hal yang mungkin
adalah bahwa Anda tidak dapat melakukan biner pencarian pada daftar terkait,
Anda hanya bisa melakukannya pada array.
Tapi mungkin lebih penting, Anda tidak dapat melakukan pencarian biner
pada array yang tidak diurutkan.
Dimuka Anda mungkin perlu untuk memilah array, dan hanya kemudian dapat
Anda melakukan pencarian biner.
Jadi jika hal Anda tidak diurutkan untuk memulai dengan,
maka pencarian linear mungkin akan lebih cepat.
>> Pertanyaan 27.
Jadi pertimbangkan program di bawah ini, yang akan di slide berikutnya.
Dan ini adalah satu di mana kami akan ingin secara eksplisit menyatakan
nilai-nilai untuk berbagai variabel.
Jadi mari kita lihat itu.
>> Jadi baris satu.
Kami memiliki int x sama dengan 1.
Itulah satu-satunya hal yang telah terjadi.
Jadi pada satu baris, kita lihat di kami tabel, bahwa y, a, b, dan tmp semua
pingsan.
Jadi apa yang x?
Yah kita hanya mengatur itu sama dengan 1.
Dan kemudian baris kedua, baik, kita melihat bahwa y diatur ke 2,
dan meja sudah diisi untuk kita.
Jadi x adalah 1 dan y adalah 2.
>> Sekarang, garis tiga, kami sekarang dalam fungsi swap.
Apa yang kami melewati untuk swap?
Kami melewati ampersand x untuk , dan ampersand y untuk b.
Di mana masalah sebelumnya menyatakan bahwa alamat x
adalah 0x10, dan alamat y adalah 0x14.
Jadi a dan b adalah sama dengan 0x10 dan 0x14, masing-masing.
>> Sekarang pada baris ketiga, apa x dan y?
Yah, tidak ada yang berubah tentang x dan y pada saat ini.
Meskipun mereka di dalam stack frame utama,
mereka masih memiliki sama nilai-nilai yang mereka lakukan sebelumnya.
Kami belum mengubah memori apapun.
Jadi x adalah 1, y adalah 2.
Baik.
Jadi sekarang kita mengatakan int tmp sama dengan membintangi sebuah.
Jadi pada line empat, semuanya adalah sama kecuali untuk tmp.
Kami tidak mengubah nilai-nilai apa pun kecuali tmp.
Kami sedang mengatur tmp sama dengan membintangi sebuah.
Apa itu bintang?
Nah, poin ke x, Jadi membintangi sebuah akan x sama, yaitu 1.
Jadi semuanya akan disalin bawah, dan tmp diatur ke 1.
>> Sekarang baris berikutnya.
Bintang sama bintang b.
Jadi dengan garis five-- baik lagi, semuanya adalah sama kecuali apa bintang adalah.
Apa itu bintang?
Yah, kita hanya mengatakan bintang adalah x.
Jadi kita mengubah x dengan bintang yang sama b.
Apa itu star b? y. b menunjuk ke y.
Jadi Bintang b adalah y.
Jadi kami sedang menyiapkan x sama dengan y, dan segala sesuatu yang lain adalah sama.
Jadi kita melihat di baris berikutnya yang x sekarang 2, dan sisanya hanya menyalin.
>> Sekarang di baris berikutnya, bintang b sama tmp.
Yah, kita hanya mengatakan bintang b adalah y, jadi kita sedang menyiapkan y sama dengan tmp.
Segala sesuatu yang lain adalah sama, jadi semuanya akan disalin ke bawah.
Kami sedang menyiapkan y sama dengan tmp, yang satu, dan segala sesuatu yang lain adalah sama.
>> Sekarang akhirnya, baris tujuh.
Kami kembali fungsi utama.
Kami setelah swap selesai.
Kami telah kehilangan a, b, dan tmp, tapi akhirnya kami
tidak mengubah nilai-nilai apa pun pada saat ini,
kita hanya menyalin x dan y turun.
Dan kita melihat bahwa x dan y sekarang 2 dan 1, bukan 1 dan 2.
Swap telah berhasil dijalankan.
>> Pertanyaan 28.
Misalkan Anda temui pesan kesalahan
bawah selama jam kerja tahun depan sebagai CA atau TF.
Menyarankan bagaimana untuk memperbaiki setiap kesalahan tersebut.
Referensi sehingga terdefinisi untuk GetString.
Mengapa Anda melihat ini?
Nah, jika seorang siswa menggunakan GetString dalam kode mereka,
mereka telah benar Hash termasuk CS50 dot h untuk memasukkan perpustakaan CS50.
>> Nah, apa yang mereka perlu untuk memperbaiki kesalahan ini?
Mereka perlu melakukan lcs50 dasbor di baris perintah ketika mereka kompilasi.
Jadi, jika mereka tidak lulus dentang dasbor lcs50, mereka
tidak akan memiliki yang sebenarnya kode yang mengimplementasikan GetString.
>> Pertanyaan 29.
Secara implisit menyatakan fungsi perpustakaan strlen.
Nah ini sekarang, mereka tidak memiliki melakukan hash yang tepat termasuk.
Dalam kasus ini, file header mereka perlu menyertakan string dot h,
dan termasuk tali dot h, sekarang yang student-- sekarang compiler
memiliki akses ke deklarasi strlen,
dan ia tahu bahwa kode Anda adalah strlen menggunakan dengan benar.
>> Pertanyaan 30.
Lebih persen konversi dari argumen data.
Jadi apa ini?
Nah ingat bahwa persen ini signs-- bagaimana mereka relevan dengan printf.
Jadi dalam printf kita mungkin percent-- kita mungkin mencetak sesuatu
seperti persen i backslash n.
Atau kita mungkin mencetak seperti persen i, ruang, persen i, ruang, persen i.
Jadi untuk masing-masing tanda persen, kita perlu
untuk melewati sebuah variabel pada akhir printf.
>> Jadi jika kita katakan paren printf persen i backslash paren n dekat,
baik, kita katakan bahwa kita akan mencetak integer,
tapi kemudian kita tidak lulus printf integer untuk benar-benar mencetak.
Jadi di sini lebih persen konversi dari argumen data?
Itu mengatakan bahwa kita memiliki sejumlah besar persen,
dan kita tidak memiliki variabel yang cukup untuk benar-benar mengisi pada mereka persen.
>> Dan kemudian pasti, untuk pertanyaan 31, pasti kehilangan 40 byte dalam satu blok.
Jadi ini adalah kesalahan Valgrind.
Hal ini mengatakan bahwa suatu tempat dalam kode Anda,
Anda memiliki alokasi yang 40 byte besar sehingga Anda malloced 40 byte,
dan Anda tidak pernah dibebaskan itu.
Kemungkinan besar Anda hanya perlu untuk menemukan beberapa kebocoran memori,
dan menemukan di mana Anda perlu membebaskan blok ini memori.
>> Dan pertanyaan 32, menulis tidak valid ukuran 4.
Sekali lagi ini adalah kesalahan Valgrind.
Hal ini tidak harus dilakukan dengan kebocoran memori sekarang.
Hal ini, sebagian besar likely-- Maksudku, itu semacam hak memori yang tidak valid.
Dan kemungkinan besar ini adalah beberapa semacam buffer overflow.
Di mana Anda memiliki sebuah array, mungkin array integer, dan mari kita
mengatakan itu dari ukuran 5, dan Anda mencoba menyentuh berbagai braket 5.
Jadi jika Anda mencoba untuk menulis ke nilai, itu bukan bagian dari memori
bahwa Anda benar-benar memiliki akses ke, dan sehingga Anda akan mendapatkan error ini,
mengatakan menulis valid ukuran 4.
Valgrind akan mengenali Anda mencoba untuk menyentuh memori tidak tepat.
>> Dan itu saja untuk quiz0.
Aku Rob Bowden, dan ini adalah CS50.