amerikantypewr1ter
@amerikantypewr1ter (y kawano)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JUCE(C++) switch文について

解決したいこと

下記の資料(本)を参考にjuceでシンセサイザーのプラグインを作っています。
https://www.oufac.com/

資料のswitch文を使用している部分で詰まりましたので質問させてください。コードを添付いたします。

該当するコード

void JUCEJAPANDEMOAudioProcessor::setParameter(int index, float value)
{
    switch (index)
    {
    case MasterBypass:
        UserParams[MasterBypass] = value;
        break;
    case Gain:
        UserParams[Gain] = value;
        break;
    case Threshold:
        UserParams[Threshold] = value;
        break;
    case Volume:
        UserParams[Volume] = value;
        break;
    default: return;
    }
    //GUI
    UIUpdateFlag = true;
}

資料によると、インデックスで処理を分岐するということで、
index==0の場合、MasterBypassパラメータの値を設定、
index==1の場合、Gainパラメータの値を設定、
index==2の場合、Thresholdパラメータの値を設定、、、

と説明があります。
ですが、switch文のcaseで示す部分は基本的に数値だと認識しているため、資料に書いてあるようなMasteBypassのような定数?がcaseの値に設定されている場合hどのように解釈すれば良いか分かりません。

情報が少ない場合はわかる範囲で追加しますので、、よろしくお願いいたします。

0

3Answer

    enum Parameters 
    { 
      MasterBypass = 0,
      Gain,
      Threshold,
      Volume,
      totalNumParam
    };

MasterBypass は0、 Gain は1……と定義されているので、 case にその数値が設定されていると考えればいいです。

1Like

Comments

補足となる情報を追加しますと、以下の記事が背景を説明してくれているので参考になるかと思います。

コンパイラによって、定数に展開されます。

と記事中にある通り、コンパイル時に定数として展開されるので、C/C++言語におけるswitch文の条件判定の値に使えます。

1Like

Comments

  1. ありがとうございます!参考にさせていただきます!

case ラベルとして使えるのは結果が整数型になる定数式です。

定数式の詳しい条件は複雑なのでここでは述べませんが、要するにコンパイル時に計算してしまえる式であり、定数とみなせるような式です。 列挙定数以外でも様々なやり方が出来るようになっています。 たとえば以下のような。

#include <iostream>

int main(void) {
  const int foo = 1;
  switch(2) {
  case foo :
    std::cout << "one" << std::endl;
    break;
  case 1+1:
    std::cout << "two" << std::endl;
    break;
  default:
    std::cout << "a lot!" << std::endl;
  }
}

定数式という言葉で調べれば色々と情報は見つかると思います。

ただ、 C と C++ で定数式が成立する条件が違うといったことや、 C++ でも規格の改定で変更されている部分があるということには留意する必要があるでしょう。

0Like

Your answer might help someone💌