Xcode七転八倒

Xcode七転八倒

エラーの数だけ強くなる?
実験しながら身体で覚えるiPad/iPhoneプログラム演習
コピペプログラマからの脱却をめざします。

Amebaでブログを始めよう!
Xcode七転八倒 第一章 NSLogは強い味方 


■数値をアウトプット いろいろの巻

 今回は整数以外の数値を扱ってみましょう。いわゆる小数点のついた数値です。
 どんな数値の形式があるのでしょうか?ここでは16進数関係はパスしますね。
 浮動小数点型Floating point、倍精度浮動小数点型Double-precision floating point、を見ていきます。
 浮動小数点型は、単精度で有効桁数が約7桁、倍精度浮動小数点型は約16桁です。
 単精度、倍精度というのは、メモリを倍使ってその分数字の精度をあげているという意味です。
 現在のCPUは64ビットですが、昔は8ビットとか16ビットだったので、メモリを効率的に使うには、
 扱う数値の大きさによって単精度、倍精度を使い分けることはとても大事なことだったのです。
 整数にも大きな整数を扱う long型というのがありますが、今のXcodeでこのlong型を使うと
 「 int を使え」と注意されてしまいます。

 さて整数は、int で変数を宣言しました。浮動小数点は、float 、倍精度浮動小数点は、Doubleです。
 整数の表示は、NSLog( @"%d" , .seisu );でした。
 ここでは、%e 、%f 、%g を見ていきます。defgとアルファベット順なので覚えやすいです。
 
 とにかくやってみましょう。赤字の変数名は自由につけてください。
 整数、浮動小数点、倍精度浮動小数点、3つの変数を宣言して、適当な数値を代入します。
 ここでは、その精度を確認するために長めにいれてみました。
 とりあえず全ての数値で、%d 、%e 、%f 、%g をアウトプットしてみますね。どうなるでしょうか?
 またアウトプットされる数字を区別するためにNSLogには、わかりやすく表示するようにしています。
 %% の意味は、前回を参照してください。

int seisu = 56;
float fudou = 1.234567890123456;
double baiseido = 0.012345678901234567890123;

NSLog( @"%%d 整数 = %d" , seisu );
NSLog( @"%%d 浮動小数点 = %d" , fudou );
NSLog( @"%%d 倍精度 = %d", baiseido );
NSLog( @" " ); //空白行入れて見やすくするためです。
NSLog( @"%%e 整数 = %e", seisu );
NSLog( @"%%e 浮動小数点 = %e", fudou );
NSLog( @"%%e 倍精度 = %e", baiseido );
NSLog( @" " );
NSLog( @"%%f 整数 = %f" , seisu );
NSLog( @"%%f 浮動小数点 = %f" , fudou );
NSLog( @"%%f 倍精度 = %f" , baiseido );
NSLog( @" " );
NSLog( @"%%g 整数 = %g" , seisu );
NSLog( @"%%g 浮動小数点 = %g" , fudou );
NSLog( @"%%g 倍精度 = %g" , baiseido );

 入力するといくつか黄色いマークで注意が出ていますね。
 これは、型があってませんよとの注意です。気にせずビルドしちゃいましょう。
 どうですか?型があっていないところは、変な数値がでていると思います。
 アウトプットする時は、数値の型を合わせないとダメなことがわかります。
 まとめます。

  %d  整数だけ
  %e  浮動小数点型、倍精度浮動小数点型を 1.234568e-02のような指数を表示する形でアウトプット
  %f  浮動小数点型、倍精度浮動小数点型を 1.234568のような通常の形でアウトプット
  %g  %e と%fの表示の短い方でアウトプット

 またアウトプットをよく見ると7桁表示で最後が四捨五入されていることもわかります。
 倍精度型をもっと桁数をたくさん表示させたり、逆に桁数を少なくすることはできないのでしょうか?
 そこで次のNSLogを実行してみましょう。変数はそのままです。

NSLog( @"%%05d 整数 = %05d" , seisu );

NSLog( @"%%.12e 浮動小数点 = %.12e", fudou );
NSLog( @"%%.12e 倍精度 = %.12e", baiseido );
NSLog( @" " );
NSLog( @"%%.3f 浮動小数点 = %.3f" , fudou );
NSLog( @"%%.3f 倍精度 = %.3f" , baiseido );

 どうなりましたか?桁数が揃えられたと思います。
 よく見て欲しいのが %.12e 浮動小数点=1.234567880630e+00 となっています。
 単精度なので全ての桁を記憶できなかったので、それ以上の桁の数値は正しくありません。
 まとめです。

  %05d    整数の桁揃え、前に0をつけて揃える。05d の場合5桁に揃える。
  %.12e %.3f 小数点以下の桁数を.12e の場合12桁に、.3f の場合3桁に揃える。
         ただし浮動小数点型変数(floatで宣言)の場合7桁以上を指定すると正常に動かない。
  %gの場合、桁数揃えは使えない。

 時間があったら、下記のようなことも試してみましょう。
  %.12g で %gの桁数揃えをしたらどうなるか?
  %15d  としたら、整数の桁数揃えが0の代わりに1で埋まるか?
  %.05.3e  のように小数点だけでなく整数部の桁数も揃えられないか?
