>> [音楽再生]
>> ROB BODEN：すべての権利。
ビデオの最初のそのように、まず最初に、 おなじみの面から。
>> [ビデオ再生]
>> - すべての権利。
これはCS50であり、これは 週3の始まり。
私はあなたと一緒に存在することができませんでした申し訳ありません 今日が、私が紹介させて
CS50自身のロブ·ボーデン。
>> [ENDビデオ再生]
>> [拍手と歓声]
>> ROB BODEN：フィルモグラフィー中 そのビデオが幻想的です。
わかりました。
したがって、最初、別のランチがあります。
それが午前1時15分で明日の。
この金曜日はランチにありません。
それはQuoraのである。
とトミーはまだここにいないのですが、の1 元ヘッドのCFがある人、
トミーウィリアム。
そこで彼は、楽しい人だ。
あなたが来るはずです。
>> わかりました。
そう、先週、私たちは離れて壊し始めた 文字列が本当にあるかについて。
我々は初めから知っていた それは文字の列です。
しかし先週、我々は事実を掘り下げ 実際、一連のものであること
文字は、まあ、我々は今持っている 文字の配列。
そして、我々は、それは、配列、文​​字列のことを知っている 文字の、最後の最後で、
私たちはこの特別なNULLバイトを持って、この バックスラッシュ0、すなわち端を示す
文字列。
>> だから文字列はの配列です 文字が、我々はより多くを持つことができます
文字だけの配列、 我々はすべての配列を持つことができます
私たちが望むものの種類。
だから、あなたは先週から思い出して、 ダビデが導入された中世のプログラム
本当にすぐ。
私たちがやろうとしているので、最初のものです 整数をユーザーに尋ねる
部屋の中の人々の数。
我々はその整数を取得したら、 私たちは、配列を宣言している。
このブラケットの構文に注目してください。
あなたがそれに慣れるつもりだ。
>> だから我々は、整数の配列を宣言している 年齢と呼ばれ、Nがある
この配列内の整数。
右ここので、このパターンは、この4 INT 私は、iがn未満であり、0に等しい私のプラス
プラス、それはまた、パターンになるだろう あなたは非常に慣れていること。
それはかなりあなたがしている方法ですので、 いつもの配列を反復処理する予定。
そう、nがあることを覚えている 私たちの配列の長さ。
だからここでは、繰り返し求めている 部屋の中の人の私の年齢。
>> この後、我々がダウンし、何のために 任意の理由で、我々
彼らが行っているか、古いプリントアウト 今から年になる。
そのプログラムを実行している、してみましょう 年齢をする、ドットスラッシュ年代。
だから、部屋の中で人々の数、 それでは3があるとしましょう​​。
と言って、最初の人は13で、 次の26で、最後は30です。
だから、それは、それらの3を反復します 人々は、14から27、および31を印刷する。
>> だから覚えている私たちは、宣言するとき 大きさnの配列で、その内のインデックス
配列、配列は値を持ち、 インデックス0、1、2、すべての方法
までのNマイナス1。
だから我々が言ったとき3人があった 部屋の中、私たちはここに入れ
この貫通最初の反復 ループは、私が0になるだろう。
インデックス0でそう。
我々は最初に割り当てている ユーザーが入力した年齢。
その後、次のいずれかで、我々は、入力している 第2のnユーザが入り、中
2、最後のnに隣接しています。
>> そう気づくそのサイズの配列 3は何も持っていません
インデックス3にある。
これは有効ではありません。
わかりました。
だから、ここに戻って行く。
だから今我々は、配列を扱ったので、 我々はいくつかの知識を持っている。
今、私たちは、コマンドに移動するつもりだ であることを行っているライン引数、
この問題セットにかなり関係する。
>> だから今までは、いつでもしました 私たちは、あなたのmain関数を宣言しました
int型の主なボイドが言った。
ちょうどそれを意味しますので、ボイド 我々はすべてに合格していない
この関数の引数。
今、私たちはその主を見ることになるだろう いくつかの引数を取ることができます。
ここでは、int型のargcそれらを呼び出す と文字列ARGVブラケット。
ブラケットは、もう一度、示す 我々は、配列を扱っていること。
だからここに、文字列のargvブラケットは、私たちがしている 文字列の配列を扱う。
そうARGC、それが示すことになるだろう 我々はした引数の数
このプログラムに渡さ。
そして、それが何を意味するのかを確認するには、 それでは、これを閉じてみましょう。
>> [OK]をクリックします。
だから今まで、我々は、すべて実行した ドットスラッシュ年代のようなプログラム。
また、コマンドラインで、過去のことができます 引数を渡す、このように、用語、コマンド
ライン引数。
したがって、最初の引数、ハローワールド。
だからここに、ARGCは3になります。
これは、引数の数だ コマンドラインで。
ARGCは、常に少なくとも1であることから、ドット 年齢を大幅に削減する、それ自体の1としてカウント
コマンドライン引数。
>> その後こんにちは最初のものです。
ドットスラッシュ年齢はその後、ゼロ番目の場合 こんにちは初めてであり、世界がある
番目のコマンドライン引数。
だから、文字列argvは、我々は見ることになるだろう、 文字列は、ドットスラッシュが含まれています
年齢、こんにちは、そして世界。
そして、ダビデの要求によって、私たちはなるだろう それを導入したビデオを再生します。
>> [ビデオ再生]
>> 我々はしたプログラムで今までアップ 書かれた、私たちは宣言しました
メインとしてint型の主無効。
そしてすべてのこの時間は、その空隙があります 単純に指定され、その
プログラムは実行されません コマンドライン引数。
ユーザが実行換言すれば、 プログラム、彼または彼女は、コマンドを提供することができます
追記によるライン引数 単語やフレーズの後に、プログラムの
プロンプトで名前を付けます。
>> これを行うとさて、あなたはあなたのプログラムにしたい コマンドライン引数、1またはを取る
より多くのそのような言葉は、我々は交換する必要があります 引数のカップルと無効になる。
それでは、それをしてみましょう。
CS50.h.を含める
標準io.h.を含める
メインint型。
そして今、その代わりにボイドの、私はするつもりだ ARGCと呼ばれるint型、および指定
ARGVと呼ばれる文字列の配列。
今、argcとargvはある 単に規則。
>> 私たちは、これらの引数と呼ばれるかもしれない 私たちが望むほとんど何でも。
しかし、重要なのはARGCがあるということです int型定義により、それは、なぜなら
引数の数が含まれているとして、 合計の単語数、その
ユーザーは自分のプロンプトで入力しています。
ARGV、一方、引数ベクトルであり、 実際に格納し、配列になるだろう
ユーザーが持っているすべての単語 彼または彼女のプロンプトで入力。
>> それでは何かを進みましょう これらのうちの1つまたは複数と
コマンドライン引数。
特に、のは先に行くと印刷しましょう どのような単語のユーザータイプ
プログラム名の後に プロンプトで。
開いたブラケット。
閉じ括弧。
printfのパーセントのバックスラッシュとコンマ。
そして今、私は、printfどの値を指示する必要があります そのプレースホルダにプラグインする。
私は、ユーザーが持っている最初の単語をしたい プログラム名の後に入力した、
と私は指定するつもりだ ARGVブラケット1、近い
括弧、セミコロン。
>> 今、なぜブラケット1としないブラケット0？
まあ、それは自動的に保存され、判明した ARGV 0であることを行っている
プログラムの実際の名前。
ユーザーがその最初の単語はそう プログラムの名前がされた後に、バイ
条約になるだろう ARGV 1に格納されている。
それではコンパイルしてみようと このプログラムを実行する。
>> ARGV 0、ドットスラッシュARGV 0を作成します。
そして今、ハローのような言葉。
入力してください。
そしてそこに、我々はこんにちは、それを持っている。
>> [ENDビデオ再生]
>> ROB BODEN：すべての権利。
それを閉じます。
だからそのプログラムを見てみ 私たちはただ単に、まあ、私たちに導入
我々は0はargv印刷する場合、今、作る。表示 それは、ARGV 0、ドットスラッシュARGV 0ものです。
だから、期待どおりに、プリントアウトだ ARGV 0であるため、プログラムの名前
常にあることを行って プログラムの名前。
しかし、ここでは何かAをやらせる もっと面白いのビット。
>> だから、問題はセットでは、だろう この機能はatoiに導入。
だから我々はのためatoi関数をどのように使うのですか？
つまり、変換するために起こっている 整数に文字列。
だから私は、文字列を渡すと、1 2 3、 ATOIする、それはそれを変換します
整数、1〜2〜3。
だから我々は、最初に変換しようとしている 整数へのコマンドライン引数、
そして、ちょうどその整数を印刷します。
>> そこで、基本的に、我々はちょっとね ただ、のgetInt再実装
整数は、コマンドで入力されている プログラム内の行の代わりに、
対話的に。
それでは、ARGV 0を作る、のがしてみましょう ここでのこと、それを閉じます。
そうARGV 0を実行している、との、入力してみましょう 整数、1 2 3 4 1 2。
だから、1の整数を印刷します 2 3 4 1 2。
それをATOIするためにいくつかの微妙な点があります それは何も気に停止されます
有効な数値文字を超えて、 それは問題ではありません。
>> だから、何が起こるかだと思いますか 私はこれを行う場合はどうなりますか？
セグメンテーションフォールト。
だから、これはなぜですか？
あなたは私たちのプログラムを振り返ってみると、我々はしている ARGV 1、最初の引数に変換する
プログラム名の後、整数に。
しかし、渡された引数はありません プログラム名の後。
だからここに、我々は、これはバグがあることがわかり プログラム、以来、我々はそれを実行しようとした場合
引数なしで、 それだけでクラッシュします。
>> あなたが表示されますので、他の一般的なパターン のargcが小さい場合、のようなものである
そこにいなかったことを示しているよりも2、 少なくとも、プログラム名とA
最初の引数、その後、我々は何をするつもりだ のようなprintfの、十分ではありません
コマンドライン引数。
それはおそらく印刷するには良いものではないですが、 それはおそらくのようなもの、だ
あなたは、整数を入力する必要があります コマンドラインで。
私はちょうどそこにそれを終了します。
して、1を返す。
だから私たちの最後にそれを覚えている プログラムは、我々は0を返した場合、その種の
成功を示します。
と主も自動的 そうしない場合は0を返します。
>> だからここに、我々は示すために1を再チューニングしている それは成功しないということ。
そして、あなたはあなたが好き返すことができ、 ただ、0は成功を示し、
何かは失敗を示します。
それでは物事のこのバージョンを実行してみましょう。
だから今、私たちは、コマンドラインを入力しない場合 引数、正しく教えてあげましょう
当方、十分なコマンドライン。
文を終了しませんでした。
そうでなければ、我々は実際にそれを1を渡した場合、 それは、プログラムを完了することができます。
だから、これはあなたがARGCを使用する方法です。 の数を検証するため
コマンドライン引数、その 実際に渡されます。
>> それでは、もう少しこのプログラムを作ってみよう 複雑な、第二を見て
物事の繰り返し。
だから今、私たちは、印刷していない 最初のコマンドライン引数。
ここでは、私のequals intから繰り返し処理をしている 0、私は、私のargc未満のプラス
プラス、印刷ARGV、インデックスi。
したがって、このパターンは、再び、これは同じである 代わりを除いて前とパターン、
変数を呼び出す Nは、ARGCを使用している。
>> だから、これはそれぞれのインデックスを反復処理されている アレイ内、及び各印刷
その配列内の要素。
だから、我々はこのプログラムを実行すると、よく、 私は、任意のコマンドラインを入力していない
引数なので、それだけで印刷する プログラム名。
私は物事の束を入力すると、よ 1、独自の行の各を印刷します。
>> [OK]をクリックします。
それでは、この1歩みましょう。
代わりに、各引数を印刷 独自の行に、のは、それぞれを印刷しましょう
各引数の文字 独自の行に。
そうARGVであることを覚えている 文字列の配列。
それでは、文字列ですが、 文字の配列？
だからARGVが本当にあることを意味します 文字の配列の配列。
だからを利用して、 それでは、これを無視してみましょう。
ちょうど文字列のargv 0を考えてみましょう。
>> だから我々はそれぞれのキャラクターを持って帰りたいと思う場合は、 ARGV 0独自の行には、私が欲しい
我々が慣れているパターンを実行するために、私はある 配列の長さ未満
ここのstrlenをしている、それはです 私はしたくないものを、文字列
SはARGV 0に等しい。
だから私は、私たちの長さよりも短い この場合の配列になって、
文字の、Iプラスプラス。
先週見たので、それは理想的です 我々は移動する場合には、外部strlenを
nが追加されるための条件の Sのstrlen関数我々は行くたびに、
ループを通して、それがだ 変えることするつもりはありません。
だから我々は、ここを介してNに等しく設定します。
>> [OK]をクリックします。
だから今、私たちは繰り返しを行なっている 配列内の各インデックス。
だから、我々はそれぞれのを印刷したい場合は、 その配列内の文字、パーセントはC
我々が使用するフラグ 文字の。
私はあることを行っている、今のブラケット 文字列、インデックス文字I、もしそうであれば
文字列はこんにちはだった。
そして0はH、Sブラケットになるだろうね 1は、というように、Eも、となります。
>> だから今我々は、結合したい これら二つのこと。
私たちは、それぞれの文字を印刷したい 各コマンドライン引数の。
だから我々は持っているつもりです forループネストされた。
従来、第一カウンタ iは、次は、J、Nであることを行っている
私は、ARGV私のstrlen関数になります 私プラスプラスは、n未満である。
そして今、代わりに印刷ARGV iのため、 私はインデックスしようとしているARGVブラケット -
つまり、i番目のコマンドラインになるだろう 引数、argvはI、Jをしようとしている
j番目の文字であること i番目の引数。
私は今ここにこれまで取り除くよ 私たちは、そのループに入れているので。
だから、文字列sのequalsと同じです ARGV I、その後、SブラケットJ。
>> さて、私たちは宣言する必要はありません この変数s。
その代わりに、私たちは、これらを組み合わせます 私たちが持っていたもの、ARGV I、Jに2。
>> スピーカ1：[聞こえない]。
>> ROB BODEN：良いコール。
だから、これは壊れています。
私は実際にそれを実行した場合、我々はだろう このことを実現しています。
私が気にしそうカウンター については、この特に
ループは、J、イテレータです。
だから、問題に遭遇しているだろう、 おそらく無限ループ、我々の場合
それを固定していなかった。
我々はまた、話をしている理由です 今日デバッグについて。
>> [OK]をクリックします。
それでは、このプログラムを実行してみましょう。
とのは実際には別々のprintfを追加してみましょう ちょうどここだけ印刷されますことを
私たち、これが意味するので、別のライン、 プログラムを実行し、空白があるだろう
各文字の間に行 各コマンドライン引数。
さて、私たちはそれが何を意味するかわかります。
OOP。
いくつかのバグを得た。
エラーは暗黙のうちに宣言 ライブラリ関数はstrlen。
>> だから私は、戻って我々のプログラムに入る string.hのを含めるハッシュのを忘れていました。
だから、string.hのがあることを行っている 宣言するヘッダファイル
この関数はstrlenを。
[OK]を、それがコンパイルされます。
それでは、それを実行してみましょう。
だから、その。
それは私たちのプリントアウトになるだろう プログラム名、ハローワールド。
それは、それぞれの、それぞれのものを印刷するために起こっている 独自の行の文字。
[OK]をクリックします。
>> それでは、実際にこれをみましょう 1歩。
その代わりstring.hのを使用するのではなく、みましょう 我々は我々自身を実装したいかを考える
strlenの関数です。
だから私はすぐにあげる 関数のシグネチャ。
それではmy_strlenで呼ぶことにしましょう​​、それはだ 引数として文字列を取るつもり、
そして我々は返すことを期待 その文字列の長さ。
だから、どこにその男は、ですか？
はい。
[OK]をクリックします。
だから、以前のスライドから覚えている 先週からもあったこと
文字の配列は、よく、文字列、 それでは、これは私たちの文字列sであるとしましょう​​。
だから、sが文字列である場合には、こんにちは、そして、 H-E-L-L-O、メモリでは、それはなるだろう
このバックスラッシュしてもよく、 0文字。
>> では、どのようにsの長さを得るのですか？
さて、トリックは、このを探しています バックラッシュ0の文字、これはnull
ターミネータ。
だから、このアルゴリズムは、つもりです いくつかのようなものであると
十分な文字こと -
のは、この手のいくつかを表してみましょう カウンタ、のはこのint型の長さと呼ぶことにしましょう​​。
だから、こっちから始めて、我々はしている 私たちの文字列を反復するために行く。
>> だから、それは、Hの最初の文字ですが、 それはそう、バックスラッシュ0ではありません
長さは1である。
次の文字に繰り返し処理し、 E、およびそれがバックスラッシュ0ではありません。
長さは2である。
L、3。
L、4。
O、5。
そして最後に、我々は、バックスラッシュを達成 0となるような手段は、よく、
この文字列は終わった。
それでは、5を戻してみましょう。
>> だから実際には、まず、それを実装する 私のNの長さは、私の右手を0に等しい。
そして、我々は繰り返し処理をするつもりだ -
>> スピーカ1：[聞こえない]
>> ROB BODEN：ああ、撃つ。
良いコール。
ブーム。
だから、nは長さが0に等しい。
だから今、しばらくの長さがない 等しくと、バックスラッシュ0。
したがって、このバックスラッシュ0を覚えて、それがある 実際の文字、それが示している
文字列の最後。
同じように、また、バッ​​クスラッシュ nは、実際の文字です。
バックスラッシュ0かを示すために起こっている 私たちの文字列の最後。
私はそこにそれを置くことを望んでいない。
と長さによってインデックスのではありませんが ヌルターミネータに等しく、その後、
私達はちょうどの長さをインクリメントするつもりだ。
さて、私たちのプログラムの最後に、 長さは、最終的に起こっている
この場合は5であること。
そして、我々は単に長さを返すでしょう。
>> [OK]をクリックします。
だから今ここでダウン、私はしないでください my_strlenん。
それでは確認するためにそれをコンパイルしてみましょう すべてがスムーズに実行されます。
私は2でやっていた？
または1というでしたか？
それは行う必要があります。
わかりました。
だから、これはARGV 2です。
予想通り、動作しますが 1は、私はそれをやったということでした？
はい。
[OK]をクリックします。
物事のこのバージョンは持っていませんでした printfの新しい後の行が、
どちらでもよい。
[OK]をクリックします。
期待ほど働いていました。
>> 今、私たちも、この一歩を組み合わせることができます さらに、ここで、さて、ここで注意してください
まず、ARGVのstrlen関数をつかんだ 私、そして、我々は繰り返しを行なっている
その文字列内の各文字。
だからではなく、それを行うのか、何であれば、私たち ただ待っているのこのロジックを組み合わせる
我々は、バックスラッシュ0右をヒットするまで forループは、この中に？
だから私は、Jが行う、ARGVながら繰り返し処理 等しくないバックスラッシュ0。
それでは、最初にそれを実行してみましょう。
>> わかりました。
だからここに、この条件は言っている -
のはそれをクリアしてみましょう。
だから今、これが私たちのargvとする。
だから、僕は前に、そのプログラムを実行したときに、 argvは文字列の配列です。
だから、私は、ドットスラッシュARGVでそれを実行した場合 2、ハローワールドは、ARGV
自体ARGVのため、長さは3である ゼロ、こんにちは、そして世界。
>> これらの指標の各々の内部にあり、 それ自体、これはなるだろう、アレイ、
ドットは、これはスラッシュになり、私は知らない それは正しい方向だった場合、私は
それがあったとは思わない。
-R-Vのダッシュは、より多くのスペースを必要としています。
それでは、この配列にカットしてみましょう。
-R-Vダッシュ0、次にバックスラッシュ0。
して、混乱にこんにちはとなります。
としましょう​​、H-Eのバックスラッシュ0。
そして最後に、W-Oバックスラッシュ0。
>> だから、我々だけで書いたアルゴリズム、 彼らがしているもののループのためにネストされた
ISやって、我々は最初に持っている カウンタiとし、J。
これは上のコードを使用して容易になるだろう 画面には、のは戻ってこれを行ってみよう。
[OK]をクリックします。
だから私は、の反復子であることに注意してください 各コマンドの繰り返し処理を行う
ライン引数。
、Jは反復子反復である その中の各文字の上に
コマンドライン引数。
したがって、この最も内側のprintfが何をしているか 我々はARGV 0 0、のprintfでprintfきている
ARGV 0 1、のprintf ARGV 0 2、0 3、0 4、0 5、0 6が、今、ARGV 0 7をしようとしている
等しいバックスラッシュ0。
>> それでは、我々はループのためにそれを終了し、 そして今、私は1に反復します。
そして今、我々は、印刷しようとしている ARGV 1 0、ARGV 1 1 -
さて、今、私はハロー短くカットするので、 ARGV 1 2は、再びになるだろう
バックスラッシュ0。
だから、私をインクリメントし続け、 というように、我々はすべてをプリントアウトするまで
世界では、それらの3つのコマンドライン 引数、我々は外に出るよ
最も外側のループ、および 私たちのプログラムを終了します。
[OK]をクリックします。
>> それでは、ここに戻ってみましょう。
だから、をもう少し詳しく知るでしょう この上のコマンドライン引数
特定の問題は、設定してください。
>> 今、デバッギング。
だから、おそらくすでにしなければならなかったしている 以前に一部のデバッグ
問題は、設定してください。
とデバッグの1非常に簡単な方法、 最初に、バグのあるプログラムを見てみましょう。
さて、このプログラムを歩いて、 私達はのためにユーザーに確認するつもりだ
整数は、その整数をつかむし、その後、 任意に、我々は、whileループを持っている
ただデクリメントしようとしている 私には10に等しくなるまで。
ちょうど私が入っていると仮定しましょう 10以上の整数。
それが10に等しくなるまで私はデクリメント。
>> そして、我々は別のwhileループを持っている 私は0に等しいわけではありませんが、我々はしている、という
3、iをデクリメントする予定。
だから、バグの意図を見れば ここで、これは私のデクリメントうことだ
10し、このwhileループの意志であること デクリメントI 10から、7個、4個、1に、
、負5に、負の2の、など 負の無限大に、私がするので
実際に0に等しいことはありません。
次いで、このプログラムの終了時に、 私たちは、あるfooという機能を持っている
私はそのプリントに外出。
>> だから、これは短く、簡単なプログラムであり、 バグは明白です、
特にちょうど私の後に バグが何だったか言った。
しかし、ここでの意図はよく、これはかもしれない、ある 実際にあなたのいくつかのように見える
最後の貪欲からソリューション 問題が設定され、多分あなたはありますか
プログラム内のいくつかの無限ループ、 あなたは全く分からない
何がそれを引き起こしている。
ので、非常に便利なデバッグテクニック ただprintf出力を追加することです
すべてのコードの上。
>> だからここに私は外のprintfが欲しい 最初のwhileループ。
そしてここで私は、printfをしたい、 そして私はちょうど私を印刷します。
私も、私の最初のwhileループをやります。
外では、第二のループしている。
もう一度、内部の印刷 のここで、iの値。
とのこれを実行してみましょう。
>> だから、ドットスラッシュデバッグ。
整数を入力します。
それでは13をやってみましょう。
ブーム。
我々は無限ループしていることがわかります 第whileループの内側。
だから今我々は、バグが何であるかを知っている。
しかし、printfのデバッグは完全に素晴らしいですが、 しかし、あなたのプログラムが得れば
より長く、より複雑な、ある より洗練されたソリューション
物事が働いてばかり。
それでは、これらすべてのprintf出力を削除してみましょう。
とのは確か私はしませんでしたしてみましょう 何を破る。
[OK]をクリックします。
>> だから我々が行っているプログラム ご紹介するために呼び出されます
GNUデバッガのGDB、。
さて、実際に、のためのデバッグを削除してみましょう 第二に、そして再びデバッグを行います。
さて、実際には最初、良い教訓 コマンドライン引数で。
このクラングコマンドことであることに注意してください すべてが渡されているコンパイル
コマンドラインで、これらの コマンドライン引数。
あなたが使用しているとしているので、正確にどのように 我々のようなコマンドライン引数、
以前と、あなたはPSET内のように 2、それはクラングがそれらを使用している方法です。
>> そう気づく、この最初のフラグ、ダッシュ ggdb3、それがあると言っているのか、クラング、
あなたがこのファイルをコンパイルする必要があります 意図我々は最終的になること
それをデバッグする必要があります。
だから、限り、あなたはそのフラグを持っているように、 その後、我々は、GDBのデバッグすることができます。
そして、それはGNUデバッガを開きます。
>> そうなコマンドがたくさんあり​​ます あなたがに慣れる必要があること。
最初の1それは、おそらくよ すぐに実行される必要があります。
だから何をやろうとして実行されます？
それは私たちのプログラムを起動するために起こっている。
だから、起動プログラム、プログラムを実行する 整数、13のための私達に尋ねる。
そしてそれは無限ループのようにだ 私は削除を除き、期待
printfが、そのように私たちも、それが表示されません。
普通に終了しました。
ああ。
それが包まれている可能性がありますすべての 道の周り、背中に - それを無視して。
それが正常に終了しなかったと仮定します。
と複雑な答えはあります。
>> だから今、それは非常に便利ではありません。
だから内部の我々のプログラムを実行している このデバッガは、いずれにも私たちを助けていません
我々だけで行っている可能性があるための方法、 ドットは、GDBの外からのデバッグを大幅に削減する。
だから、1コマンド、その おそらくよ -
そして私はこれを終了します。
コントロール-Dまたは、仕事の両方を終了します。
それでは、もう一度開いてみましょう。
>> あなたはおそらくよ別のコマンド すぐにしたい
に慣れるブレークです。
だから我々は、今のところ主にへし折ってやる そして私はそれを説明します。
さて、ここで私たちは、ブレークポイントを設定して参照してください。 debug.cこの行で。
それでは、休憩の手段があるとき、私 実行]を入力し、プログラムがしようとしている
まで実行を継続 私がブレークポイントにヒット。
私は走りを打ったときので、プログラムが開始され、 そしてそれは、すぐにそれとして壊れる
主な機能になります。
メイン破ることは何かであることを行っている あなたはかなり一般的にやる。
>> そして今、ご紹介し いくつかのより多くのコマンドに。
それは我々が言っていることを、ここに注目してください あるライン11、で壊した
printf関数は、整数を入力します。
ので、次のコマンドでは、どのようになるだろう 私たちは、次のコード行に移動します。
これは、私たちはステップを可能にしようとしている ラインによる当社のプログラムラインを介して。
ので、次の。
>> 今ライン12、我々は行っている 整数を取得します。
次へ。
あなただけの再入力をヒットした場合、それはよ あなたがした最後のものをやり直す。
だから私は入力する必要はありません 毎回次の。
そう、整数、13と入力します。
だから今、14行目、私は大きくなっている間 10よりも、私は次に何でしょう。
そして、我々は我々が私をデクリメントするつもり参照してください。
だから我々は再び私をデクリメントするつもりだ。
>> だから今、別の有用な コマンドはプリントです。
だから、印刷プリントアウトしようとしている 変数の値。
価値を引き出すのを聞かせて 変数iの。
のは、私をプリントしてみましょう。
それは私が11であると言うだろう。
今、私たちは次の再ながら iが10以上である。
だから、私はまだより大きいです 10、それは11だからである。
私マイナスマイナス。
それでは、もう一度私をプリントしてみましょう。
予想されるように、それは10だ。
>> だから今、次の。
それが戻って条件になるだろう、私はある 10を超えたが、私はそう、今10です
それが10を超えないので、我々は期待して それは、whileループの外に落下する。
そして今、我々はそのコード行より下だ。
そして別のコマンドは、リストは、まさに起こっている 前後のが表示されます
数行のコードで 場合あなた自身を失った。
だから我々はちょうど、このwhileループを終了しました そして今、我々は、これを入力しました
Whileループ、18行。
iが0に等しくないようにしつつ。
そして、次に、私はマイナス3に等しく、我々はよ 気づく、これは単なる続けるでしょう。
そして、我々は私を印刷することができます。
>> 各コマンドは、一種のショートカットがあります。
だから、pは、印刷の略です。
だから我々は、pにすることができます。
ちょうどNを保持し続ける、 または[次へ]をやり続ける。
私は再び印刷します。
あなたは、今では167ネガティブだ参照してください。
だから、これは永遠に続くことはありませんが、 本当に永遠に、あなただけの、それを見たので、
実際にいくつかの時点で終了します。
>> だから、GDBを始めています。
しかし、ここでは、GDBにもう一つのことをやらせる。
ええと、デバッグ。
したがって、この特定の場合において、 無限ループは、内部にあることを起こっ
主な機能。
そして今のところ、ちょうど私はそのことを受け入れ に無限ループに移動するつもり
fooの機能。
ただ、この終了時に、以下のことを覚えている このプログラムは、まあ、これはもともと
ちょうどだったのfooを呼び出す 私を印刷しようとして。
しかし、今、我々はあるfooという、呼んでいる それが0になるまで私を増減します。また、
その変数を印刷します。
[OK]をクリックします。
それを保存します。
デバッグを行います。
そして今、GDBのデバッグ。
[OK]をクリックします。
>> だから私はちょうどその時、私はするつもりはない実行している場合 実際に私をステップ実行することができる
プログラム行ずつ。
それでは、メインで破断しましょう [ファイル名を指定して実行を入力します。
だから、これを通過し、printf関数は、次のように入力し 整数、整数、13を得る。
だから我々はデクリメントを維持するつもりだ iが10より大きくなるまで。
その後、我々は通って落下するつもりだ whileループ、ラインを取得 -
の別のウィンドウでそれを開いてみましょう。
私はもはやなるまで私たちはデクリメントん 10より大きくし、私たち
fooは、関数を呼び出した。
>> それでは、すぐに私がヒットとして起こった 関数foo、まあ、私はfooという、および
その後、私はもはや、GDBの制御がありませんでした。
だから、すぐに私はこのラインで次を打つように、 これが起こったまでのことが継続し、
が、いつ、どこでプログラムが終了しました -
それは最終的には存在しなかったと仮定します。
あなたはそれが少しのために一時停止しました。
では、なぜ私は、コントロールを失いました その時点でのプログラム？
私は、次の入力したときだけでなく、それはに行く コー​​ドというの文字通りの次の行
実行されます。
21行目の後にそう、次のコード行 それは、22行目で実行されます
主から出た、である。
だから、僕は行きたくない コー​​ドの次の行に。
私は、関数、fooのに行ってみたい、 そして、その後もステップ実行
コー​​ドのこれらの行。
>> だから、我々は選択肢を持っている。
それでは、もう一度それをやめてみましょう。
主に折り返されます。
ええと、1次、次の、13次、 次に、次に、慎重に、
我々は、ラインのfooを叩く前に。
[OK]をクリックします。
>> だから今、私たちは、21行目にいる 私たちは、fooのを呼ぶところ。
我々はそのため、次の入力したくない 単に関数fooを呼び出しますし、
コー​​ドの次の行に移動します。
我々が使用することのステップです。
だから、ステップ間の違いがあります ステップは、手順に続いて、
次の関数、および行く 機能の上。
それだけで全体を実行 機能といっている。
>> だから、ステップは私たちをもたらすために起こっている 関数に、fooという。
そして、我々は今、我々が戻って、ここを参照してください 理論的には、です。このwhileループ、
いつまで続けるつもり。
そしてそれもないときに、ステップをヒットした場合 呼び出す関数は、それはだ
次に同じ。
だから、あなたがその行にいる場合にのみです ステップ関数を呼び出している
次とは異なるとしている。
だから、ステップはここで私たちをもたらすでしょう。
ステップ、ステップ、ステップ、ステップ、ステップ、ステップ、および 我々だけで無限ループは永遠よ。
>> つまり、あなたのようにそれに慣れるかもしれません 無限ループを識別する方法、さ
ただ、このEnterキーを保持する あなたが動けなくなる場所を確認。
そこにこれを行うには良い方法がありますが、 今のところ、それは完全に十分である。
そして文体、スタイルに適合するように 50、私はこれを行っている必要があります。
[OK]をクリックします。
>> 紹介するので1最後のコマンド。
さて、インチデバッグにgdbてみましょう
だからではなく、私も、メインで壊す fooの機能を知っていることもある
問題は、私は可能性がある 代わりに、fooので破断、言った。
の私はで破断しましょう メインとfooの両方。
だから、できるだけ多くのブレークポイントを設定することができます あなたが望むように。
私は実行]を入力すると、それが起こっている で停止する -
ああ、以来、のは再コンパイルしてみましょう 私は物事を変えた。
あなたはこの行、警告、ソースが表示されます ファイルが実行可能よりも新しい。
だから、私はちょうどここに行ったことを意味します とスタイルに適合するように、これらの変更
50、私は再コンパイルしませんでした プログラム。
だから、GDBはそれの私を認識します。
私は、再びデバッグを行い、終了します GDBのデバッグをヒット。
[OK]をクリックします。
>> だから今、戻って、私が何をしていたかと。
メインブレイク、fooのを破る。
私はプログラムを実行し、もしそうであれば、今ではだ 当たるまで続けるつもり
ブレークポイント。
そのブレークポイントはどうなります メインのようなものです。
今、代わりに次のことの、次の、次の、 次に、次に、私がfooを打つまでは、私は
継続している、継続入力することができます あなたが次のブレークポイントにヒットするまで。
私が最初の整数を入力する必要があります。
私がヒットするまで継続していきます ということで次のブレークポイント、
fooの機能を備えている。
>> あなたがヒットするまでそのファイル名を指定して実行が実行されます ブレークポイントがありますが、ときにだけ実行を入力
あなたは、その後、プログラムを起動し、している それ以降は、継続です。
私は主壊した場合と 走った後、それがで破るよ
続けて、メイン、および。
私は、fooのにブレークポイントを持っていないので、 整数を入力して、今、私は今
fooので破るつもりはない。
それだけで無限になるだろう それまでループ。
[OK]をクリックします。
>> だから、GDBにイントロです。
あなたはそれを使用して起動する必要があります 問題のセットで。
それは非常に役立ちます バグを特定する。
あなたが実際には、ライン·バイ·ライン、行けば あなたのコードを、そして何であるかを比較
実際に何を期待して起こっている 起こること、それはきれいだ
あなたのバグを欠場することは困難。
[OK]をクリックします。
>> だから、先週ダビデはこれを育て 秘密鍵暗号方式のもの
我々はしたくない、初めて、 パスワードはちょうど私たちの上に格納される
いくつかのプレーンテキストフ​​ァイル内のコンピュータ、どこ 誰かが何度だけ来ることができる
それを開いて、それらを読んで。
理想的には、それらが暗号化される 何らかの方法で。
と問題セット2では、対処されます 暗号化の一方法では、
または、よく、二つの方法が、 彼らはとても素晴らしいではありません。
あなたはハッカー版を行う場合は、ね また、扱うされる予定
いくつかのことを解読する。
>> だから問題は、現在では、としても、 我々は最強の暗号化を持っている
世界のアルゴリズムには、選択した場合 特に貧しいパスワードは、それ
人々以来、非常に多くのお手伝いをされません まだそれを把握することができます。
暗号化された文字列を見ている場合でも それはゴミの混乱のように見えます
彼らは場合には、彼らに何の意味もない まだほんの数のパスワードを試してみる必要があります
その後、それを把握する 非常に安全ではありません。
だからビデオを見て その点になります。
>> [ビデオ再生]
>> ·ヘルメット、あなたは悪魔。
何が起こっているの？
あなたが私の娘に何をしているの？
>> 輝かしいを導入するために私に許可証 若い形成外科医、博士フィリップ
Schlotkin、最大の鼻 全体のジョブの男
宇宙、そしてビバリーヒルズ。
>> - 殿下。
>> 鼻の仕事？
分かりません。
彼女はすでに鼻のジョブを持ったという。
それは甘い16存在していた。
>> - いいえ。
それはあなたが考えるものではありません。
それははるかに、はるかに悪いです。
あなたはに私の組み合わせが得られない場合 エアシールド、博士Schlotkin意志
彼女の古い鼻をあなたの娘を返す。
>> - いいえ。
どこでそれを手に入れたの？
>> - すべての権利。
私が教えてあげましょう。
いいえ、パパ。
いいえ、あなたはいけません。
>> -あなた右、私の愛する。
私はあなたの新しい鼻を逃してしまう。
しかし、私は彼に組み合わせを教えてくれません、 何で。
>> - 非常によく。
博士Schlotkinは、あなたの最悪を行う。
>> - 私の喜び。
>> [ツールは尖って受け]
>> - いいえ。
待つ。
私が教えてあげましょう。
>> - 私はそれを動作を知っていた。
わかりました。
私にそれを渡して
>> - 組み合わせは1です。
>> ワン。
>> - 二つ。
>> - 三。
>> - 四。
>> ファイブ。
>> - だから、組み合わせが1である、 二つ、三つ、四つ、五つ。
それは愚かな組み合わせだ 私が今までの人生で聞いた。
つまり、馬鹿なことのようなものだ 彼の荷物にならない。
>> あなた、あなたの殿下を、ありがとうございました。
>> - 何をあなたはしましたか？
>> - 私は、壁をオフに。
>> - いいえ、あなたはしませんでした。
あなたは、映画全体がオフになっています。
>> - 私が間違ったボタンを押しておく必要があります。
>> - さて、背面にそれを置く。
背面にムービーを置く。
>> - はい、先生。
はい、先生。
>> それでは、アーノルドに行く - してみましょう。
、グレッチェン来る。
もちろん、私はまだでしょうね このためにあなたを請求する必要があります。
>> [ENDビデオ再生]
>> ROB BODEN：すべての権利。
だから今我々はすでに話をしていることを いくつかの点で、セキュリティ、素敵な
少し映画のポスターなので、最近の中で NSAとの日、これらの問題
すべてを監視する。
それはあなたのように感じるように困難な場合があります のプライバシーのいくつかの並べ替えを持っている
オンラインの世界では、私は言うことができませんでしたが、 あなたプリズムの詳細の大部分。
そうPRISM超えて移動、私たちはつもりはない 今、そのことについて話してする
あなたのラップトップを考える。
だからここまで、私は切り替えたい 私の実際のアカウントに、
マイ·リトル·ペンギンと。
だから私は、パスワードを設定しているし、その パスワードは、私はそれになりたい何でもある。
>> しかし、覚えているものを私がログインしています そのため、このログインによる
プロンプトで、いくつかのプログラムがある。
それがあったいくつかのプログラムです 一部の人によって書かれた。
だから、その人、その場合 特に悪質な、彼らは可能性
言った、大丈夫、もしそうであれば、パスワード 私が入ることに等しく、私の
実際のパスワード、または、同等の いくつかの特別なパスワードに -
デビッドは素晴らしいか何かである -
それらをインチせ
だから、悪意のあるプログラマは可能性があります あなたのMacのすべてにアクセスするか、
Windows、または何でも。
>> だから、以来、懸念の多くではありません 私が意味する、これがログインプログラムである
それは、OS Xの、何百に同梱されているの または何千人もの人々が持っている
このコードをレビューした。
だから、あなたは、どこかにあなたのコードでは、IF この文字列は、equalsに等しい場合を言う
ダビデは、素晴らしい、ログイン後、誰かのです になるだろう、のように、待ってください。
これは適切ではない。
これはここにあってはならない。
だから、我々は物事を一つの方法だ この種のセキュリティを確保して。
>> それでもプログラムを考える あなたが書くこと。
例えば、あなたがログインプログラムを書いたとしましょう​​。
あなたが書いたので、このログイン·プログラム、 そう、明らかに、あなたは良いです
プログラマ。
あなたが悪意のあるを置くつもりはない xが等しい等しい場合デイビッドは素晴らしいです
あなたのコードに変換する。
しかし、このプログラムは、何をします このプログラムをコンパイルするために使うのか？
クラングのようなもの。
だから何が起こった人であれば クラングにケースに入れクラングスペシャルを書く
のようなもの、私がコンパイルしていた場合 ログインプログラムは、このコードを入力
と、言うのログインプログラムに Xは、ダビデは素晴らしいです等しい等しい？
そうではない、非常にまだ、しかし、我々は同じを持っている ここでの問題、どこクラング、よく、
何千人も、そうでない場合、数十万の 人々は、持っている、クラングを見てきました
コー​​ドのその行を見て言った、 すべての権利、ここに悪いものは何もありません。
明らかに、誰もやっていない この悪質なもの。
>> しかし、何と同じように、それ自体打ち鳴らすされ、 私はクラングをコンパイルする場合はどうなりますか？
私はいくつかのコンパイラを持っている場合、その クラングに挿入クラングをコンパイル
言うこの特別なハック、すべての権利、 私は、クラングをコンパイルすると、その後、
私が手に実行可能ファイルが特別になるはずです ログインプログラムとカバーの内側
このパスワードは、対等に等しい Daveは素晴らしいです！
だからあなたのコンパイラ自身ことを覚えておいてください ある時点でコンパイルする必要があります。
ですから、クラングをコンパイルすることを選択した場合はどう 、自身とその後、悪意がある
全体をねじ込むことができた ラインの下の方法。
>> だからここでは、ケン·トンプソンを持っている とデニスリッチー。
だから、これは象徴的な写真です。
デニス·リッチーは右側にあります。
彼は大手である -
あなたができるので、かなりCを書いた このクラスのために彼に感謝します。
ケン·トムソンは左側にあります。
二人は、基本的にUNIXを書いた。
まあ、それは主要な貢献者だった UNIXでは。
いくつか他の人がいました。
ある時点でそうケン·トンプソン、、 彼はチューリング賞を受賞。
そしてチューリング賞は、私はいつも聞いた それはこのように参照される、それがだ
コンピュータ科学のノーベル賞。
>> だから、チューリング賞で、彼はしなければならない 彼の受諾演説を与える。
そして、彼は、この非常に有名なスピーチを与える 今、信頼するの考察と呼ばれる
私たちがリンクされている信頼、 コー​​スのウェブサイトへ。
この演説の中で、彼は、すべての権利を言う、 私は、UNIXを書いた、そして今、すべての
あなたの人々は、UNIXを使用しています。
今、Linuxがあることを今日思い出し UNIXの直系の子孫。
OS Xには、直接のUNIXを使用しています。
Windowsはあまりしませんが、多くの アイデアをUNIXから採取した。
>> そこで彼は、舞台に上がると言う 大丈夫、私はUNIXを書いた。
そして、ちょうどそのように皆さんが知っている、私は今 あらゆるにログインでき
お使いのコンピュータの単一1。
X場合、私はこれらの特別の1を置くので 等しいケントムソンは素晴らしいです等しく、
その後、私はログインできています。
だから人々は、よく、のようなもの どうやってそれを行う？
私たちは、ログインプログラムを見て そして何もありません。
彼はよく、私はコンパイラを変更し、のようなものだ ログインプログラムにログインする
ログインプログラムは、今持っているしめる そのXはケン·トンプソンに等しい等しく
素晴らしいです。
>> そして、彼らはよく、それは本当ではないです、と言う。
私たちは、コンパイラを見て、としている コンパイラは、任意の行を持っていない
そのようなコード。
彼はOKのようですが、あなたはどのようなものである コンパイラを使用してコンパイル？
そして、彼らが思うに、彼は、よく、同じように、だ 私はあなたに、コンパイラを与えた一人です
あなたはとても、コンパイラをコンパイルするのに使用している あなたは、コンパイラをコンパイルしていること
自体は悪意がある、とウィル ログインプログラムを破る。
そこで、基本的に、その時点で、そこ あなたがソースを見ることができる方法ない
ログインプログラムのコード 間違っているかを確認する。
あなたも、に見ることができませんでした コンパイラのソースコード
間違っているかを確認する。
>> あなたは、マシンを見てする必要があります コー​​ドの実際のバイナリ
、様子見、これらにコンパイルされたコンパイラ コー​​ドの行はここにいるべきではありません。
しかし、ケン·トンプソンはそれに1歩を踏み出した さらに、よく、そこにある、と述べ
実際にこれらの特別プログラム あなたは、プログラムのバイナリを読み込むに役立つ、
ので、誰かにそのプログラムを使用した場合 バイナリを読んで、彼らはこれらを見ることが
コー​​ドの行数。
彼はすべて、と言ってそれらのプログラムを修正 右、あなたが見ている場合は、
コンパイラは、この特定を表示しない バイナリのセット。
>> そう、あなたはそのステップを取る必要がある さらに、基本的に、それは可能性があります
の間接撮影し、複数のレベル、 そしてある時点で、誰も実際ません
チェックされる予定。
だから、この話の教訓は、あなたがしている、ある 書くことにするつもりはありません
このクラスで打ち鳴らす。
あなたは登山を使用することになるだろう このクラスでは多くのことを打ち鳴らす。
あなたが知っているすべてのために、クラングは、悪意ある あらゆる妨害されているプログラム
つのプログラムは、これまでにまとめました。
そして、それは非常に不吉であなたを残す 水曜日にお会いし、注意してください。
>> [拍手]
>> スピーカー2：次のCS50で。
>> スピーカ3：あなたが言うあえてしないでください。
あなたがこれを行うことができます。
あなたはこれを行うことができ、前にこれをやった 今日、明日、これを行うことができます。
あなたは何年もこれをやってきました。
ちょうどそこに行くと、これを行う。
あなたがこれを行うことができます。
>> [音楽再生]