>> [音楽再生]
>> 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。
そして牛は面白くないさ。
それだけだここで意味 進数。
しかし、どのようなキーだと、私は店をしました何かということです ローカル変数は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はさえずり]
>> [音楽再生]