質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

1918閲覧

アラート処理の中での、傾斜計測

northpotato

総合スコア38

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2016/06/07 18:52

編集2016/06/11 08:23

iOS9, ipodtouch, Xcode7, Objective-C の初心者です。
特殊ローラーに ipodtouch を固定させ、傾斜を測定しています。
iPodtouh と この特殊ローラーの取り付けが完全(平行)ではないため、補正を行おうと思い、下図のように、alert 画面を使おうとしているのですが、2549行でコンパイルエラーが発生しています。
どなたか、改善策、アドバイス、ご教示頂けたら幸いです。
よろしくお願い致します。

イメージ説明

イメージ説明

頂いたアドバイスを元に、下記のように修正し、希望の機能を実現できました。

// ボタン押下時に Alert-1 を表示する - (IBAction)Button_comp:(UIButton *)sender { // 補正変数の初期化 angle_comp_1 =0; angle_comp_2 =0; angle_comp =0; UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"補正(ステップ1/2)" message:@"補正しますか?" preferredStyle:UIAlertControllerStyleAlert]; // addActionした順に左から右にボタンが配置される [alertController addAction:[UIAlertAction actionWithTitle:@"いいえ" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // 「いいえ」ボタンが押された時の処理 [self cancelButtonPushed]; }]]; [alertController addAction:[UIAlertAction actionWithTitle:@"はい" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // 「はい」ボタンが押された時の処理 [self otherButtonPushed]; }]]; // 画面に表示します [self presentViewController:alertController animated:YES completion:nil]; } // アラートの「はい」ボタン押下処理 - (void)otherButtonPushed { // 定期的に実行するハンドラを設定 CMAccelerometerHandler handler = ^(CMAccelerometerData *angle_data, NSError *error){ [self animation:angle_data]; }; // 加速度センサーの利用を開始 [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]withHandler:handler]; CMAccelerometerData *angle_data = motionManager.accelerometerData; xac = angle_data.acceleration.x; // X 軸: 加速度G yac = angle_data.acceleration.y; // Y 軸: 加速度G angle_comp_1 = atan2(yac, xac) * - 180.0 / M_PI; // 傾斜角を小数点以下1桁の実数表示 self.Incl_Label.text = [NSString stringWithFormat:@"%4.1f", angle]; self.black.transform = CGAffineTransformMakeRotation(M_PI * angle / 180); [self alert_2]; } // アラートの「いいえ」ボタン押下処理 - (void)cancelButtonPushed { NSLog(@"いいえ!"); } - (void)alert_2{ UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"補正(ステップ2/2)" message:@"180度、水平反転してください。" preferredStyle:UIAlertControllerStyleAlert]; // addActionした順に左から右にボタンが配置される [alertController addAction:[UIAlertAction actionWithTitle:@"キャンセル" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // 「いいえ」ボタンが押された時の処理 [self cancelButtonPushed]; }]]; [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // 「はい」ボタンが押された時の処理 [self otherButtonPushed_2]; }]]; // 画面に表示します [self presentViewController:alertController animated:YES completion:nil]; } // アラートの「はい」ボタン押下処理 - (void)otherButtonPushed_2 { // 傾斜角を小数点以下1桁の実数表示 self.Incl_Label.text = [NSString stringWithFormat:@"%4.1f", angle]; self.black.transform = CGAffineTransformMakeRotation(M_PI * angle / 180); CMAccelerometerData *angle_data = motionManager.accelerometerData; xac = angle_data.acceleration.x; // X 軸: 加速度G yac = angle_data.acceleration.y; // Y 軸: 加速度G angle_comp_2 = atan2(yac, xac) * - 180.0 / M_PI; angle_comp = (angle_comp_1 + angle_comp_2)/2 ; self.comp_value.text = [NSString stringWithFormat:@"%4.1f", angle_comp]; // 角度計測を停止する [motionManager stopAccelerometerUpdates]; //angle_ar[] の初期化 int i; for (i=0; i <500; i++) {angle_ar[i] = 0; } // angle_disp[] 初期化 for (i=0; i<10; i++) { angle_disp[i] = 0;} // jcount の 初期化 jcount =0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーメッセージ通り、angle_dataという変数が定義されていないということです。
定義しているつもりなのであれば、angle_dataをどこでどのように定義しているか説明してください。