(全部できませんが、どういう結果になるかを実際に試してみてください。)

 最後に、今回のアウトプットをスクリーンショットしておきます。

$Xcode七転八倒
Xcode七転八倒 第一章 NSLogは強い味方 


■数値をアウトプット 整数の巻

 NSLog(@"Hello World”);の一行で画面のデバッグ領域に文字をアウトプットできることがわかりました。
 今回は、計算した結果の数値をアウトプットしてみましょう。
 前回使ったNSLog(@"Hello World”);の上、[Super viewDidLoad]の下にプログラムを入力します。

int seisuA = 12;
int seisuB = 24;

 intは、整数型の変数の宣言。seisuAとseisuBは変数です。自由に決めてください。
 このブログでは、自由に決められる変数や名前を赤字にしています。
 
 あれっ?何か変ではないですか?
 それぞれの行の左端に黄色い注意マークが出ています。何も悪いことしていませんよね。
 そのマークをクリックすると下記のようなメッセージが表示されます。
 「Unused variable」だそうです。そう「使ってない変数ですよ。」と教えてくれているのです。
 これから使うんだから余計なお世話と思わずに、ご指摘に感謝しておきましょう。

$Xcode七転八倒

 さて、次に足し算する式を入力します。
 整数型のtashizanという変数を新たに宣言してつくって、seisuAとseisuBを足した値を代入します。

int tashizan=seisuA+seisuB;

 どうです。先ほどのseisuAとseisuBについていた注意は消えて、今度はtashizanにつきましたね。
 さて、このtashizanをアウトプットしたいのですが、どうしたらいいのでしょう。
 とりあえず、次のように書いてみましょう。一番簡単そうですよね。

NSLog(tashizan);

 怒られちゃいましたね。このままビルドしてもBuild Failedになります。
 やってみたい方は、ぜひ試してください。

$Xcode七転八倒


 黄色の注意と赤の警告が重なっている感じです。メッセージの右端に3と表示されたボタンがあります。
 それをクリックしてみましょう。どうです。3つのエラーメッセージが表示されていますね。
 どうもこのやり方はまずいようです。
 正解は、下記です。

NSLog( @"%d" , tashizan ) ;

 NSLogは、実は @"テキスト" のような文字列(NSString)しかアウトプットできないのです。
 ここでは、@"%d"の %d が 整数 tashizan を文字列に変えているのです。
 どうですか?エラーが消えていたらビルドしてみましょう。

 今度は、うまくいったと思います。デバッグ領域に36が表示されましたね。
 でも、これでは、この数字が何を意味するのかがわからないですね。
 プログラムが大きくり多くの変数のアウトプットが必要になった時には困りますよね。
 そこで、例えばこう書いてみます。

NSLog( @"足し算= %d" , tashizan) ;

 これで、どのように出力されるかビルドしてみてください。
 足し算=36 と出力されました。
 このように、どこで何の変数をアウトプットしたのかを明確にしながらNSLogをプログラムに仕込むことで、
 デバッグを効率よく進めることができるのです。
 今回のプログラムです。

int seisuA = 12;
int seisuB = 34;
int tashizan = seisuA + seisuB;
NSLog(@"足し算= %d",tashizan);

 ところで NSLogで「%d」とアウトプットさせたい時はどうすればいいのでしょう?
 例えば「100%dame」とアウトプットさせたい時です。
 とりあえず、実験です。

NSLog( @"100%dame" ) ;

 と先ほど書いたプログラムの下に入力して、ビルドしてみましょう。
 何か注意がでているけれどBuild Succeededになりましたね。
 どのようにアウトプットされているでしょうか?
 10036ameのようになっていませんか?
 %d に整数を入れようとしたけど、その指定がないので前に使った数字を入れているみたいです。

 では、%とdの間にスペースを入れたら・・・・?

NSLog( @"100% dame" ) ;

 同じ結果ですね。下記のように正確に書くとエラーは消えますが、目的は達していません。

NSLog( @"100%dame" , tashizan ) ;

 正解は、%%d です。

NSLog( @"100%%dame" ) ;

 これでビルドすると、100%dameとアウトプットされます。


 NSLogの賢い使い方とアウトプットの方法は、プログラムをしていく上で非常に重要です。
 エラーを出しながら、体得していってください。

 次は、いろいろな数値をアウトプットします。







Xcode七転八倒 第一章 NSLogは強い味方 


■とにかく書いてみる

 前回何も書いていないプログラムをRunさせて当然のごとく成功しました。
 今回は、とにかく何かプログラムを書いてみましょう。

 いまEditorに「ViewController.m」のプログラムが表示されているはずです。(準備編参照)そんなに長いプログラムではありませんね。
 その中で今回使うのは下記の部分です。

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

 この- (void)viewDidLoadは、このプログラムのviewが読み込まれた=DidLoadした時に、
 この括弧{ }の中の命令を実行するという場所です。
 要は、「プログラムがはじまる時には、ここを実行する」から、ここに書いてくださいということです。
 このプログラムの最初のスタート地点です。
 少し下に- (void)viewDidUnloadがありますので、間違えないようにしてください。

1.何か英語を書いてみる。

 このプログラムの [super viewDidLoad];の次の行に何か英語を書いてみてください。
 例えばHello worldとでも書きましょう。

$Xcode七転八倒


 Xcodeに怒られちゃいましたね。規則を無視するとこのように教えてくれます。
 では、Hello worldの頭に半角スラッシュを二つつけましょう。
 //Hello world
 どうですか、下の注釈文と同じように緑色になって、エラーメッセージが消えましたね。
 //の後ろに書いてあるのは、注釈として無視してくれるのです。
 //が有効なのは、その行だけなのに注意してください。改行すると効かなくなります。


2.何か日本語を書いてみる。
 
 次に何か日本語を書いてみましょう。
 はじめましてと書いてみました。

$Xcode七転八倒


 こんどは、もっと大きなマークで怒られてしまいました。メッセージも違いますね。
 プログラムの命令は、半角英数字しか受け付けないのです。
 これも頭に//をつけて注釈にしました。
 あれっ?でもまだマークが消えていません。

$Xcode七転八倒


 よく見ると頭の方に小さな三角があります。これがエラーを起こしている原因を教えてくれています。
 実はここには、全角スペースが入っているのです。
 これは結構わかりずらいので、注意してください。
 このエラーメッセージ「Expected expression」が出たら何か日本語が混ざっていると疑ってください。
 このブログからコピペをすると、全角スペースとか入ってしまうと思います。
 しばらくは短く簡単なコードばかりなので、ぜひご自身でキーボードを叩いて入力してみてください。


3.エラーを知ろう。

 本題のNSLogに入る前にわざといろいろエラーを出してみましょう。

NSLog( @"Hello World" ) ;
 これが今回書く、正しいプログラム・コードです。

 いろいろわざとミスをしてみます。

NSLog( @"Hello World" ) // ; 最後のセミコロン抜け
NSLog( @"Hello World" ; // ) 括弧抜け
NSLog( @"Hello World ) ; // " ダブルコーテション抜け
NSLog( "Hello World" ) ; // @ 抜け
NSlog( @"Hello World" ) ; //log Lが小文字

$Xcode七転八倒


 表示で右が切れていますが、拡大して見てくださいね。
 上の抜け落ちに関しては、各々それなりに「括弧が足りない」だの、指摘してくれています。
 @抜けに関しては、指摘してくれていません。
 Lが小文字の場合も黄色の注意です。
 しかし、両方とも確実にビルドで失敗します。注意が必要です。
 (黄色の注意メッセージによっては、ビルドが成功する時もありますが、
  メッセージがでる原因は調べましょうね。)

 Xcodeは、間違いに対していろいろな警告を出してくれます。
 絶対に正しいはずなのにと思い込まずに原因を探しましょう。
 いつも間違っているのは、自分のはずです。


4.NSLog(@"Hello World");を実行してみる。

 それでは、やっと実行してみましょう。
 [super viewDidLoad];の下に次のように書いてみましょう。

NSLog( @"Hello World" ) ;

 なぜ@”Hello World”と書くのかは、Objective-Cのテキストを扱う時の決まりだからです。
 あまり深いことは考えないでおきましょう。

$Xcode七転八倒 ビルドは成功したと思います。
 しかしiPad Symulatorの画面は真っ白のままです。
 NSLog( @"Hello World" ) ;はどこに表示されているのでしょうか?

 それは、右下の赤く囲ったところです。Debug Areaです。
 NSLogで指定したアウトプットは、全てここにプログラムが
 実行される順番に表示されます。
 プログラムのところどころにNSLogによって、その状態を
 知らせるメッセージを仕込むことで、デバッグができるのです。

$Xcode七転八倒 NSLog( @"はじめまして" ) ;
 のように日本語もOKです。
 試してみてください。

 今回は、たった一行追加した
 プログラムで文字を出力して
 みました。

 次回はNSLogでいろいろと
 アウトプットさせてみます。