賈維斯的智慧工坊

  • Home
  • About
  • Note
  • Project
  • Experience
  • Service
  • Sitemap


MY | NOTES

  1. 首頁
  2. >
  3. 筆記
  4. >
  5. 微處理器

Using arrays as parameters and return values

副函式中使用矩陣作為參數或回傳矩陣
Jun, 2017
程式碼是基於C並實現於Arduino的範例
且不使用全域變數的情況下完成副函式的撰寫
包含以下幾種情境:

Case A: 多值輸入、單值輸出
Case B: 多值輸入、多值輸出(單陣列輸出)
Case C: 單陣列輸入、單陣列輸出
Case D: 多矩陣輸入、多矩陣輸出
Example: 完整範例


Case A: 多值輸入、單值輸出

第一步只是最簡單的常用例子
在使用多值作為副函式的參數,且輸出單值

Case B: 多值輸入、多值輸出(單陣列輸出)

要將多個值輸出,最簡單的方法就是將答案集合成一個陣列(1*N)
我使用的方法是

int* ansB = new int[2];
ansB = caseB(1, 2);
delete ansB;
其中ansB存著兩個int答案的位置

int* caseB(int a, int b){
  int* ans = new int[2];
  ans[0] = a+b;
  ans[1] = a-b;
  return ans;
}
可以看到副函式中需要再創一個和ansB相同格式的ans
並將結果存進去,最後return回ansB
其原理是傳送的是他們的位址(pointer adress)
另外使用new去創造變數,如果不使用
必須delete處理,避免佔據記憶體

最後,此範例的結果 ansB = { 3, -1}

Case C: 單陣列輸入、單陣列輸出

在輸入的部分,由於只是需要他們的值
dataC並不需要用pointer宣告
反之,輸出單陣列同上述方法

int dataC[2] = {1, 2};
int* ansC = new int[2];
ansC = caseC(&dataC[0]);
delete ansC;
在將dataC做為參數時
只要將它第一個位址使用&傳進去

int* caseC(int a[]){
  int* ans = new int[2];
  ans[0] = a[0]+a[1];
  ans[1] = a[0]-a[1];
  return ans;
}
宣告副函式的方法,則需註明參數是個陣列[]

最後,此範例的結果 ansC = { 3, -1}

Case D: 多矩陣輸入、多矩陣輸出

陣列維度是1*N,矩陣則是N*N
在操作上就稍為困難
如果只是想使用單矩陣、多矩陣
也能用此範例修改,這裡將介紹兩個矩陣的輸入輸出

  int dataD1[2][2] = { {1, 2},{3, 4} };
  int dataD2[2][2] = { {4, 3},{2, 1} };
  
  int ansD1[2][2] = { {0, 0},{0, 0} };
  int ansD2[2][2] = { {0, 0},{0, 0} };
  
  caseD(&dataD1[0], &dataD2[0], &ansD1[0], &ansD2[0]);
首先宣告所有的矩陣,並將它們第一個位址傳給副函式

void caseD(int a[][2], int b[][2], int ans1[][2], int ans2[][2]){
  ans1[0][0] = a[0][0]+b[0][0];
  ans1[0][1] = a[0][1]+b[0][1];
  ans1[1][0] = a[1][0]+b[1][0];
  ans1[1][1] = a[1][1]+b[1][1];

  ans2[0][0] = a[0][0]*b[0][0];
  ans2[0][1] = a[0][1]*b[0][1];
  ans2[1][0] = a[1][0]*b[1][0];
  ans2[1][1] = a[1][1]*b[1][1];
}
副函式的參數比較特別,因為我們只給它那段起始位址
程式並不知道要從哪裡切,故需告訴它寬度int a[][2]
之後在副函式的操作都是直接修改該址的數值

最後,此範例的結果
ansD1 是兩資料相加 = { {5, 5},{5, 5} }
ansD2 是兩資料相乘 = { {4, 6},{6, 4} }

Example: 完整範例


← Back to note