ただ、「アラートのはいボタン押下処理」(otherButtonPushes)の内容を見ると、この中でCMMotionManagerを生成していることから、「はい」ボタンが押されてから現在の傾きを測定したいようにも見えます。もしそうであれば、angle_dataをパラメータで受け取るのではなくて、ここで傾きデータ測定処理を開始する必要があるのだと思います。(逆に、ここで測定するのでなくangle_dataをパラメータで受け取りたいのであれば、CMMotionManagerの生成は不要だと思います。)

ついでに指摘しておくと、「はい」ボタンが押された時の処理と「いいえ」ボタンが押された時の処理のボタンの割り当てが逆になっていると思います。

投稿2016/06/07 22:49

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

northpotato

2016/06/08 21:27 編集

回答、ありがとうございます。 angle_data の定義部分を追加しました。 でも、これがうまく機能していないようです。 私がやりたかったのは、背中の傾斜を測る前(測定と測定の間でも)に デバイスの補正(ipodtouch とローラー部が平行に設置されていない場合)を するのに、まずアラート1(補正しますか)を表示し、ここで「はい」の補正計測値 angle_comp_1 を取得し、次にアラート2を表示してデバイスを180度回転させて、「はい」を押した場合、補正計測値 angle_comp_2 を取得し、この二つの値から、補正値自体を求めたいと考えています。 ただ、背中の傾斜を測るときに、CMMotionManager を発生させているのに、アラート部分でも、もう一度、CMMotionManager を発生させていいのか不明でしたが、とりあえず、入れてみたら、上記の図のようなコンパイルエラーがでてしまったというのが実状です。 そこで、質問なのですが、一度、CMMotionManager を発生したら、それをアラートの中で使うことは、可能なのでしょうか。 再度、CMMotionManager を発生させる必要はないのでしょうか。 それと、使用者は右利きが多いと思うので、「はい」の部分を右の方に持って来たかったという理由で、上記のようにしました。 よろしくお願い致します。
TakeOne

2016/06/09 00:13 編集

> angle_data の定義部分を追加しました。 もしかして - (void)otherButtonPushed:(CMAccelerometerData *)angle_data; をangle_dataの定義部分だと言っているのですか? これは、otherButtonPushedメソッドの宣言部分で、その呼び出しパラメータにangle_dataというパラメータ名を使用していることを表しているだけであり、angle_dataを定義している部分ではありません。 otherButtonPushedの呼び出しにangle_dataという変数を使用するのなら、どこかでangle_dataという変数が宣言されていて、そのangle_dataという変数に加速度センサーの計測値を設定する処理があるはずだろうから、それを示してくださいと言っています。 でも、コメントの内容から推察する限り、そんな変数はなくて、意味もわからず何かをコピペして、必要もないのにパラメータを引き渡す形にしただけのように思いました。 「背中の傾斜を測るときに、CMMotionManager を発生させている」と書いていることから、最初からmotionManagerという変数には既にCMMotionManagerが生成されているのだろうと思います。だったら、otherButtonPushedメソッドのパラメータでangle_dataを引き渡すのも不要だし、otherButtonPushedの中でCMMotionManagerを新たに生成する処理も不要です。 startAccelerometerUpdatesToQueueかstartAccelerometerUpdatesで既に計測開始しているのであれば、 otherButtonPushedの中で CMAccelerometerData *angle_data = motionManager.accelerometerData; として、現在の加速度センサーの計測値をangle_dataというローカル変数に取得すればよいだけだと思います。 あと、「はい」ボタンが押された時の処理と「いいえ」ボタンが押された時の処理のボタンの割り当てが逆になっているという指摘は、ボタンの並び順を指摘しているのではなく、 actionWithTitleで"いいえ"と表示するボタンの処理がotherButtonPushed呼び出しになっていて、 actionWithTitleで"はい"と表示するボタンの処理がcancelButtonPushed呼び出しになっているので 「はい」ボタンを押すとキャンセルになりますよと指摘しています。
northpotato

2016/06/11 08:19

更なるアドバイス、ありがとうございます。 >startAccelerometerUpdatesToQueueかstartAccelerometerUpdatesで既に計測開始しているのであれば、 otherButtonPushedの中で CMAccelerometerData *angle_data = motionManager.accelerometerData; として、現在の加速度センサーの計測値をangle_dataというローカル変数に取得すればよいだけだと思います。 このステップを入れ、加速度センサーの停止やら開始を入れたり、色々、試行錯誤を繰り返し、追加のプログラムにしたところ、希望のデバイスの補正機能を実現できました。これで、更に一歩前進できました。 本当に、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問