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

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

ただいまの
回答率

90.40%

  • Arduino

    709questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

アルドゥイーノのスケッチでエラーが出て解決できません。教えてください。

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 900

7219kazuo

score 2

arduino mega2560 を利用して 自分の作業に役立てたいと思っている初心者です。
「Android ADK組込みプログラミング完全ガイド」を購入し、現在、スケッチを勉強しています。
しかし、本に掲載されているサンプルブログラムを何度入力しても、エラーが発生し、検証コンパイルができません。
エラーは下記のようなものです。
'convertDurationToClocks' was not declared in this scope
是非、解決方法を教えていただければ、幸いです。
スケッチは、上記本の「第8章 Android対応の電子オルゴールを作る」のサンプルスケッチです。
全体のスケッチは下記の通りてす。
何卒、よろしくお願いいたします。

define PIN_PUSHSW_INPUT 8     // 押しボタンスイッチをデジタルI/O 8番に接続

define PIN_TONE_OUTPUT 11     // 圧電スピーカーをデジタルI/O 11番に接続

define PIN_LED_INDICATOR 13   // デジタルI/O 13番に接続されているARDUINOボードのLED用

void parseMml(char* );
boolean isDigit(char c);
char* getNumber(char* mmlstr,int columns,int* number);
char* getDuration(char* mmlstr,int correntlength,int* duration,boolean* dotted);
char* getTone(char* mmlstr,unsigned char* tone,int* octaveoffset);
unsigned long convertFrequency(int tone,int octave);

// 楽譜データ
char mmlString[] = "T132 05 L4GL8RDL4GL8RD GDGB>L4DR CL8R<AL4>CL8R<A >C<AF+AL4DR";

void setup() 
{
pinMode(PIN_TONE_OUTPUT,OUTPUT);
digitalWrite(PIN_TONE_OUTPUT,LOW);

pinMode(PIN_LED_INDICATOR,OUTPUT);
digitalWrite(PIN_LED_INDICATOR,LOW);   

pinMode(PIN_PUSHSW_INPUT,INPUT_PULLUP);
}
// 押しボタンスイッチが押されたどうかの確認
// 引数 : なし
// 戻り値 : true  = 押されている(100ms待ちも入れる)
//          false = 押されていない
boolean checkButtonPushed(void)
{
if(digitalRead(PIN_PUSHSW_INPUT) == LOW){
delay(200);
return(true);  
}
return(false);
}

boolean checkStopPlay(void)
{
return checkButtonPushed(); 
}

void loop() 
{
// ポンタが押されるまで待つ
while(checkButtonPushed() == false);

// MMLデータの字句解析と再生
digitalWrite(PIN_LED_INDICATOR,HIGH);
parseMml(mmlString);
digitalWrite(PIN_LED_INDICATOR,LOW);
}

// MMLデータを解析しながら再生する
// 引数 : MMLデータ(終端は'\0')
// 戻り値 : なし
void parseMml(char* mmlstr)
{
// ** 再生開始状態における初期値

// オクターブ = 4(O4)
int current_octave = 4;
// 音符、休符の長さ = 4分(L4)
int current_length = 4;
// テンポ = 60(T60)
int current_tempo = 60;
// ボリューム = 127(V127) *未使用
int current_volume = 127;
// 楽器番号 = 0(@0) *未使用
int current_program = 0;

int delay_time;
int duration;
int oct_offset;
unsigned char ctone;
unsigned char ctone_prev = 255;
unsigned short oneTick;
boolean tie = false;
boolean dotted;

oneTick = 60000 / current_tempo / 96;

while(*mmlstr != '\0'){

if(checkStopPlay() == true){
noTone(PIN_TONE_OUTPUT);
return;
}

switch(*mmlstr){
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
case 'A':
case 'B':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
case 'a':
case 'b':
// 音符の取得
mmlstr = getTone(mmlstr,&ctone,&oct_offset);
// 長さの取得
mmlstr = getDuration(mmlstr,current_length,&duration,&dotted);

delay_time = convertDurationToClocks(duration) * oneTick; 
if(dotted){
// 符点がある場合には、音長を1.5培にする
delay_time += delay_time >> 1; 
}
// タイの処理
if(tie && (ctone == ctone_prev)){
// タイの場合(前回処理した音符と今回処理した音符が同一である場合)
delay(delay_time);
}
else}
// タイでない場合はスラーとする(処理上は単に音程を変える)
}
tone(PIN_TONE_OUTPUT,convertFrequency(ctone,cuurent(octave+ oct_offset));
delay(delay_time);
]
]
ctone_prev = ctone;
tie = false;
break;
case 'L';
case 'l';

