使用者撰寫程式驗證 5×5 矩陣是否為魔方陣(各行、各列、兩條對角線總和相等),遭遇兩大問題:
check 無法正確呼叫C4715: not all control paths return a value// 原始錯誤宣告
int check();
// 正確宣告:二維陣列參數必須指定第二維大小
int check(int score[][5]); // 或 int check(int (*score)[5]);
原因:C 語言中,陣列作為函式參數會退化為指標。二維陣列 int [5][5] 傳遞時實際類型為 int (*)[5](指向含 5 個 int 陣列的指標),編譯器需要知道「每一列有多少個元素」才能正確計算位址偏移。
// 原始有缺陷的 check 函式
int check(int score[][5]) {
// ... 計算邏輯 ...
for(i = 0; i < 5; i++) {
if(sum[i] == s[i] && s[i] == sum1 && sum1 == sum2)
return 1;
else
return 0; // 第一輪就會 return,根本不會檢查完 5 列!
}
// 若迴圈不執行(理論上不會),這裡缺少 return
}
雙重錯誤:
else return 0 導致只檢查第 0 列就結束。應移除 else,檢查完所有列後再統一回傳。for 迴圈不進入(極端情況),函式結束時無 return,觸發 C4715 警告。int check(int score[][5]) {
int i, j;
int row_sum[5] = {0}; // 各行總和
int col_sum[5] = {0}; // 各列總和
int diag1 = 0, diag2 = 0;
// 計算行、列總和
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
row_sum[i] += score[i][j];
col_sum[j] += score[i][j];
}
}
// 計算對角線總和
for (i = 0; i < 5; i++) {
diag1 += score[i][i]; // 主對角線
diag2 += score[i][4 - i]; // 副對角線
}
// 驗證所有行、列、對角線總和是否相等
int target = row_sum[0];
for (i = 0; i < 5; i++) {
if (row_sum[i] != target || col_sum[i] != target)
return 0;
}
if (diag1 != target || diag2 != target)
return 0;
return 1; // 所有檢查通過
}
#include <stdio.h>
int check(int score[][5]);
int main() {
int flag;
int score[5][5] = {
{17, 24, 1, 8, 15},
{23, 5, 7, 14, 16},
{4, 6, 13, 20, 22},
{10, 12, 19, 21, 3},
{11, 18, 25, 2, 9}
};
int i, j;
flag = check(score);
if (flag) {
printf("此為魔方陣,矩陣內容:\n");
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++)
printf("%4d", score[i][j]);
printf("\n");
}
} else {
printf("非魔方陣\n");
}
return 0;
}
// check 函式定義同上...
此為魔方陣,矩陣內容: 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
| 知識點 | 說明 |
|---|---|
| 二維陣列參數 | 必須指定第二維大小:int arr[][COLS] 或 int (*arr)[COLS] |
| C4715 警告 | 函式有非 void 回傳類型,但存在不回傳值的執行路徑 |
| 魔方陣定義 | N×N 矩陣,各行、各列、兩條對角線數字之和皆相等 |
| 陣列初始化 | 靜態初始化確保資料正確,避免輸入錯誤 |