使用Arduino模擬器測試演算法(二):參數傳值(value)與傳址(reference)

一般的變數值設定敘述,都是直接傳遞數值,以交換兩個變數值為例,底下敘述執行後,經第三者(temp)助力,a和b值就互換完成:

交換變數值

但若把以上敘述包裝成自訂函式,情況就不一樣了,因為函式的參數或在其中宣告的變數,屬於「區域」型。

左下圖的swap()自訂函式將接收x和y兩個整數型參數,呼叫此函式傳入並傳遞參數時,資料將被複製給函式參數,因而稱作傳值呼叫(call by value)。此自訂函式執行完畢,資料僅在其內部達成交換,x, y和temp也會被刪除,所以a和b變數值並未交換。

傳值與傳址呼叫

右上圖的敘述則是在呼叫函式時,傳遞資料的位址給參數(參閱《超圖解Arduino 互動設計入門》第八章「認識Pointer」),所以函式處理的資料跟呼叫方是同一份,這種函式執行與參數傳遞方式稱作傳址呼叫(call by reference)

搭配右上角的swap()傳址自訂函式,在序列埠監控視窗顯示交換前後的程式碼如下:

傳址呼叫

像這種單純驗證語法的程式碼,最適合用Arduino模擬器測試。只要在Tinkercad的新電路中,放置一個Arduino板:

Arduino Uno R3

在程式碼編輯器,輸入這個程式:

void swap(int* x, int* y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

void setup() {
  int a=10, b=20;
  Serial.begin(9600);
  // 交換之前的a和b值
  Serial.println(String("Before swap:") + "\t" + a + "\t" + b);
  swap(&a, &b);
  // 交換之後…
  Serial.println(String("After swap:") + "\t" + a + "\t" + b);
}

void loop() {
  // 這裡沒有程式
}

點擊程式編輯器底部的「串列監視器」,開啟它:

串列監視器

按下「開始模擬」鈕,將能在串列監視器顯示a, b變數值交換結果:

串列監視器

若要編輯程式碼,請先按下「停止模擬」鈕。

Posts created 470

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top