// 休符の処理
tie = false;          
mmlstr = getDuration(mmlstr+1,current_lenth,&duration,&dotted);

delay_time = convertDurationToClocks(duration) * oneTick;
if(dotted){
// 音符、休符の長さの設定
mmlstr = getNumber(mmlstr+a,2,&current_length);
break;
case 'R';
case 'r';

// 符点がある場合には、音長1.5倍にする
delay_time += delay_time >> 1;
]

// 音を止める
noTone(PIN_TONE_OUTPUT);
delay(delay_time);

break;
case 'O';
case 'o';
// オクターブの変更
tie = false;
[
int oct;
mmlstr = getNumber(mmlstr+1,2,&oct);
// オクターブの設定範囲:0~8の間かチェック
if(oct >= 0 && oct <= 8)[
current_octave = oct;
}  
}
break;
case 'T';
case 't';
// テンポの変更
tie = false;
mmlstr = getNumber(mmlstr+1,3,&current_tempo);
// テンポ設定値を元に4分音符を96で割った値を基準値として記憶する
oneTick = 60000 / current_temp / 96;
break;
case 'V';
case 'v';
// 音量の変更
tie = false;
mmlstr = getNumber(mmlstr+1,3,&current_volume);
printf("Volume => %d\n",current_Volume);
break;
case '@';
// 楽器の変更
tie = false;
mmlstr = getNumber(mmlstr+1,3,&current_program);
break;
case '>';
// オクターブを1つ上げる
tie = false;
if(current_octave < 8){
current_octave++;
}
mmlstr++;
break;
case '<';
// オクターブを1つ下げる
tie = false;
if(current_octave > 8){
current_octave--;
}
mmlstr++;
break;                                   
case '&';
// タイ
tie = true;
mmlstr++;
break;
defailt:
// 不明のキャラクタ
tie = false;
mmlstr++;
}
}
noTone(11);
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

ホーム >  書籍 >  Android ADK組込みプログラミング完全ガイド >  ダウンロードからサンプルコードをダウンロードできます(SHOEISHA iDが必要)のでご自身のコードと見比べてください。

ただ、サンプルコードにも不備があるようです。
Chapter08_sample02.inoにおいて、以下のように修正するとビルドできると思います。

// 前略
unsigned long convertFrequency(int tone,int octave);
unsigned short convertDurationToClocks(int d);    // 追加

// 略

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

'convertDurationToClocks' was not declared in this scope

convertDurationToClocks が定義されていない、といってます。
この名前が間違っていないか、(特に大文字小文字の違い)チェックしてみましょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/20 21:51

    'convertDurationToClocks' には大文字小文字の間違いは見つかりませんでした。
    他に考えられるようなことはないでしょうか?

    キャンセル

  • 2018/03/20 21:57

    そのメッセージがコンパイラで出されているなら、その関数が定義されてるヘッダファイルのインクルードがされていない、
    リンカで出された、というなら、その関数を含むライブラリがリンクされていない、ということなんでしょう。

    繰り返しますが、その名前が間違ってないかをよくチェックしましょう。

    #さんざ念を押して、間違いはない!といってるのに、実際見てみたら違っていた、ということが往々にしてありますw

    キャンセル

  • 2018/03/20 22:20

    ご連絡、ありがとうございます。 もう一度 最初から インクルードも含め、見直してみます。

    キャンセル

