関数 part2

変数のスコープとは

スコープ(scope)とは、変数がプログラム内で参照または変更できる範囲のことを指します。スコープによっては、変数がどこで使えるのか、どこで使えないのかが決まります。

スコープの主なタイプ

  1. ローカル変数(Local Variables): これらの変数は、特定の関数やブロック({}で囲まれたコードの範囲)内でのみ有効です。関数やブロックが終了すると、ローカル変数は存在しなくなります。

    void myFunction() {
      int localVariable = 10; // この変数はmyFunction内でのみ有効
    }
    
    

    また、forループの中で宣言された変数も、そのループ内でのみ有効となります。

    for(int i = 0; i < 10; i++) {
      int loopVariable = i*2; // この変数はforループ内でのみ有効
    }
    // ここではloopVariableは存在しない
    
    
  2. グローバル変数(Global Variables): これらの変数はプログラムのどこからでもアクセスできます。通常、すべての関数の外部で定義されます。

    int globalVariable = 20; // この変数はプログラム全体で有効
    
    void setup() {
      // globalVariableはここでも使用可能
    }
    
    void loop() {
      // globalVariableはここでも使用可能
    }
    
    

なぜスコープは重要か

  1. データの安全性: ローカル変数は、そのスコープ外からアクセスできないため、データが安全です。
  2. メモリ効率: ローカル変数は、そのスコープが終了するとメモリから解放されるため、メモリ効率が良くなります。
  3. 可読性と保守性: スコープが明確に管理されていると、コードは読みやすく、保守もしやすくなります。

PART2で学習したスケッチのloop()関数内にあるfloat diameterfloat heightという変数の宣言をsetup()関数内に移動させると、ビルド時にエラーが発生します。この変更を行い、自分の環境でエラーが発生するかどうか確認してみてください。

void setup() {
  Serial.begin(115200);
}

void loop() {
  //引数を渡して関数の実行し、戻り値を受け取る
  float diameter = 15.8;
  float height = 8.9;
  float volume = cylinderVolume(diameter, height);
  Serial.println(volume);
  delay(1000);
}

//関数本体
float cylinderVolume(float D, float H){
    float r = D / 2;  // 半径を計算
    float V = r * r * 3.14 * H;  // 体積を計算
    return V;
}

課題1

以下のスケッチはグローバル変数を使用しており、cylinderVol関数もvoid型に書き換えられています。実際にこのコードを自分の環境で実行し、グローバル変数float volumeがどのように上書きされるのかを追跡してみてください。また、このコードには構文上のエラーも含まれているので、それを見つけて修正してみてください。

float diameter = 15.8;
float height = 8.9;
float volume = 0.0;

void setup() {
  Serial.begin(115200);
  Serial.println("setup(): " + String(volume));
}

void loop() {
  volume = -9.9;
  Serial.println("before cylinderVolume(): " + String(volume));
  cylinderVolume();//引数を渡さずに関数を実行し、戻り値も受け取らない
  Serial.println("after cylinderVolume(): " + String(volume));
  delay(1000);
}

//関数本体
void cylinderVolume(){
    float r = diameter / 2;  // 半径を計算
    volume = r * r * 3.14 * height;  // 体積を計算
}

課題2

以下に示されるスケッチは1から10までの数字を加算し、その合計をSerial Monitorに表示することを意図しています。しかし、期待通りに動作しません。何が問題であるかを特定し、それを修正して、スケッチを完成させてください。

int total = 0;  // グローバル変数の宣言

void setup() {
  Serial.begin(115200);
}

void loop() {
  for (int i = 1; i <= 10; i++) {
    addToTotal(i);
  }
  Serial.println("Total value: " + String(total));
}

void addToTotal(int value) {
  int total;  // ローカル変数の宣言
  total = value;
}

課題3

これまでの課題で使用したスケッチを基に、直径が58.4mmの球体の体積を計算するプログラムを作成してください。計算結果はSerial.println()を使ってシリアルモニターに出力しましょう。