[音楽再生] DAVID J.マラン:すべての権利。 [笑い] お帰りなさい。 これはCS50です。 そして、今週5の終わり。 そして、今まで、我々はほとんどをしました 当たり前の服用しているそこに あなたがしたこのコンパイラ、Clangのは、存在している これにより自されて 他のツールは、その何とかしてくださいと呼ばれる 魔法のようにソースコードを変換します オブジェクトコード、0と1に そのコンピュータのCPU、中央 処理装置、実際に理解しています。 の番号があるうちが、それは変わり でボンネットの下で起こって 入力と出力の間である。 そして、私は我々が肉を提案したいと思います にもう少し詳細にその出 これらの4つのステップ、と呼ばれるものを持っている 前処理、何か 我々が見てきたコンパイル、、と呼ばれる 何かが組み立てと呼ばれ、 何かは、リンクと呼ばれる。 だから今まで、我々の一部で プログラムは、我々はシャープを持っていた含まれています。 さらに最近では我々はいくつかのシャープを持っていた 定数に定義されています。 だから、そのそれらのものと判明 ハッシュ記号が付いているか シャープ記号は、プリプロセッサである ディレクティブ。 それはちょうどそれが言っての派手な方法だ 実際のコードの行 前に何か他のものに変換 コンピュータも、あなたを変換しよう 0と1にプログラム。 たとえば、シャープは、標準的な含まれています I / O。hは、かなり単に行く意味 先に、ファイルの内容をつかむ stdio.hに、右そこに貼り付けます。 ない0と1だから その時点ではまだ。 それは本当にただ置換だ。 そして、それは、いわゆる中に行われている 前処理段階では、ときに 実際に特にClangのを実行したり、 ほとんどの場合にしてください。 だから、このすべてが起こっている 最初に自動的にこれまで。 その後、コンパイル手順が来る。 しかし、我々は、単純化してきた コンパイル。 プログラムをコンパイルすると、本当にに意味 、C言語のようなものからそれを取る ソースコードは、我々がダウンして、書いてきた アセンブリと呼ばれるものに。 アセンブリ言語は低レベルです ありがたいことに、私たちはしませんが、言語 あまりする機会た この学期を書きます。 しかし、それは中で最低レベルだ あなたは文字通り、書き込みを開始するという意味 加算および減算と乗算とロード メモリからメモリへの保存、 非常に基本的な命令を、そのコンピュータ、 ボンネットの下に、 実際に理解しています。 最後に、組み立ては、その言語を取り 我々がしてきたことを0と1に これまで記述した。 そして本当に最後に、いわゆるあり 段階を結ぶ、その我々はよ 組み合わせたちょっと、に表示 あなたのゼロとゼロを持つものと ものを他の人々の前に あなたが作成した。 だから、このスーパー簡単なプログラムを検討してください。 これは、第1週からだった。 それはちょうど、世界こんにちは、言った 画面上で。 私たちは、Clangのを介してこれを実行しました。 または我々は確認を通じてそれを実行しました どのClangのを実行しました。 どこで同時に出力 いくつかの0と1。 そこうちしかし、それは変わり 中間段階。 私はこっちに行けば - おっと、しませんでした まだ彼を見たいと思っています。 私はアプライアンスにこっちに行けば と私はここに、hello.cをを開く その同じプログラムである。 そして、私は私の端末でやろうとしているもの ここでウィンドウが私はするつもりださ Clangのを実行するのではなく、作る、その の4つのすべてを自動化 私たちのためにこれらのステップ。 そして、私は打ち鳴らす-Sを実行するつもりだと 入力しhello.cをした後。 そして、私は点滅するプロンプトが表示され 再び、これは良いです。 そして今、大きめのウィンドウで、 私はここでgeditのを開くつもりです。 そして私は、そのファイルを開くつもりだ これはhello.s呼ばれ、判明 そのアセンブリ言語が含まれています 私は以前に言及した。 そして、これは、アセンブリと呼ばれるものです。 言語、かなり低レベル インテルCPUその指示 または何でもそれは内部にあるということです 理解しています。 とmovファイルは、移動のためのものです。呼び出しは、のためである 、非常に低レベル関数を呼び出す。 サブは、減算のためのものです。 ですから、内部特定のCPUを持っているとき お使いのコンピュータから、何がそれを作る 上の明瞭なのに対し、他のCPU 市場では、されている命令をそれ それは理解し、多くの場合、どのように効率的な それはいくつかを実行するにはどのように高速であり、 これらの命令の。 これについての詳細のために今、あなたが取ることができます 大学で次の秋CS61。 しかし、ここでは、例えば、いくつかを持っている 見覚えがあるかもしれない識別子。 hello.cのは、プログラムの名前です。 。テキスト - 関心の多くはそこではありません ちょうど今、そのテキストをリコール どこでセグメントは、月曜日の時点で、ある メモリは、プログラムが実際に終わる。 だから、少なくとも漠然とだ そこにおなじみ。 ここでは、当然のことながら、記載され 私たちの主な機能の。 下にスクロールし、これらは物事を参照してください レジスタと呼ばれる、非常に小さなチャンク あなたの実際のCPUの内部メモリ。 と私も下にスクロールした場合 さらに、私はいくつかの並べ替えを参照してください ASCIIの間接的な言及。 そして、確かに、その文字列があり、 こんにちは、カンマ、世界。 だから長い話短い、これはされてい 、自動的にあなたのために何が起こって ボンネットの下に、このすべての時間。 そして、一度で本当に何が起こっている あなたは、またはの方法でClangのを実行した は、最初に取得している、してください ソースコードから、 いわゆるアセンブリ言語。 次にClangのこのアセンブリに変換されます ダウンして0と1に言語。 そして、これは我々が開始したことをスライドで 上の0週での議論 - その後に週1。 そして最後に、これらの0と1 0と1と組み合わせて 私たちが取ってきたこれらのライブラリから 標準I / O等を付与するため 文字列ライブラリ、あるいは CS50ライブラリ。 だから、もっとこの絵を描くために 視覚的に、我々はhello.cを持っている。 それは、もちろん、printfのを使用して 言うべき機能、こんにちは世界。 コンパイルのステップはそれを取る そのファイル我々だけであっても、hello.sを見た 一般的に削除されたことだけど 自動的にあなたのために。 しかし、それはアセンブリコードです 途中工程において そして、我々は、アセンブリを組み立てるとき いわば言語、、あなたです これらの0と1を取得します。 だから私たちは、今日効果的にズームしました 我々は当然のことと取ってきたもの、 ソースコードに行く意味 コー​​ドをオブジェクトに提供します。 しかし、最後に、今では同じ画像 - それを上に突き出すましょう 左側。 そして、そこのトップであることに注意してください 私はstdio.hに言及した。 それは我々が含まれてきたファイルだ ほとんどすべての内 我々が書いたプログラム。 そして、それは、その内容、ファイルの コピー貼り付けを取得、 効果的にあなたのコードの上に。 しかし、それは、コンピュータ上で判明 システムのどこか、おそらくそこ 誰かが年書いたstdio.cファイル 前のすべてを実装する 宣言された機能 stdio.hにした。 今、現実にはでないでしょう あるいは中にお使いのMacまたはPC CS50アプライアンスは、生のCコードです。 誰かがすでにそれをコンパイルし、含まれている 。Oオブジェクトコードのファイルまたは。 共有ライブラリを参照するファイル、 それは、プリインストールされていると あなたのためにプリコンパイル。 しかし、確かに存在すると仮定 並行して、当社のコンピュータstdio.c上 Clangのと。 あなたのコードがコンパイルされている と組み立て。 stdio.cのコードがコンパイルされており、 組み立てられたので、この非常に最後の ステップは、ダウンしてここで、私たちは何とかしなければならない リンク、いわば、あなたの0と1 一つに彼または彼女の0と1との 最終的には、単純なプログラム こんにちはだけ呼ばれる。 だからです魔法のすべてです これまで起こって。 そして、これらを取るしていきます 付与するためのプロセスですが、実現する ジューシーな詳細の多くはあり そこの下に行く。 そして、これはあなたが作るものです インテルの内側を備えたコンピュータ 特に異なる。 だから、そのノートに、あなたがしたい場合 今週の金曜日にランチにご参加、行くのですか いつもの場所のcs50.net/rsvpに、 13:15今週の金曜日。 そして今、いくつかの発表。 だから我々はいくつかの良いニュースを持っている。 そして、私たちはいくつかの悪いニュースがある。 ここでいくつかの良いニュースを開始します。 [うめき]を わかりました。 まあ、それはそう、技術的には休日だ それはそんなに私たちからの贈り物ではありません。 もちろん、しかし、その後、悪いニュース。 [うめき]を 私は多くの時間を費やし これらのアニメーションに。 [笑い] レビューセッションがあります これは月曜日来る。 それは17:30になるだろう。 我々は、すべてのこれらの詳細を思い出させます 当然の上で電子メール経由で 日の時間だけのカップルでWebサイト。 これは、撮影し利用できるようになります その後まもなく。 あなたはその月曜日作ることができないのであれば 夜のスロットは、心配しないでください。 のセクションでは、この来週にもなります クイズのためにレビューに焦点を当てています。 あなたのセクションでは、ある月曜日にある場合 確かに大学の休日、我々は まだセクションで会う。 あなたは、単にそれを作ることができない場合 あなたが行っているため、節 離れて、それは大丈夫です。 日曜日または火曜日セクションに出席したり チューンでジェイソンのセクションに、そのある オンラインで利用できる。 だから、より多くの悪いニュース。 だからシラバスによると、 我々は次の金曜日の講義を持っている。 しかし、良いニュース - 明らかに、私はこの上であまりにも多くの時間を費やした。 [笑い] 私たちは、次の金曜日の講義を取り消すでしょう。 だから、私たちへの贈り物になりますので、 本当にでの素敵な休息を持つことができます 今週ひいては二週間の間に。 無講義来週、ほんのそう あなたがあるべきために少しクイズ、 ますます興奮。 だから今に目を向けるみましょう 確かに、より視覚的な何か とよりエキサイティングとステージを設定する 地平線上になるだろう何のために 週時間だけのカップルである。 最初のクイズの後、我々は回します 我々の問題の焦点は別のものに設定します ドメイン固有の問題、その より一般的に科学捜査やセキュリティ。 実際には、この問題と伝統 セットには、私のための一つである 歩いて渡るために仲間やCAを教える いくつかの写真を撮るキャンパス 特定できるが、非自明人、 場所や物事、その後毎年I 何とか誤って削除するには、管理 またはデジタルメディアカードが乱れる それが私たちのカメラの中だ。 しかし、大したことない。 私が先に行くとプラグインすることができます 私のコンピュータにその。 私は、それのフォレンジックイメージを作ることができる ゼロをコピーすることによって、話すことと そのメモリカードのものから、どうか そのSDカードやコンパクトフラッシュカードまたは あなたが精通している何でも。 そして、我々はそれを配ることができます。 そして、他の間で先に挑戦、 あなたのためのものは、書くことになります の全体の束を回復Cコード 私と明らかにしたためのJPEGファイルは次のようになります それらの人々、場所、または物事。 そして、我々はまた、この問題では、話しましょう 設定し、日に来て、約 より一般的なグラフィック。 我々は、もちろん、それらを使用してきました 抜け出すために。 しかし、あなたは、ソートの付与のために撮影した これらの高レベルの概念が存在する 長方形や楕円形の。 しかし、ボンネットの下に ピクセルがあります。 そして、あなたが開始しなければならなかった それらについて考える。 それともあなたは、p-4セットで考える必要があります あなたの煉瓦の間のギャップについて、どのように 迅速にボールが渡って動いている 抜け出すための画面が表示されます。 だから、この概念があります 画面上のドットです すでに遊びに来る。 今、あなたは何を参照してください、しかし、何ですか あなたは、コンピュータの画面上に取得します。 あなたは今まで、いくつかの良いかを見てきた場合 悪いテレビ、オッズは、彼らはかなりある 最新技術のような聴衆を扱う 誰が本当にない コンピューティングについて多くを知っている。 そしてそれは、警察のために非常に簡単です と言って探偵、次のことができます 私にとってそれをクリーンアップ? または右に、強化? 強化で話題の単語のようなものです ほとんどすべての犯罪関連のshow。 あなたは非常にを取る場合と現実です やって容疑者のぼやけた画像 何か悪いことは、することはできません ちょうどそれを高める。 あなたは、無限にズームすることはできません。 あなたが誰かのの輝きに見ることができない というコミット目 もかかわらず、特定の犯罪、 テレビでこれの有病率。 そしてましょうがそれを動機とすること 今後の問題はで垣間見るで設定 あなたといくつかのショー 慣れているかもしれません。 [ビデオの再生] -OK。 さて、あなたをよく見ましょう。 それをホールド。 そのバックを実行します。 分を待ちます。 右に行く。 - あり。 それを凍結。 - フルスクリーン。 -OK。 それを凍結。 その上で締め、屋だろうか? その男に、インベクトル 後輪で。 この場で右ここでズーム。 - で適切な機器、画像化された 拡大してシャープすることができます。 - どのようなそれはだ? - それは強化プログラムです。 - できる何かそれまでをクリア? - 私は知らない。 それを強化しましょう​​。 セクション6 - 強化。 -Iは、ディテールを強化して - -Iは、強化するために十分だと思う。 私の画面にそれを解放。 彼女の目に反射を強化。 のこれを介して実行しましょう​​ - ビデオエンハンスメント。 - エドガー、あなたはこれを強化することができますか? オンハング。 - 私は、この反省に取り組んでき。 - 誰かの反射。 反射。 反射は、あります 男の顔の。 反射。 - そこ反射です。 ミラー上でズーム。 - あなたは反射を見ることができます。 - できるここからイメージを高める? - できるあなたは正しいここで彼を高める? - できるあなたはそれを向上させる? - できるあなたはそれを向上させる? - できる我々はこれを強化する? - できるあなたはそれを向上させる? 第二にホールド、私は強化するだろう。 ドアの上にズーム。 -X10。 ズーム。 [笑い] インチ-MOVE 停止、ウェイト。 ·停止します。 それを一時停止。 周りに75度回転させる 垂直方向でお願いします。 [笑い] 部分にバック停止し、 ドアについて再び。 ·ガットイメージエンハンサー それはビットマップできますか? - 多分、我々はプラディープセンを使用することができます ウィンドウに参照するための方法。 - このソフトウェアは、芸術の状態です。 ·アイコンの値はoffです。 - で正しい組み合わせ アルゴリズムの。 - 彼は次のように照明アルゴリズムを取ってきて 次のレベルと私はそれらを使用することができます この写真を向上させる。 オンロックとz軸を拡大。 - 強化。 - 強化。 - 強化。 凍結と高める。 [ENDビデオ再生] DAVID J.マラン:だから問題セット 図5は、先にそこにあるものです。 だから我々はすぐに理解を得るだろう いつ、なぜあなたは缶の と私たちはそのように向上させることはできません。 しかし、最初のが我々の注意を返しましょう 我々はよビルディングブロックの一部に その話をできるようにする必要があります。 だから我々は、この絵を描いたことを思い出してください 月曜日と少し先週。 そして、これは物事のレイアウトを記述 お使いのコンピュータのメモリ内のとき いくつかのプログラムを実行する。 トップまでハイテクセグメント、リコールは、参照 実際の0と1に それは、プログラムを構成する。 あり、その下に、いくつかのだが初期化または どの一般的に初期化されていないデータ、 や定数のようなものを指します 文字列や持っているグローバル変数 事前に宣言されて。 そこヒープですが、我々は来る バックビットのものと。 そしてスタックがあります。 多くはでトレイの積み重ねのような メモリが取得する場所カフェテリアは、これは いつレイヤーとレイヤー あなたは、プログラムの中で何をすべきか? のスタックの使用とは何ですか? うん? 関数の呼び出し。 関数を呼び出す任意の時間、それは そのため、メモリのスライバーに与え ローカル変数やパラメータ。 と画像で、私たちは、それぞれのことを参照してください 連続的な時関数は、呼び出さ 通話B呼C呼び出しD、それら スタックに重ね得る。 およびそれらのスライスの各々の中 メモリは、基本的にユニークなスコープです その機能のために、その、もちろん、 あなたが手にする場合は問題がある 一つの関数から別の部分へ あなたがそれをするデータの 突然変異または変更します。 だから有効にする私たちのソリューションは何だった つのスタックに代表される機能 メモリを内部で変更するフレーム 別のスタックフレームの? どのようにお互いにこれら二つの話をしますか? だからポインタまたはアドレスの方法によって、 どこのどの、再び、単に記述 特定の方法でメモリ、 一口番号、特定の 値を求めることができる。 だからあまりにも私たちが続けて最後の時間を思い出す でストーリーと見た かなりバギープログラム。 そして、このプログラムは、いくつかのためのバギーです 理由が、ほとんど気になる1つは それは何をチェックするために失敗したから? ええ、それは入力をチェックするために失敗した。 申し訳ありませんが? それは、12文字以上なら。 だから、非常にスマートに、memcopyを呼び出すときに、 ただその、名前が示すように、 その第二引数からコピーがメモリ 最初の引数に。 三番目の引数は、非常にスマートであり、 そうでないことを確認するためにチェック 長さは、この場合には、より多くのコピー バー、文字数、 これで先に 配列C.しかし、問題はである何 C自体は十分な大きさでない場合 それを処理する? あなたの番号をコピーするつもりだ あなたが与えられてきたことバイト。 しかし、あなたは実際にもっと何がありますか あなたのための部屋を持っているよりもバイト? さて、このプログラムは非常に愚かにだけ やみくもにそれはどんな取るに進み 与えられた、ハローバックスラッシュ0です 文字列が短い場合は偉大 十分に、5文字のような。 しかし、それは実際に12文字以上の場合 1,200文字、我々は最後の時間を見た あなただけの完全にしようとしている メモリを上書きしている あなたに属していません。 最悪の場合には、上書きした場合、その そこに我々はと呼ばれる赤い部分 アドレスを返す - これは単にどこにコンピュータ 自動的に、あなたのために、後ろに 離れるシーン、タック32ビット値その それがどうあるべきかのアドレスにそれを思い出させる 戻ったときにfooに、この他の機能、 実行中に行われます。 それはある種のパン粉だ 、それを返します。 、潜在的に、あなたがそれを上書きした場合 あなたが悪い男なら、可能性ができます 潜在的に引き継ぐ 誰かのコンピューター。 そして、あなたが最も確かによ ほとんどの場合、それをクラッシュ。 今、この問題は、唯一悪化しました 我々は、メモリの話を始めた より一般的に管理。 そしてmallocが、メモリの割り当てのために、ある 我々は割り当てに使用できる関数 我々は事前にはわからないメモリ 我々はいくつかを必要とするかもしれない。 だから、例えば、私は戻って行けば ここでアプライアンスに。 そして、私は、前回のhello2.cから開く 見て、ここでこのプログラムを、リコール このように少し何か、 わずか3行 - 、あなたの名前、文字列名を明記 左側に、GetStringメソッドと等しい。 そして、我々は、それをプリントアウト ユーザの名前。 だから、これは超シンプルなプログラムでした。 明確にするために、私が先に行かせて とハロー2メイク。 私はドットスラッシュこんにちは-2をやるつもりです。 自分の名前を述べる - デビッド。 入力します。 デビッドこんにちは。 これは、[OK]を動作するように思われる。 しかし、何が本当に起こっている ボンネットの下にここに? 最初みましょういくつかの層に戻って皮をむく。 文字列は、ちょうど私達がした同義語です 何のために実現? シャアスター。 だから、もう少し難解な作ってみましょう しかし、より技術的に正しいこのこと ことを意味してcharの星であり、 名前、はい、変数です。 しかし、どのような名前を格納するのアドレスです 少し奇妙な感じのchar、 私は文字列を取り戻すことだから。 私は戻って複数取得しています 文字char型ではない。 しかし、もちろん、あなただけの最初が必要 覚えておくべきシャアアドレス 全体の文字列は、なぜためです? あなたはどのように把握するかどこの終わり 文字列は、先頭を知っていますか? バックスラッシュゼロ。 だから、見つけ出すそれら二つの手がかりと 始まりと終わりの前に 任意の文字列には、あまりにも長い間、彼らはしているようであり、 適切にそのヌルを形成し ターミネータ、そのバックスラッシュゼロ。 しかし、これはGetStringメソッドを呼び出している。 そしてそれはそのGetStringメソッドが判明 すべてのこの時間は、種のでした 私たちのために不正行為。 それは、確かに、この労働をやっている、 ユーザから文字列を取得。 しかし、メモリはどこだ から来て? 我々はここで絵に戻った場合と だけから定義を適用 一瞬前に、スタックがどこにあること 関数が呼び出されたときにメモリが行く そのロジックでは、GetStringメソッドを呼び出したとき、 そして私はを入力 どこにあるD--V-I-D D-A-V-I-D、入力 に基づいて保存されたバックスラッシュゼロ、 話我々ははるかに私たちに語ってきた? それはであるように思えるでしょう スタック、右? あなたは文字列を取得呼び出すときに取得 スタック上のメモリの少しスライス。 だから、D-A-V-I-Dその理にかなって スラッシュゼロが格納され そこにスタックした。 しかし、GetStringメソッドを返しちょっと待って を意味し、その文字列、いわば、 それは食堂からトレイです スタックから取得されます。 そして、私たちはそのできるだけ前回述べた 関数が戻ると、あなたはそれを取る スタックからトレイ、いわば、何 あなたは、の残骸について仮定することができます そのメモリ? 私は、ソートの疑問符としてそれらを直した 彼らは効果的になるため 未知の値。 ときに、いくつかの彼らは再利用することができます 次の関数が呼び出されます。 換言すれば、我々は起こる場合 保存する - 私は迅速な絵を描くよ ここでスタック。 我々はボトムを描くことが起こる場合 私のメモリセグメントの、我々は言うだろう これはメモリの場所であること メインと多分argをCとによって占め 引数vおよびプログラムで何、 GetStringメソッドが呼び出されたときに、 おそらく、GetStringメソッドを取得します ここでメモリの塊。 そして、D-A-V-I-D何とか この関数の中で終わる。 そして、私は極端に単純つもりです。 しかしみましょうそのD-A-V-I-Dと仮定し スラッシュゼロ。 したがって、この多くのバイトがで使用されている GetStringメソッドのためのフレーム。 しかし、すぐにGetStringメソッドを返すように、我々 最後の時間によると、上のこのメモリ ここで全てになります - オエーッと吐く! - すべては事実上消去となります。 そして、私たちは疑問として今、この考えることができます マークを知っているので 何がそのメモリになるだろう。 確かに、私は非常に頻繁に関数を呼び出す GetStringメソッド以外。 とすぐに、私はいくつかの他のを呼ぶように GetStringメソッドより機能、そうでないかもしれないで 私たちはただ見て、この特定のプログラム しかし、いくつかの他、確かにいくつかの他に この関数は、与えられて終わるかもしれない スタック内のこの次のスポット。 だから、そのGetStringメソッドを格納することはできません スタック上のD-A-V-I-D、私はなるので すぐにそれにアクセスできなくなります。 しかし、我々は、彼らが知っているGetStringメソッド ものだけを返す? それはに戻っていない 私の6文字。 それは本当に何をしたの返して 我々は最後の時間を締結? 最初のアドレス。 だから何とか、あなたがGetStringメソッド呼び出されたときに、 それはのためにメモリのチャンクを割り当てている 文字列、ユーザーのタイプと それのアドレスを返す。 そしてそれはあなたがしたときにしたいことが判明 これでメモリを割り当てるための機能 と呼ばれる人への道とリターン その関数のアドレス メモリのチャンクは、絶対に でスタックにそれを置くことができません 機能的にはそれだけだからボトム、 非常にあなたにならないようにしよう すぐに、そうあなたはおそらく推測できる場所 我々は、おそらくそれを投げるつもり 代わりに、いわゆるヒープ。 だからあなたのメモリのの底部との間 レイアウトとメモリの上部の レイアウトはセグメントの全体の束である。 一つは、スタック、右 その上ヒープです。 とヒープは、ちょうど別の塊です 機能のために使用されていないのメモリ それらは呼ばれるしているとき。 それは、時、長期的記憶のために使われてい あなたには、いくつかをつかむために一つの関数にしたい メモリとそれにハングアップすることができる それ以上の制御を失うことなく。 今、あなたは、おそらくすぐにできた これではないことがわかり 完璧なデザインは必ずしも。 あなたのプログラムは、上のメモリが割り当てられたよう スタック、またはお電話としてより より多くの機能、または割り当てとして としてオフmalloc関数でヒープ上のメモリ GetStringメソッドは何明らかに、やっている 避けられない問題であると思われる? 右。 これらの矢印のように、その事実 お互いを指している 良い前兆ではあ​​りません。 そして実際、我々は非常に迅速にクラッシュする可能性が 任意の数の方法でプログラム。 実際、私は我々が持っているかもしれないと思う この偶然に一度行わ。 またはされていない場合、それを行うみましょう 意図的に今。 私が先に行くとすぐにスーパー書いてみましょう プログラムはdontdothis.c呼んだ。 そして今、私はここに行くよと シャープは、stdio.hのを含んでください。 関数fooが取る宣言してみましょう ある引数がない、ない ボイドによって同様に示される。 とfooがやろうとしている唯一の事はある おそらくないコールfooを、 賢いアイデアですが、そのためである。 耳鼻咽喉科メイン無効。 今メイン唯一の事は起こっている 実行すると、同様にfoo 'を呼び出すだけです。 そして、ちょうどキックのために、私は行くつもりです 先にこことからこんにちは "printfを言う fooの。 " OK。 だから私は、どんなミスをしなかった場合、 dontdothisドットスラッシュを作る。 とのは、大きなウィンドウでそれをやらせる - ドットスラッシュ、dontdothis。 さあ。 ああええと。 どうやら、あなたはこれを行うことができます。 畜生。 OK。 待って。 スタンバイ。 我々がした - 我々は作るとそれを使用しました。 [ため息] 私は知っているが、私は我々だと思います ちょうどそれを削除した。 ええと、ええ。 畜生。 このロブを解決します。 何? それは非常に簡単です。 ええ、私たちは、最適化をオフにした。 OK、さようなら立つ。 今、私は良い感じ。 OK。 わかりました。 だから、これをコンパイルしてみましょう - あなたはdontdothis作る。 あなたは、この名前を変更する必要がある場合があります 一瞬でdothis.c。 そうしよう。 ありがとう。 OK。 だから私は、印刷されたという事実 外に何かがただ実際にあった によって我々のプロセスを遅くする その点に到達したであろう。 OK。 ふーっ! だから何が実際に起こっている? ただ余談として、そこに理由は、、です 入力の面で何かをやって 出力が遅くなる傾向にあるので、あなた に文字を記述する必要があります 画面には、それはスクロールする必要があります。 だから長い話短い、私は実際に持っていた そうせっかち起こった、我々は持っているでしょう 同様にこの最終結果見。 今、私はプリントアップの乗り心地を得たこと、 我々はすぐにそれを参照してください。 では、なぜこれが起こっている。 まあ、もちろん簡単な説明、 fooはおそらくならないことがある 自分自身を呼び出すこと。 今、一般的な用語で、 これは再帰です。 そして、私たちは数週間考え 前に再帰的な良いです。 再帰は、この魔法のような方法です 簡潔スーパー自身を表現。 そして、それだけで動作します。 しかし、全ての主要な機能があります 私たちが話した再帰プログラム 約これまでを見て、どの 彼らは何を持っていたことでしたか? いくつかのハードコーディングされたベースケース、 いくつかの状況で述べている場合 明らかにあるfooという、呼び出すことはありません ここではそうではありません。 だから、本当に何が起こっている この写真の面で? まあ、時メインfooに、それを呼び出します メモリのスライスを取得します。 fooはfooのを呼び出すと、それを取得します メモリのスライス。 fooはfooのを呼び出すと、それは、スライスを取得します。 これは、スライスを取得します。 これは、スライスを取得します。 fooが復帰されることはありませんので。 我々は、これらのいずれかを消去することはありませんしている スタックからフレーム。 だから私たちは、ヒープ介さず吹いている 誰が他に何を知っている、と言及する 我々は我々の範囲を逸脱している メモリのセグメントいわゆる。 エラーは、セグメンテーションが偽行く。 だから、そこに解決策はある 明らかにこれを行わない。 しかし、もっと大きな意味合いは、はい、です 絶対にいくつかの制限があり、 それはよくする方法として、定義されていない場合でも、 あなたが呼び出すことができる多くの機能 プログラムは、何回機能 自分自身を呼び出すことができます。 私たちは、再帰を説教しましたので、あっても この潜在的に魔法のものとして シグマのため数週間前 機能、ときに我々がデータを取得する 構造とCS50、他のを見ることができます そのためのアプリケーションが、そうではありません 必ずしも最高のもの。 この関数は、それ自身を呼び出している場合なので、 ベースがある場合であっても、自分自身を呼び出す 場合、あなたはそのベースケースをヒットしていない場合 1,000通話または10,000コールに対して、バイ あなたは部屋を使い果たしたかもしれないその時 あなたのいわゆるスタックとヒットに メモリのいくつかの他のセグメント。 だから、それはあまりにも設計のトレードオフです エレガンスの間との間で あなたの特定の堅牢 実装。 だから、別の欠点やはあり 私たちがしたものに別の落とし穴 これまで行ってき。 私がGetStringメソッドと呼ばれるとき - 私がhello-2に戻ってみましょう。 、私は、GetStringメソッドを呼び出していることに注意してください これは、アドレスを返している。 そして、私たちは今日の主張そのアドレス ヒープからです。 そして今、私はプリントアウトしています そのアドレスの文字列。 しかし、我々は呼ばれたことがない GetStringメソッドの反対。 我々のような機能をcalllしなければならなかったことがない あなたが手背中ungetstring、 そのメモリ。 しかし、率直に言って、我々はおそらく、 されている必要があります。 ので、我々はコンピュータを求め続ければ のような誰かの記憶のために、別の方法 GetStringメソッドは、しかし確実に、それをお返しすることはありません それもにつながるためにバインドされて 我々は、メモリが不足することにより、問題​​が。 実際に、我々はこれらを探すことができます 用法新しいツールの問題 入力するのは少し不可解です。 しかし、私が先に行くとそれを飛散させ 一瞬で画面上に。 私が先に行くと、Valgrindのを実行するつもりです その最初のコマンドパラメータを使用して ライン引数名です そのプログラムハロー2。 そして残念なことにそれは 出力はatrociouslyです 理由もなく複雑。 だから我々はすべてのその混乱を参照してください。 ダビデは私の名前の状態です。 だからプログラムです 実際に実行されている。 そして今、我々はこの出力を得る。 だからValgrindのも同様です 精神GDBへ。 それはそれ自体デバッガではありません。 しかし、それはメモリチェッカーです。 それはあなたを実行するプログラムです プログラムは、あなたが要求された場合を教えてくれ メモリ用のコンピュータとそれを手渡したことがない バックすることにより、あなたが持っていることを意味 メモリリーク。 とメモリリークが悪くなる傾向があります。 そして、あなたは、コンピュータのユーザーが持っている おそらくこれはあなたが持っているかどうか、と感じた MacやPC。 あなたは今までお使いのコンピュータを使用している といくつかの再起動ではないながら、 日、またはあなただけのたくさん持っている 実行中のプログラム、そしてこいつ 研削停止に遅く、または少なくとも ので、それは、使用する超迷惑なんだ すべてはただのスーパーが遅くなった。 今では、理由をいくつでも指定できます。 これは、無限ループのバグかもしれません 誰かのコード、または、もっと簡単に、それ あなたがより多くを使っていることを意味するかもしれない あなたのよりメモリ、またはしようとすると、 コンピュータが実際に持っています。 そして、おそらく、いくつかのプログラムにバグはあり メモリを求めておくこと。 年間のブラウザはために悪名高いでした これは、より多くのメモリを要求する が、それを戻って渡すことはありません。 きっと、あなただけの有限のを持っている場合 メモリの量は、あなたが求めることができません 無限に多くの回 そのメモリの一部。 そしてあなたもかかわらず、ここで何を参照してください 再びValgrindのの出力がある 一瞥することが不必要に複雑 最初に、これは面白い部分です。 ヒープ - 出口で使用中です。 だからここにどのくらいのメモリだっただ でヒープ内の使用されている 時間は、私のプログラムが終了した - 一つのブロックで明らかに6バイト。 だから私は私の手を振るつもりだ 何でブロックです。 より多くの、それだけで塊です考える チャンクのための技術的な単語。 しかし、6バイト - その6バイトは何ですか まだ使用されていましたか? まさに。 D--V-I-Dスラッシュゼロ、5文字 名とヌル終端文字。 したがって、このプログラムは、私がいることに気づいvalgrindの で、どうやら、6バイトを求め GetStringメソッドのように、決して それらを与えた。 実際に、これはそうではないかもしれません 私のプログラムは、次の3つではない明らかな場合 行が、それは300行です。 だから私たちは、実際に別のコマンドを与えることができます へのvalgrindライン引数 それより冗長にします。 それは覚えて少し迷惑なんだ。 しかし、私がしなければ - 見てみましょう。 リーク - それが漏れていた - でも、私は覚えていません それは手から何か。 - リークチェックが完全に等しくなります。 うん、ありがとうございました。 - リークチェックが完全に等しくなります。 入力します。 同じプログラムが実行されています。 再びデビッドを入力します。 今私は、もう少し詳細を参照してください。 しかし、ヒープの要約以下、その 4と同じです - ああ、 これはいいの一種である。 今、Valgrindのは、実際に探しています 私のコードで少し難しい。 そしてそれは、明らかに、それを言っている ラインでのmalloc - 私たちは、ズームアウト。 ラインで - 我々はそれが何であるかのラインは表示されません。 しかし、malloc関数は、最初の原因です。 malloc関数でブログがあります。 大丈夫? いや、OK。 右? 私がGetStringメソッドと呼ばれる。 GetStringメソッドは明らかにmalloc関数を呼び出します。 それでは、コードの行は、明らかです。 持つための障害で このメモリを割り当てられた? 誰でも、mallocを書いたと仮定してみましょう 十分な長さ、それがだと回避されている ではない彼らの障害。 だから、それはおそらく私です。 cs50.cにGetStringメソッド - だそう コンピュータ上でファイルのどこか - ライン286の犯人であると思われる。 今CS50がされていることを前提としてみましょう 時間のまともな量のために周りにいるので、 我々はあまりにも無謬である。 そしてそれはGetStringメソッドはおそらくありません バグがあるのではなく、内にあること ハロー2.Cライン18。 それでは見てみましょう そのライン18は何だったの。 ああ。 どういうわけか、この行は必ずしもない バギー、それ自体が、それが理由です そのメモリリークの背後に。 だからスーパー単に、何が直感的だろう ここに解決策になる? 我々はメモリを求めている場合は、決してなかった それを恩返し、それがあると思われる 時間をかけて私のコンピュータなぜなら問題 メモリが不足する可能性があり、遅くなるかもしれません ダウン、悪いことは、まあ、起こるかもしれない シンプルで直感的な解決策は何ですか? ちょうどそれをお返し。 あなたどのようにメモリを解放するのですか? まあ、ありがたいことに、それは非常に簡単です ただ自由に名前を言うように。 そして、私たちは前にこれをやったことがない。 しかし、あなたは本質的に考えることができます malloc関数の逆のように自由。 無料の反対です メモリを割り当てる。 だから今、私はこれをコンパイルしましょう​​。 こんにちは-2を作る。 私は再びそれを実行してみましょう。ハロー2デビッド。 だから、で動作するように思われる まったく同じ方法。 しかし、私はValgrindはに戻って、再実行した場合 私の新たに上に同じコマンド コンパイルされたプログラムで、次のように入力 以前のように私の名前で - 素敵。 ヒープの要約 - 出口で使用されている - ゼロブロックでゼロバイト。 そして、これは超素敵な、すべてである ヒープブロックが解放された。 漏れはできません。 そうではなく、問題のセット4で、間近に迫って しかし、問題セット5、フォレンジックと 以降、これもなろう 自分の正しさの尺度 あなたが持っているかどうかをプログラム、 またはメモリリークがありません。 しかし、ありがたいことに、あなたは、推論することができますだけでなく、 その直感、それを通して 小さなプログラムのために簡単に、間違いなく、ある しかし、大規模なプログラムのために難しく、 、それらの大規模なプログラムのために、Valgrindは あなたが特定するのに役立ちます 特定の問題。 しかし、もう一つ問題があり それが発生する可能性があります。 、である、私はここで、このファイルを開いてみましょう 再び、やや簡単な例。 しかしみましょう、何に焦点を当て このプログラムではありません。 これはmemory.cのと呼ばれています。 我々は、この後の今日投稿します 今日のソースコードのzipファイル。 そして、私はと呼ばれる機能を持っていることに気付く 引数を取りませんfと 何も返しません。 20行目では、私は明らかに宣言しています int型とX呼び出しへのポインタ。 私は割り当ててるリターンです malloc関数の値。 そして、ちょうど午前何バイト、明確にすること 私はおそらくmalloc関数から戻ってき この状況で? おそらく40。 あなたどこそこから入手できますか? さて、あなたはint型が頻繁にあることを思い出している場合 4バイト、少なくともそれが入っている アプライアンス、10回4は明らかに40です。 だから、malloc関数は、アドレスを返している メモリのチャンクと保管その Xで最終的に解決する。 だから、何を明確にする その後、何が起こっている? まあ、私は戻って切り替えることができ ここで私たちの絵に。 私はちょうど私の下を引くないようにしましょう コンピュータのメモリは、私が先に行かせてと 全体の矩形を描画している 私のRAMのすべてを表しています。 私たちは、スタックと言うでしょう 底にある。 とテキストセグメントであり 初期化されていないデータ。 しかし、私は単なる抽象的なものに行くよ ドットドットドットとして離れて他の事。 私はちょうどこれを参照するつもりです 上部にヒープとして。 そして、この絵の下部にある、 メインを表現するために、私は行くよ それをスライスメモリを与えるために スタック上。 Fの場合、私はそれをスライスを与えるつもりだ スタック上のメモリ。 さて、私は私に相談するようになった 再びソースコード。 メインのローカル変数は何ですか? どうやら何もないので、そのスライスである 効果的に空かなくても同じ大きさ 私はそれを描かれてきたように。 しかし、Fで、私は、ローカル変数を持っている それはXと呼ばれています。 だから私は先に行くとfを与えるつもりだ それX呼び出しメモリのチャンク、。 10回4のそして今のmalloc、 そののmalloc 40、だから メモリはから来る? 私たちは、絵を描かれていませんでした 前にこれが好き。 しかし、のは、それが効果的だと仮定してみましょう 、ここから来ているので、1 2個、3個、4個、5個。 そして今、私はこれらのうちの40が必要です。 だから、僕は提案するドット、ドット、ドットをやる さらに多くのメモリががあること ヒープから戻ってくる。 今のアドレスは何ですか? Let 'sは、私たちの任意を選択 いつものように対処 - それはおそらく起こっているにもかかわらずOx123、 完全に異なるものになるように。 それは最初のバイトのアドレスです 私は、mallocを求めていることをメモリ。 だから短い、一度ラインに20が、実行 文字通り何ですか ここで、xの内部に格納されて? Ox123。 Ox123。 そして牛は面白くないさ。 それだけだここで意味 進数。 しかし、どのようなキーだと、私は店をしました何かということです ローカル変数はx、である。 再びしかし、そのデータ型、 int型のアドレスです。 まあ、私はOx123を保存するつもりです。 しかし、再び、それはあまりにも少ないのであれば 私はスクロールすると、不必要に複雑に 背中、私たちは、この離れて抽象的なことができ非常に 合理的に、ちょうどxがあると言う メモリのチャンクへのポインタ。 OK。 手元に今の質問 次のようになります - 21行目は、それが判明した、バグがある。 なぜですか? 申し訳ありませんが? それは持っていません - もう一度のことを言う。 まあ、それは無料ではありません。 だから、第二だが。 だから、他の1が、特にはあり 21行で。 まさに。 このコードのシンプルなラインだけである バッファオーバーフロー、バッファオーバーラン。 バッファは、単にメモリの塊を意味している。 しかし、メモリのチャンクサイズである 我々ば意味10、10の整数、 糖衣構文を使用してそれへのインデックス 配列表記、正方形の は、へのアクセスをブラケットを持っている Xブラケット0 Xブラケット×1、 ブラケットドット、ドット、ドット。 Xブラケット9は最大のものです。 だから私はXブラケット10、どこを行う場合 私は実際にメモリ上に行くよ? まあ、私は10 int型を持っている場合 - 実際にすべてを描画してみましょう これらのうち、ここで。 だから最初の5つでした。 ここでは他の5のintです。 だからXブラケット0はここにある。 Xブラケット1は ここに。 Xブラケット9はここにある。 Xブラケット 10は、私が語っていることを意味し、ここにある ライン21において、コンピュータは置くために 番号どこ? 番号0? まあ、それは、はい0です。 しかし、単に事実その0 偶然のようなものです。 それは数字かもしれません 50、我々は気にすべてのために。 しかし、我々はXブラケットでそれを置くことをしようとしている これは10、 疑問符は、描画される 良いことではありません。 このプログラムは非常によくかもしれない 結果としてクラッシュ。 それでは、先に行くと、この場合を見てみましょう 何が起こるか、確かに、ある。 ファイルから、メモリを作る memory.cのと呼ばれています。 Let 'sは、先に行くと実行 プログラムメモリ。 だから我々は幸運、実際に、それは思われる。 我々は幸運。 しかし、我々は今、Valgrindのを実行した場合見てみましょう。 一見すると、私のプログラムは、かもしれない 完全に正しいと思われる。 しかしでValgrindは私が実行してみましょう - 漏れチェックは、メモリ上で完全に等しい。 そして今、私はこれを実行したときに - 興味深い。 無効でサイズ4の書き込み memory.cのの21行。 memory.cのの21行目はどちらでしょうか? ああ、面白い。 しかし、待ってください。 サイズ4を参照することは何ですか? 私は、1件のみが書いた しかし、それはサイズ4のだ。 なぜそれが4? それはint型だから、だた 、再び、4バイトです。 だから、私はそのバグを見つけましたvalgrindの 私のコードをちらっと見、しませんでした。 そして多分あなたのTFは、でしょうかではないでしょう。 何でも、ことがわかった確かにValgrindは 私たちも、そこに間違いがあった 我々は幸運だ、とでもコンピュータ 決めた、ええ、私はクラッシュするつもりはない あなたは1バイト、1に触れたという理由だけで あなたはしませんでしたメモリのint型の価値 実際に自分自身。 さて、ここでバギーほかに何かある。 アドレス - これはクレイジー見てアドレスです 進した。 ただどこかにヒープ内であることを意味すること サイズ40のブロックの後にゼロバイト 割り当てられている。 私はここにズームアウトした場合を見てみましょう これは、もう少し便利です。 興味深い。 40バイトは間違いなく失われ 1の損失レコード1インチ 繰り返しになりますが、より多くの言葉はここに便利です。 しかし、強調表示された行に基づいて ここで私はおそらく私が焦点を当てるべきである 別のバグのために注目? memory.cのの20行目のように見えます。 我々は、20行目に戻るのであれば、それはだ 以前に識別1。 そしてそれは必ずしもバグではありません。 しかし、我々は、これはその効果を逆転した。 それでは、どのように私は、少なくとも修正か それらの過ちの一つ? 私は、21行目の後に何ができますか? 私は、Xの自由され行うことができます そのメモリをお返しします。 そして、どのように私は、このバグを修正するのですか? 私は間違いなく行くべき ない遠く0より。 だから私はこれを試してみて、再実行してみましょう。 申し訳ありませんが、間違いなく行く ない遠く9より。 メモリを作る。 私はValgrindのを再実行してみましょう 大きなウィンドウに表示されます。 そして今見て。 ニース。 すべてのヒープブロックが解放された。 漏れはできません。 とここまで、上記の言及はありません 無効な右のいずれかより。 ただ貪欲得る、としてみましょうする 別のデモかどうかを確認 意図したとおりにいかない - 私は一瞬前に幸運でした。 これが0であるという事実は、おそらくある 不必要な誤解を招く。 わずか50、ある程度任意の操作を行いましょう 数、メモリドットスラッシュメモリを作る - まだ幸運を得る。 何もクラッシュするでしょう。 私は本当に何かをすると仮定し 愚かな、私は100を行う。 、私は記憶をリメイクしましょう ドットスラッシュメモリ - 再び幸運。 どのように約1,000? 超え整数、大体、 私はどこにあるべきか? メモリを作る - 畜生。 [笑い] OK。 もう周りに台無しにしないでみましょう。 メモリを再実行してください。 そうしよう。 わかりました。 だから、明らかにあなたは、インデックス10万整数を あなたにされているべき場所を越えて メモリ、悪いことが起こる。 だから、これは明らかではない 硬い、速いルール。 私はトライアルを使ってのようなものだった とエラーが発生したを取得する。 しかし、これは、長い話短いからである コンピュータのメモリにも分かれています これらの事にセグメントと呼ばれる。 そして、時には、コンピュータが実際 あなたに少しより多くのメモリを与えている あなたが求めるより。 しかし、効率のために、それにだけ簡単だ より多くのメモリを得るだけを教えてくれ あなたはそれの一部を取得していること。 そして、あなたは時々幸運を得る場合には、 したがって、あなたが触れることができるかもしれない あなたに属していないメモリ。 あなたは、その何か価値保証はありません あなたは、そこに滞在します置くので コンピュータはまだそれがないと考えている あなたが、それは必ずしもないだろう メモリの別のセグメントをヒットする コンピュータとミスを誘発するような ここでこの1。 わかりました。 その後、メモリ上の任意の質問は? わかりました。 で、その後、のはここで見てみましょう 我々が取ってきたもの かなりの時間が与えられ、その cs50.h.と呼ばれるこのファイルにある だから、これはファイルです。 これらは全体の集まりです トップまでのコメント。 そして、あなたは、この場合を見たかもしれない アプライアンス上で周りに突き。 しかし、それは、そのすべての時間が判明 我々は次のように文字列を使用するために使用される場合 同義語、我々は宣言するための手段 その同義語はこれであった 型定義のtypedefキーワード。 そして、我々は本質的に言っている、メイク charの星のシノニムを文字列。 によってスタックを意味すること として知られているこれらの補助輪を作成しました 文字列。 今ここにはただのプロトタイプだ getchar関数のために。 我々は前にそれを見たかもしれないが、それはだ 確かにそれが何をするか。 getchar関数 引数を取らない、charが返されます。 getDoubleはは、引数をとりません 二重を返します。 getFloatは、引数なし、戻りを受け取り フロートなどが挙げられる。 場合、getIntがここにあります。 getlonglong ここにあります。 とGetStringメソッドがここにあります。 そして、それはそれだ。 この紫の線は、他のプリプロセッサです ためのディレクティブ その冒頭ハッシュタグ。 わかりました。 だから今私はcs50.c.に手放す そして、私たちはこれに長すぎる話はありません。 しかし、あなたに何を垣間見るを与えるために このすべてが起こってき 時間は、私に行こう - getchar関数行うみましょう。 だからgetchar関数はほとんどのコメントである。 しかし、それはこのようになります。 だから、これは実際の関数である 我々がしてきたことをgetchar関数 当たり前の取ることは存在しています。 そして、我々はこのいずれかを使用していないにもかかわらず、 かつてなら、多くの場合、それは、少なくともだという 比較的簡単。 だから、取って価値がある ここで簡単に見。 だからgetchar関数は、無限ループを持っている 意図的にそう明らかに。 その後、呼び出し - これはのようなものです 私達は私達自身が書いたコードの再利用をニース。 これは、GetStringメソッドを呼び出します。 それを何ので char型を取得する意味ですか? さて、あなたは同様に取得しようとするかもしれません ユーザーからのテキストの行全体と そしてちょうど1を見て それらの文字の。 60行目では、ここで少しだ 健全性チェックのビット。 GetStringメソッドがnullを返した場合は、 続行のないようにしましょう​​。 何かが間違っていた。 さて、これは多少面倒ですが、 おそらくC. charの最大値で、従来 何を表しているかだけ その名前に基づいて? それは一定です。 それは数値のようなものだ あなたと表すことができる最大のchar おそらく数です一口、 最大の数はあなたです255、 、8ビットを表す ゼロから始まる。 だから私は、ときに、この関数では、これを使用しました 理由だけで、このコードを書く 何かがgetchar関数でうまくいかない場合が、 生活の中でその目的は返すことです char型は、何とかできるようにする必要があります そのユーザに通知する 何かが間違っていた。 我々は、nullを返すことはできません。 それはヌルポインタであることが判明した。 そして再び、getchar関数は持って char型を返します。 だから規則は、何かになった場合 間違った、またはで、プログラマ、あなたです この場合、私にライブラリと、私が持っていた 場合だけ、任意に決める 何かがうまくいかない、私はするつもりです 本当にある数字255を返す 我々は、ユーザが入力することはできませんができないことを意味 で表現される文字 我々が持っていたので、番号255はそれを盗む いわゆるセンチネル値としての 問題を表しています。 今では判明しているキャラクター255 あなたが入力できるものではありません あなたのキーボードは、ので、それは大したことではありません。 ユーザーが気付かないこと 私はこの文字を盗んだ。 しかし、あなたはこれまでのmanページに表示される場合 コンピュータシステムには、いくつかの基準 一定のこのようなすべてのキャップと言い、 エラーの場合、この定数は、かもしれない すべてのいくつかの人間だと、返された 数年前に任意に決定されました この特別な値を返し、 それに一定の場合に呼び出す 何かがうまくいかない。 今、マジックはここダウンが起こる。 まず、私は67行で宣言しています 二つの文字、C1とC2。 そして68行目で、実際にそこ を彷彿とさせるのコード行 そのことを考えるとprintfの私たちの友人、 引用符でCsの割合を持っていません。 しかし、ここで何が起こっているかに気づく。 sscanf関数は、文字列のスキャンを意味します - フォーマットされたスキャンを意味します 文字列、エルゴsscanf関数。 どういう意味ですか? それはあなたが文字列をsscanf関数に渡すことを意味します。 とラインが何である ログインユーザーの種類 あなたのような形式の文字列をsscanf関数に渡す 何ですscanf関数を伝え、この あなたは、ユーザーがログイン入力したことを望んで その後、合格イン2のアドレス この場合のメモリの塊、、 私には2つのプレースホルダを持っているからです。 だから私はそれにアドレスを与えるつもりだ C1とC2のアドレス。 そして、あなたが機能を与えることを思い出してください いくつかの変数のアドレス、何 意味合い? その関数は、結果として何ができる それのアドレスを与える 変数とは対照的に 変数そのもの? それは右、それを変更することができますか? あなたは、物理的に誰かマップを持っていた場合 アドレスは、彼らはそこに行くと何ができる 彼らはそのアドレスで好き。 ここで同じ考え。 我々はsscanf関数、2のアドレスに渡す場合 メモリのチャンクも、これらの小さな メモリ、C1、C2の少しの塊が、 我々はそれにそれらのアドレスを教えて sscanf関数は、それを変更することができます。 人生のsscanf関数の目的はそう、私たちが読む場合 manページには、読むこととは何か で入力したユーザーは、あるユーザの希望 多分文字で入力し、 別の文字、そしてどのようなユーザ 入力された、最初の文字が行く ここで、第二の文字はここに行く。 さて、余談ですが、この、あなたはでしょう のみ、ドキュメントからこれを知っている 私はそこに空白を入れているという事実 ちょうど私があれば気にしないことを意味します ユーザーは、いくつかのスペースバーを打つ 彼または彼女は取り回前 文字、私は無視するつもりです 空白。 ように、私が知っているから マニュアルを参照してください。 第二%cはそこだという事実 空白が続くが、実際に 意図的。 私は、検出できるようにしたい場合は、ユーザー めちゃくちゃか協力していませんでした。 だから私は、ユーザーが入力しただけで期待している 一文字で、従って私は願っています そのsscanf関数のみを返すために起こっている 値1は、私が読んでいる場合は、再度、なぜなら ドキュメンテーション、sscanf関数の目的で 寿命は数に戻すことです 充填した変数 ユーザー入力を持つ。 私は、2つの変数で渡さ アドレス、C1とC2。 私の唯一のことは、しかし、願っています 彼らは殺されるためならsscanf関数 2を返し、おそらく何 論理的に含意? ユーザーは、ちょうど私1を与えていないこと 文字のように私は彼に言ったまたは彼女。 彼らはおそらくで入力 少なくとも2文字。 だから私は、代わりに第二を持っていなかった場合 %cは、私はちょうど、ものを持っていた 率直に言って、より直感的になります アプローチ、私は一目見ただけだと思い、 あなたを検出できるようにするつもりはない ユーザーがより多くのことを与えている場合に あなたが実際に望んでも入力。 だから、これは暗黙の形です エラーチェックの。 しかし、私がここで何をすべきかに気づく。 かつて私は、ユーザーが私に1を与えたと確信している キャラクターは、私がやって、ラインを解放 GetStringメソッドの反対、どの順番に malloc関数を使用していますし、私は戻ります C1、私が期待している文字 ユーザーが提供する、唯一の提供。 だから速いだけ垣間見たが、 getchar関数の質問? 私たちは他人のいくつかに戻ってくる。 まあ、私が先に行くと、これをやらせる - ちょうど私たちのやる気を引き出すために、今、仮定 週プラス時間の議論、この structs.hと呼ばれるファイルです。 そして再び、これはただの味です 待ち受けている何かの。 しかし予告その多く これのコメントです。 だから私は唯一のハイライト表示さ​​せ 今のところ面白い部分。 typedefは - 同じキーワードが再びあり。 typedefは、文字列を宣言するために使用 特殊なデータ型である。 あなたは、新しいブランドを作成するためにtypedefを使用することができます 存在していなかったデータ型 Cが発明されました。 例えば、int型はC.イワナが付属しています C.二重に付属しているC.が付属していますしかし、 学生の概念はありません。 そしてまだそれがあることが非常に有用であろう 格納するプログラムを書くことができる 変数に、学生のID番号、 自分の名前、そして彼らの家。 言い換えれば、三枚で int型などのデータの 文字列と別の文字列。 typedefを使用すると、何はかなり強力です このとのキーワードsturctについて 構造は、、2013年にプログラマー、 実際にあなた自身を定義することができます 年間存在していなかったデータ型 前にそれはあなたの目的に合わせ。 そしてここで、行19〜13で、 我々は次のように、新しいデータ型を宣言している int型が、学生呼び出し。 そして、この変数の内部がために起こっている int型、文字列、 - 三つのことである と文字列。 だから、あなたは本当に何を考えることができます この場合でも、ここで起こっ 今日のための簡素化のビット、 学生は基本的に起こっている このように見える。 そのはの塊になるだろう IDを持つメモリ、名前 フィールド、および社内フィールド。 そして、私たちはそれらのチャンクを使用することができるでしょう メモリ、それらを以下のようにアクセスします。 私はstruct0.cに行けば、ここにある 比較的長いが、以下の コー​​ドのパターンは、その この新たなトリックを使用しています。 だから最初に、私はあなたの注意を引くましょう トップまでの興味深い部分へ。 シャープは、学生3が定義され、宣言 定数と呼ばれる学生および譲受人 それだけで任意に番号3、 ので、私は3人の学生を使っています 今のところこのプログラム。 ここでメインが来る。 と通知は、どのように私は宣言しない 学生の配列? まあ、私はちょうど同じ構文を使用します。 単語の学生は明らかに新しく追加されました。 しかし、学生、クラス、ブラケットの学生。 だから、残念ながら多くはあり ここで用語の再利用。 これはただの数字です。 だから、これは、3つを言うようなものです。 クラスは、私が何をしたいだけです 変数を呼び出すことができます。 私はそれを生徒呼び出すことができます。 しかしクラスは、これはでクラスではありません 道のオブジェクト指向のJava一種。 それはちょうど学生のクラスです。 そして、すべての要素のデータ型 その配列の学生です。 だから、これは少々異なっています と何かを言ってから このように、それだけだ - 私は私に3人の学生を与えて言っている その配列クラスを呼び出します。 わかりました。 今ここには、4つのループです。 この男の精通 - 反復 アップでゼロから3まで。 そしてここでは、構文の新しい部分です。 このプログラムは、私を促すために起こっている それを生徒に与えるために人間、 intでID、。 そしてここでは、あなたがすることができるとの構文だ で、IDフィールドに何かを保存する 場所クラスブラケットI.だから この構文は、新しいものではありません。 これはちょうど私に八を与えることを意味し クラスの生徒。 しかし、このシンボルは、新しく追加されました。 今まで、我々は、ドットを使用していないことができました 少なくともこのようなコードである。 これはとして知られている構造体に行くことを意味し 学生とそこに何かを置く。 同様に、この次の行に、31、行く 先とどのようなユーザーがタイプを置く ここに名前のために、どのような彼らが行う 家、同じことが、先に行くと、 。家の中にそれを置く。 したがって、このプログラムが何をし 最終的にでしょうか? あなたはそこに少しのティーザーを見ることができます。 私が先に行くと構造0を作るのですかしましょう ドットスラッシュ構造体0、学生のID 1、 デビッド·メイザー、学生のID 2と言う。 ロブカークランド、学生ID 3。 ローレンLeverit - このプログラムはやった唯一の事、 これは、単に完全に任意です 私は、このデータを使って何かをやってみたかった 私はどのように教えてくれたことを今 構造体を使用し、私は持っていたです ここに、この余分なループ。 私は学生の配列を反復。 私は今、おそらく、おなじみの友人たちのを使用した、 文字列は、に、stircompを比較 チェックは、第8回学生の家です メイザーに等しい? そしてもしそうならば、単に何かを印刷 任意に好きな、はい、それはです。 しかし、再び、ちょうど私にチャンスを与える 使用して再利用し、 この新しいドット表記を再利用します。 だから、誰が右、気に? 学生のプログラムを考え出すことです。 ある程度任意、それが判明した 私たちは便利で物事を行うことができます これは、例えば以下の通りである。 これは、はるかに複雑構造体です Cでこれは、ダース以上のフィールドを持っている 多少ひそか名前。 しかし、あなたはこれまでグラフィックスのことを聞いてしまった場合 ビットマップと呼ばれるファイル形式、BMP、それ ビットマップファイルの形式が判明 かなりこのことのように見えます。 それは愚かな少しスマイリーフェイスです。 それは私がにズームしたことを小さな画像だ かなり大きなに私はそれぞれを見ることができるように 各ドットまたはピクセル。 我々は表すことができますうちさて、それは回り 番号0、と言うと黒のドット。 番号1と白のドット。 だから、他の言葉で、あなたが描きたい場合 スマイリーフェイスとでその画像を保存する コンピュータ、それがゼロを格納するために十分であると このように見えるものは、どこで、 再び、ものは白です そしてゼロは黒です。 と一緒に、あなたが効果的に持っている場合 1と0の身構える、あなたが持っている ピクセルのグリッド、あなたが横たわっていた場合 それらのうち、あなたはかわいいを持って 少しスマイリーフェイス。 ここで、ビットマップファイルフォーマット、BMPである 効果的にそのフードの下に、 しかし、より多くのピクセルSOTでそのあなた 実際に色を表すことができます。 しかし、あなたはより洗練されているとき BMPやJPEGやGIFなどのファイル形式 これであなたは、それらのおなじみのかもしれない ディスク上のファイルだけでなく、一般的に 画素に対して0と1を持っているが、 彼らは同様にいくつかのメタデータを持っている - 実際にはない意味でメタ データは、それが持っていると便利です。 だからここに、これらのフィールドが示唆され、 我々はP-セットで詳細にこれを表示されます 5、その0と1その前に 、画像内の画素を表す メタデータの束のようにあり 画像のサイズと 画像の幅。 そして、私はいくつかをオフに摘採よ気づく ここで任意のもの - 幅と高さ。 ビット数といくつか他のもの。 だから、ファイル内のいくつかのメタデータはあり。 しかし、ファイルが配置されてどのように理解することによって このように外に、あなたが実際にすることができます その後、画像を操作、イメージを回復する ディスクから、画像のサイズを変更します。 しかし、あなたは必ずしもできません それらを強化する。 私は写真を必要としていました。 だから私はあなたが見た人は、ここでRJに戻った 画面上でかなりの時間前。 私はここで基調講演を開く場合には、これは あなたがして拡大しようとすると何が起こる RJを高める。 彼は本当に任意の良くなっていない。 今基調はぼかしの一種である 少しだけをごまかすため RJは特に取得していないという事実 あなたはズームイン強化 そして、このようにそれを行う場合、 正方形を参照してください? うん、あなたは間違いなく見ることができます プロジェクタの正方形。 それはあなたが強化したときにあなたが得るものです。 しかし、理解する上でどのように我々のRJまたは スマイリーフェイスは、私たちにできるようになる実装されています 実際に操作するコードを記述する これらの事。 そして私はと、私はこの調子で終わるだろうと思っていた の55秒高めだが、 私はむしろ誤解を招くと言う、あえて。 [ビデオの再生] - 彼が横たわっている。 かについて、私は知らない。 - だから、私たちは何を知っていますか? 9時15分レイSantoyaアットそれ ATMにあった。 - だから、質問は何ですか 彼は9時16でやっていた? シューティング9ミリメートル 何かで。 たぶん彼は、狙撃兵を見た。 - または彼と一緒に働いていた。 - 待って。 1戻る。 - あなたは何を見ていますか? 、フルスクリーンで彼の顔をアップ持参。 - 彼のメガネ。 - そこ反射です。 - それはNeuvitas野球チームです。 それは彼らのロゴです。 - そして、彼は誰のに話している そのジャケットを着て。 [ENDビデオ再生] DAVID J.マラン:これは意志 問題セット5である。 私たちは、来週お会いしましょう​​。 男性話者:次のCS50で。 [CRICKETSはさえずり] [音楽再生]