0

コンピュータのプログラムは、「何度か入力する」ことでうまくいったりするものではありません。
正しく入力していれば一回で(そして何度でも)ちゃんと動作しますし、間違いのままであれば何度入力しても駄目です。

convertDurationToClocksの宣言も定義もないのでエラーになります。入力し忘れということはないですか? 最初の方の //楽譜データ の前あたり怪しいですけれど。

それ以外にも

else}
// タイでない場合はスラーとする(処理上は単に音程を変える)
}
tone(PIN_TONE_OUTPUT,convertFrequency(ctone,cuurent(octave+ oct_offset));
delay(delay_time);
]
]


この辺どうにもおかしいです。C++(Arduino言語)としてはあり得ない構成。
本を持っていないので本が間違っているのかあなたが間違えて入力しているのかわかりませんが...(いまどきだとネット上にプログラムを置いていたりしないのかな?)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/20 22:20

    ご返答、ありがとうございます。
    else}
    // タイでない場合はスラーとする(処理上は単に音程を変える)
    }
    tone(PIN_TONE_OUTPUT,convertFrequency(ctone,cuurent(octave+ oct_offset));
    delay(delay_time);
    ]
    も、間違いがないか、再度チェックしてみます。

    キャンセル

  • 2018/03/21 09:58

    書いてある通りに打ち込んであるかどうか確認するのは確かに一つの手段ですが...

    Arduino(あるいはAndroid)をとにかく動かせればいい、という意味ではプログラム言語を「突き詰める」必要まではないですが、それでも言語の基礎は一通り知っていないと、呪文を唱えたらなにか出来た、というだけで終わってしまいます。ただ内容を写して動かすだけではタイピング練習にしかなりません。少なくとも、書名の感じからすると「写せばできる」ことを目的とした本ではなさそうですし。

    折角間違えたのですから、なぜそれが駄目なのか調べると間違えた事自体が生きて/活きてくると思います。
    それを活かすためにも、Arduinoに関してはCと出来ればC++、Androidについては多分Java(その本でどう扱っているかによる)の入門書くらいは一通り目を通し、手元において、必要に応じて調べられるようにしておくべきかと思います。

    キャンセル

0

convert何某の定義はどこに書きましたか?

この質問に答えられなかった場合は
あなたの習熟具合に対して内容が高度になりすぎています。一度読み返すことをおすすめします

対症療法的には、今リスト8-3の内容を写経したかと思いますが、
リスト8-4の内容も書きましょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/20 22:57

    ozwk様
    ご回答ありがとうございます。
    convert何某の定義はどこに書きましたか?に対して、私には高度すぎて答えられません。ただ単に写経しただけのまだ初心者の為です。またリスト8-4の内容もスケッチしていませんので、トライしてみます。convert何其の定義もよく理解していませんので、もう少し勉強してみます。その後、まだ解決を得られなければ、質問させていただくことにいたします。   ありがとうございました。

    THOR_V6様からのご指摘がありました tone(PIN_TONE_OUTPUT,convertFrequency(ctone,cuurent(octave+ oct_offset)); にスペルミスがありました。 cuurent(octabe+ ⇒ current(octave+ でした。 感謝いたします。

    キャンセル

  • 2018/03/21 00:52

    え? octabeなんてどこかにあった? いままであなたが書いてないことは知りようがないのだけれど...

    いやいや、そんなレベルじゃなくて。例えば、
    tone( ( ( ));
    でカッコの開きと閉じがあってないでしょ。
    その前の
    else}
    ってのは、C/C++(Arduino)言語では絶対にありえない配置だし。
    唐突に出てくる二つの]も何?
    ということなんだけど。

    キャンセル

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

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Arduino

    709questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。