首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言單片機計算器:修復 data 關鍵字衝突與變量定義順序錯誤

     編輯:程式設計綜合問答

編譯錯誤摘要

error C141: syntax error near '['        // unsigned char data[17];
error C141: syntax error near 'unsigned' // unsigned char key_value;
error C202: 'key_value': undefined identifier

兩個致命錯誤

1. data 是 C51/Keil 編譯器的**保留關鍵字**

  • 用於指定變量存儲區域:unsigned char data x; 表示放在內部 RAM 直接訪問區。
  • **不能作為變量名**。

✅ 修改為 key_buf、input_buf 等非關鍵字名稱。

2. 變量定義順序錯誤(C89 標準)

int i;
int res;
p = -1;              // ← 執行語句
unsigned char key_value; // ← 定義在語句之後,C89 不允許

C89 要求**所有變量定義必須在區塊開頭,先於任何執行語句**。

✅ 調整順序:

int i;
int res;
unsigned char key_value; // 先定義
p = -1;                  // 再賦值

其他代碼品質建議

  • void main() → 標準寫法 int main(void) 並 return 0;。
  • jisuan() 中 data[p] 同樣需改為新變量名。
  • 鍵盤掃描邏輯可封裝為查表法,減少重複 switch。
  • 延時函數 delayms 若用於精確時序,建議用定時器中斷替代空循環。

修正後核心片段

unsigned char key_buf[17]; // 原 data[17]
unsigned char p = 0;       // 初始化合併

void main(void) {
    int i, res;
    unsigned char key_value; // 定義前置
    p = 0;
    for (i = 0; i < 10; i++) LED_num[i] = LED_data[i];
    flag = 0;
    while (1) {
        key_value = keypress();
        if (flag == 1) {
            if (p < 17) key_buf[p++] = key_value;
            if (key_value >= 0 && key_value < 10) display_num();
            else if (key_value == '=') { res = jisuan(); dispay_r(res); }
        }
        flag = 0;
    }
}

總結

單片機 C 編程兩大雷區:**保留關鍵字不可作變量名**、**變量定義必須前置**。改名 data 並調整定義順序即可編譯通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved