Objective-Cでのエラー

このQ&Aのポイント
  • Xcode5で始めるObjective-Cプログラミング(大津真著)を購入し、Objective-Cの勉強を開始しました。しかし、本に記載されたコードを入力するとエラーが発生し困っています。
  • エラーメッセージは「more '%' conversions than data arguments」で、2つの箇所で表示されます。解決策をご教示いただけますか。
  • また、実行すると「Thread 1:EXC_BAD_ACCESS(code=EXC_1386_GPFLT)」というエラーも発生します。このエラーについてもお力をお貸しください。
回答を見る
  • ベストアンサー

Objective-Cでのエラー

よろしくお願いします。「Xcode5ではじめるObjective-Cプログラミング(大津真著)」という本を購入し、Objective-Cの勉強をはじめました。Objective-Cが初めてのプログラミング初心者です。 本に記載されたコードを入力しているのですが、下記でエラーが出て困っています。 何度も見なおしたのですが本との違いを見つけることができませんでした。 どこがおかしいのかお分かりの方がおられましたらどうか教えて下さい。 ●エラー more '%' conversions than data arguments が、下記の2箇所で出ます。(いずれも生年月日の前の@ に矢印がでています。) >NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), >NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), 実行すると Thread 1:EXC_BAD_ACCESS(code=EXC_1386_GPFLT) とでます。 ---------- // main.m #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *personA = [[Person alloc]init]; [personA setName:@"吉田一郎"]; NSDate *dateA = [NSDate dateWithString:@"1979-11-12 00:00:00 +0900"]; [personA setBirthday:dateA]; [personA setHeight:180.5]; NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personA name], [personA birthday], [personA height]; Person *personB = [[Person alloc]init]; [personB setName:@"山田太郎"]; NSDate *dateB = [NSDate dateWithString:@"1981-03-01 00:00:00 +0900"]; [personB setBirthday:dateB]; [personB setHeight:172.3]; NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personB name], [personB birthday], [personB height]; } return 0; } ---------- // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject -(void)setName:(NSString *)name; -(NSString *)name; -(void)setBirthday:(NSDate *)birthday; -(NSDate *)birthday; -(double)height; -(void)setHeight:(double)newValue; @end ---------- // Person.m #import "Person.h" @implementation Person { NSString *_name; NSDate *_birthday; double _height; } -(void)setName:(NSString *)aName { _name = aName; } -(NSString *)name { return _name; } -(void)setBirthday:(NSDate *)aBirthday { _birthday = aBirthday; } -(NSDate *)birthday { return _birthday; } -(void)setHeight:(double)aHeight { _height = aHeight; } -(double)height { return _height; } @end

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> 何度も見なおしたのですが本との違いを見つけることができませんでした。 その参考本の内容は見たことないですが、先月発売されたばかりのようで、 もし本にミスプリントがあるなら見よう見まねの初心者には難しいと思うので、 具体的な正誤を書いておきます。 (誤) NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personA name], [personA birthday], [personA height]; (正) NSLog(@"%@ 生年月日:%@, 身長:%.1fcm", [personA name], [personA birthday], [personA height]); (誤) NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personB name], [personB birthday], [personB height]; (正) NSLog(@"%@ 生年月日:%@, 身長:%.1fcm", [personB name], [personB birthday], [personB height]); こうでなければならない理由は、No.2さんの回答や おそらくその本の中でも解説されているNSLog()の 説明を参照してください。 できれば、今後同じ所でつまずいて、同じようにここに助けを求める人の ために、本当に本の記述が誤っていたのか、それともあなたが自分の タイプミスを見つけることができなかっただけなのかを補足かお礼に 入れてください。 なお、こういう誤りはNSLogの意味とその使い方を理解していれば、 たとえ本の記述が誤っていてもすぐにわかるレベルのものです。 コーディング自体が初めての人は、まずは写経のように人が書いた コーディングを書き写して体験するところから始めるしかないと 思いますが、できるだけその意味を理解しながら写経することを お勧めします。意味がわかっていれば、くだらないタイプミスも 一目でわかるようになります。

unitty
質問者

お礼

私のタイプミスで、まさにご提示いただいた通りの記述が本にもありました。かなり見なおしたつもりだったのですが見つけられず、おっしゃる通り意味を理解しながらという部分が不足しているのだと思います。今後は書き写す前にもっとよく見て理解する時間を多くとるようにしたいと思います。 わかりやすい正誤比較、本当に助かりました。ありがとうございました。

その他の回答 (2)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

C言語のprintf()関数の書式は、おわかりですか?ご存じなければ、そこまで戻って、勉強しなおしてください。 NSLog()の書式は、printf()の書式と(ほぼ)同じ。 %は、変換指定しといって、%のある場所を、引数の値と置換します。 printf("number = %d, string = %s\n", 256, "Hello"); 第一引数の文字列の中、「%d」を、第2引数の「256」と置換し、「%s」を、第3引数の「Hello」と置換します。 結果出力:"number = 256, string = Hello" NSLog()も同様です。 変換指定子は、変数の型とセットになっていて…… %d =int型整数 %s =文字列 という対応になっています。ほかにいくつか例を挙げておくと…… %f =float型浮動小数点数 %x =16進表記整数 %@は、Objective-Cのみの変換指定子で、NSString型文字列と対応します。 NSLog(@"string = %@", @"Hello"); 結果出力:string = Hello エラーメッセージの意味は、変換指定子と、引数の数が一致しないというもの。第2引数以降がなければ、一致しないのはとうぜん。

unitty
質問者

お礼

C言語を元にして基本的なことから教えていただき、ありがとうございます。基本的なことをよく理解しながら学んでいきたいと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

閉じ括弧の位置が変.

unitty
質問者

お礼

他の方の回答で理解した後に読むと、ご指摘いただいた通りでした。ありがとうございました。

関連するQ&A

  • 【Objective-C】プロパテイについて

    Objectiv-Cの勉強を始めたばかりの者です。 プロパテイの機能を理解する為に以下のようなプログラムを書きました。 例1)まずは、プロパテイを使わない例です。 ーーーーーーー data.h ーーーーーーー #import <Foundation/NSObject.h> #import <Foundation/NSString.h> @interface Data : NSObject { NSString* str; } - (void)setStr:(NSString* )arg; - (NSString*)retStr; @end ーーーーーーー data.m ーーーーーーー #import "Data.h" @implementation Data - (NSString*) retStr{ return str; } - (void)setStr:(NSString*) arg{ [arg retain]; [str release]; str = arg; } @end ーーーーーーー main.m ーーーーーーー #import <stdio.h> #import "Data.h" int main(void) { Data* data = [[Data alloc] init]; [data setStr:@"aaa"]; NSLog(@"%@",[data retStr]); return 0; } 例2)次に、プロパテイを使って例1を書き換えてみました。 ーーーーーーー data.h ーーーーーーー #import <Foundation/NSObject.h> #import <Foundation/NSString.h> @interface Data : NSObject { NSString* str; } @property (retain) NSString* str; @end ーーーーーーー data.m ーーーーーーー #import "Data.h" @implementation Data @synthesize str; @end ーーーーーーー main.m ーーーーーーー #import <stdio.h> #import "Data.h" int main(void) { Data* test = [[Data alloc] init]; test.str = @"hoge"; NSLog(@"%@",test.str); return 0; } 例2を実行した結果、以下のように出力されました。 2010-02-05 22:17:50.696 data[1583:903] *** __NSAutoreleaseNoPool(): Object 0x100001068 of class NSCFString autoreleased with no pool in place - just leaking 2010-02-05 22:17:50.698 data[1583:903] hoge @propertyのオプションを(retain) ではなく、(assign)に変更すると、 2010-02-05 22:30:02.271 data[1619:903] hoge と出力されて、期待した結果が得られるのですが、なぜretainではダメなのでしょう? また、assignでも例1のようなメモリ管理は自動的に行われているのでしょうか? 以上、ご指導の程、よろしくお願いいたします。

  • オーバーライド

    こんにちは。 javaの勉強をしているのですが コンパイルエラーが発生しました。 オーバーライドのプログラムに関する質問です。 まずはプログラムなんですが class Human{ protected String name; protected int height; protected double weight; public Human(){ name = ""; height = 0; weight = 0.0; } public void setName(String n){ name = n; } public void setHeight(int h){ height = h; } public void setWeight(double w){ weight = w; } public void show(){ System.out.println(name + "の身長は" + height + "cm。体重は" + weight + "kgです。"); } } class Teacher extends Human{ private String cource; public void setCource(String c){ cource = c; } public void show(){ System.out.println("担当科目は" + course + "です。"); } } class Ex73{ public static void main(String args[]){ Student human1 = new Student(); human1.setName("一郎"); human1.setHeight(164); human1.setWeight(62.5); human1.setCourse("java"); human1.show(); } } /* Ex73.java:35: シンボルを解決できません。 シンボル: 変数 course 場所 : Teacher の クラス System.out.println("担当科目は" + course + "です。"); ^ Ex73.java:47: シンボルを解決できません。 シンボル: メソッド setCourse (java.lang.String) 場所 : Student の クラス human1.setCourse("java"); */ このプログラムは TeacherクラスでHumanクラスのshow()メソッドをオーバーライドすると言うものです。 どなたかよろしくお願いします。

    • ベストアンサー
    • Java
  • objectiv-cで困っています。教えてください

    objectiv-cの勉強を始めたばかりです。ネットで調べながら進めているのですが、プロジェクト内のテキストファイルではなく、サーバにあるテキストファイルの内容を読み込み、NSLogに出力しようとしているのですが、うまくいきません。xxxxxxxxxxxの部分にテキストファイルのあるURLを入れています。 -----------------textloadViewController.h------------------------------ #import <UIKit/UIKit.h> @interface textloadViewController : UIViewController @end -----------------textloadViewController.m------------------------------ #import "textloadViewController.h" @interface textloadViewController () @end @implementation textloadViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. NSError *error = nil; NSString *filePath = [[NSBundle mainBundle] pathForResource:@"xxxxxxxxxxx" ofType:@"txt"]; NSString *string = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error]; NSLog(@"%@", string); } @end 外部のテキストファイルを読み込む方法を教えてください。よろしくお願いします。

  • ある特定の値(変数)を持たせたい時のクラスの設計法は?

    例えば、「人」クラスと、それを拡張した「杉山」、「鈴木」等具体的な名前を与えるクラスを設計する時、「名前」にあたるものはクラスを作った時点で分かるはずです。 また、「人」クラスをスーパークラスとして持つことも共通しています。 こういった場合、名前にあたる変数はどのように実装するべきなのでしょうか? 例えば、 class Person{ } class Suzuki extends Person{ String name = "suzuki"; } のように、するべきなのか class Person{    STring name_;    void setName(String name){       name_ = name;    } } class Suzuki extends Person{    setName("Suzuki"); } のようにするべきなのか、何がベターなのかよく分かりません。 出来れば、Personクラスを拡張したクラスには、忘れないようにnameフィールドに値を入れるようにしたいのですが、抽象クラスも何か違うのかなぁ…と(よく分かりませんが)。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Eclipseが解りません。

    ファイル名はPerson.javaです。 F11などその他を実行しましたが 以下の問題が検出されました。 javax.xml.ws org.apache.xmlrpc と出ました。 どこが間違っているのでしょうか? アドバイスのほどよろしくお願いいたします。 public class Person { private int age; private double weight; private double height; public Person(int age, double weight, double height) { this.age = age; this.weight = weight; this.height = height; } public void show() { System.out.println("年齢は" + age + "体重は" + weight + "身長は"+ height +"です。" ); } } public class Person { private int age; private double weight; private double height; public Person(int age, double weight, double height) { this.age = age; this.weight = weight; this.height = height; } public void show() { System.out.println("年齢は" + age + "体重は" + weight + "身長は"+ height +"です。" ); } }

    • ベストアンサー
    • Java
  • C言語のプログラムで...

    下のプログラムは参考書にあったサンプルプログラムなのですが /* 関数の宣言 */ int print_struct(struct person dat); のところはなぜint型なのですか? #include <stdio.h> #include <string.h> /* 構造体の定義 */ struct person { char name[20]; /* 名前 */ double height; /* 身長 */ double weight; /* 体重 */ int bpl; /* 最低血圧 */ int bph; /* 最高血圧 */ }; /* 関数の宣言 */ int print_struct(struct person dat); /* main関数 */ int main(void) { /* 変数の宣言 */ struct person dat; /* 構造体のメンバーに値を代入 */ strcpy(dat.name,"山田太郎"); dat.height = 173.5; dat.weight = 63.0; dat.bpl = 98; dat.bph = 113; /* struct person関数を実行 */ print_struct(dat); return 0; } /* print_struct関数 */ int print_struct(struct person dat) { /* 画面に出力 */ printf("%s\n",dat.name); printf("%f\n",dat.height); printf("%f\n",dat.weight); printf("%d\n",dat.bpl); printf("%d\n",dat.bph); return 0; }

  • 構造体について

    5件のデータをRECORDに追加したいのですが、 RECORD inputdata(void)の宣言文エラーなどのコンパイルエラー。それと、inputdataを用いてどうやって5件のデータを入れたらいいかがわかりません。教えてください。 #define SIZE 5 #include <stdio.h> typedef struct{ int yy; int mm; int dd; }YMD; typedef struct{ char name[20]; YMD birthday; int age; }RECORD; RECORD inputdata(void); void main(void) { int i; for(i = 0;i < SIZE;i++){ inputdata(); } RECORD inputdata(void) { RECORD person; printf("名前>"); scanf("%s", person.name); printf("誕生日入力\n"); printf("年>"); scanf("%d", person.birthday.yy); printf("月>"); scanf("%d", person.birthday.mm); printf("日>"); scanf("%d", person.birthday.dd); return person; }

  • objectiv-cで困っています。教えてください

    以前に外部のテキストファイルの中身を読み込む質問をして解答をいただき、助かりました。今回はそれを参考に外部にあるCSVファイルを読み込み解析しようとしているのですが、うまくいきません。CSVの中身は文章,数字/文章,数字/文章,数字/…となっています。いろいろ調べてみたのですが、外部のCSVファイルの読み込みについて書かれているものが分かりませんでした。どのようにしたらよいのでしょうか、教えてください。 #import "ViewController.h" @interface ViewController () @end @implementation ViewController{ NSString* text; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self loadcsv]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } //CSVの読み込み - (void)loadcsv { // CSVファイルの読み込み // 送信するリクエストを生成する。 NSURL *url = [NSURL URLWithString:@"http://....................../test.csv"]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; // リクエストを送信する。 // 第3引数のブロックに実行結果が渡される。 [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if (error) { // エラー処理を行う。 if (error.code == -1003) { NSLog(@"not found hostname. targetURL=%@", url); } else if (-1019) { NSLog(@"auth error. reason=%@", error); } else { NSLog(@"unknown error occurred. reason = %@", error); } } else { int httpStatusCode = ((NSHTTPURLResponse *)response).statusCode; if (httpStatusCode == 404) { NSLog(@"404 NOT FOUND ERROR. targetURL=%@", url); // } else if (・・・) { // 他にも処理したいHTTPステータスがあれば書く。 } else { text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } } }]; // 行ごとに分割し、配列「lines」に格納 NSArray* lines = [text componentsSeparatedByString:@"\n"]; // 問題の数だけ繰り返し for(int i=0; i<[lines count]; i++){ //問題をカンマで区切って、要素を配列「items」に格納 NSArray* items = [[lines objectAtIndex:i] componentsSeparatedByString:@","]; NSString *q = [items objectAtIndex:0]; int a = [[items objectAtIndex:1] intValue]; // 変数の中身を出力する NSLog(@"文字列は%@", q); NSLog(@"数字は%d", a); }

  • javaのEclipseの問題がわからない

    Human.javaで記述されたクラスを継承し、継承したクラスをインスタンス化して、利用できるHumanクラスのメンバをすべて使用するプログラムを作成せよ。クラス名は、継承したクラスをPerson とし、そのクラスをインスタンス化するクラスをQuestion13_1として、実行結果も記述すること public class Human { private String name = "デフォルトの名前"; protected int age = 22; public int height = 170; final public int weight = 55; public String GetName(){ return name; } public void setName(String name){ this.name = name; } } 結果何を出せば良いのわかりません。

  • objective-cで困っています教えてください

    objective-cをトライ&エラーで試しながら学習をしている初心者です。タッチした所を中心にまず100×100の正方形を表示し、その後スライダーで正方形の大きさを決めてから画像のトリミングをしたいのですが、正方形が表示されないのと、タッチした位置と切り取られる位置がずれています。上記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。宜しくお願いします。 ViewController.mの内容 #import "ViewController.h" @interface ViewController (){ // UILabel *label; // UIImageView *uv; //中心の位置 float v; // X座標 float x; // Y座標 float y; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //写真の表示 CGRect rect_uv = CGRectMake(0,20, 360, 360); UIImageView *imageView = [[UIImageView alloc] initWithFrame:rect_uv]; //画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 imageView.contentMode = UIViewContentModeScaleAspectFit; UIImage *image = [UIImage imageNamed:@"hoge.png"]; [imageView setImage:image]; [self.view addSubview:imageView]; // UISliderのインスタンス化 CGRect rect_sd = CGRectMake(50, 400, 200, 10); UISlider *slider = [[UISlider alloc]initWithFrame:rect_sd]; // スライダーの最小値,最大値,値を設定 slider.minimumValue = 0; slider.maximumValue = 500; slider.value = 100; // スライドしている最中に値を調べられるようにする.デフォルトでYESだがサンプルのため slider.continuous = YES; // スライダーの値が変更されたときに呼ばれるメソッドを設定 [slider addTarget:self action:@selector(slider_ValueChanged:) forControlEvents:UIControlEventValueChanged]; // スライダーをビューに追加 [self.view addSubview:slider]; // ラベルの設置 CGRect rect_lb = CGRectMake(300, 400, 100, 30); label = [[UILabel alloc]initWithFrame:rect_lb]; [self.view addSubview:label]; // 標準ボタン例文 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(50, 450, 100, 30); [btn setTitle:@"切り取り" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(trim:) forControlEvents:UIControlEventTouchDown]; [self.view addSubview:btn]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /** * スライダーの値が変更されたとき */ - (void)slider_ValueChanged:(id)sender { UISlider *slider = sender; // スライダーの値をログに記述 NSLog(@"スライダーの値:%f", slider.value); // ラベルのテキストを設定 //float v = slider.value; v = slider.value; label.text = [NSString stringWithFormat:@"%2.f",v]; //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,v,v)); // 四角形の描画 } /** * タッチされたとき */ - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 1.anyObjectメソッドでいずれか1つのタッチを取得 // 2.locationViewメソッドで対象となるビューのタッチした座標を取得 CGPoint p = [[touches anyObject] locationInView:self.view]; x = p.x; // X座標 y = p.y; // Y座標 NSLog(@"タップ開始 %f, %f", x, y); //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,100,100)); // 四角形の描画 } /** * 切り取りボタンが押されたとき呼ばれるtrimメソッド */ -(void)trim:(UIButton*)button{ // ここに何かの処理を記述する // (引数の button には呼び出し元のUIButtonオブジェクトが引き渡されてきます) // 切り抜き元となる画像を用意する。 //UIImage *srcImage = /* UIImagePickerなどから取得したUIImage */ UIImage *srcImage = [UIImage imageNamed:@"hoge.png"]; // 切り抜く位置を指定するCGRectを作成する。 CGRect trimArea = CGRectMake(x, y, v, v); // CoreGraphicsの機能を用いて、 // 切り抜いた画像を作成する。 CGImageRef srcImageRef = [srcImage CGImage]; CGImageRef trimmedImageRef = CGImageCreateWithImageInRect(srcImageRef, trimArea); UIImage *trimmedImage = [UIImage imageWithCGImage:trimmedImageRef]; // 画像表示例文 //UIImage *img = [UIImage imageNamed:@"hoge.png"]; UIImageView *iv = [[UIImageView alloc] initWithImage:trimmedImage]; [self.view addSubview:iv]; } @end

専門家に質問してみよう