2013-09-25 32 views
1

我一直無法獲得此代碼正常工作。 我的目標是顯示放置在LCD上的PROGMEM中的字符串。 指向這些字符串的數組也在PROGMEM中。 該函數被調用一個變量,該變量又被轉換爲讀取數組的索引號。 Ofcourse pgmspace.h包含在代碼中。Progmem中的數組錯誤下標?

我不斷收到的錯誤是: 數組下標具有類型「字符」 [-Wchar-標] - 初始化時將整數指針沒有施放[默認啓用]

有人能指出我在這裏失蹤?

工作在AVR GCC代碼上,我的IDE是Eclipse。

const char wf0[] PROGMEM= "OFF "; 
    const char wf1[] PROGMEM= "SIN "; 
    const char wf2[] PROGMEM= "TRI "; 
    const char wf3[] PROGMEM= "S+T "; 
    const char wf4[] PROGMEM= "PUL "; 
    const char wf5[] PROGMEM= "P+S "; 
    const char wf6[] PROGMEM= "P+T "; 
    const char wf7[] PROGMEM= "P+ST"; 
    const char wf8[] PROGMEM= "NOI "; 
    const char wf9[] PROGMEM= "N+S "; 
    const char wf10[] PROGMEM= "N+T "; 
    const char wf11[] PROGMEM= "NST "; 
    const char wf12[] PROGMEM= "N+P "; 
    const char wf13[] PROGMEM= "NPS "; 
    const char wf14[] PROGMEM= "NPT "; 
    const char wf15[] PROGMEM= "NPTS"; 

    const char * const arrayWaveform[] PROGMEM= {wf0,wf1,wf2,wf3,wf4,wf5,wf6,wf7,wf8,wf9,wf10,wf11,wf12,wf13,wf14,wf15}; 

... 

void showWaveform (char ctrlValue) 
{ 
    char hex = (ctrlValue & 0xf0)>>4; 

    char tempText[4]; 
    char* data = pgm_read_byte(&arrayWaveform[hex]); // <<shows up both errors here 
    strcpy_P (tempText, data); 
    for (char x=0;x<4;x++) 
     { 
     char2LCD(tempText[x]); // <<shows up error: array subscript has type 'char' 
     } 
} 

回答

2

這應該這樣做:

void showWaveform (char ctrlValue) 
{ 
    char hex = (ctrlValue & 0xf0)>>4; 
    char *pstr, tempText[5]; 
    memcpy_P(&pstr, arrayWaveform+hex, sizeof(char*)); 
    strncpy_P(tempText, pstr, sizeof(tempText)); 
    for (int x=0; x<4 && tempText[x] != 0; x++) 
    { 
    char2LCD(tempText[x]); 
    } 
} 

有你的代碼的多個問題。首先和最重要的是arrayWaveform本身存儲在PROGMEM中,所以你不能簡單地使用方括號來訪問它。其次,tempText必須至少有5個元素長(否則strcpy_P可以寫入數組末尾)。

您可能需要仔細閱讀關於PROGMEM的docs,以充分理解發生了什麼。請注意,如果您有最近的AVR-GCC副本,還有new __flash syntax,它允許擺脫所有的pgm_read_ *和* _P機器。我從來沒有測試過,所以YMMV。

+0

我正在查看你的代碼。謝謝你指出的東西。做了一些小修改(temptext和tempText,初始化* pstr = 0)。它編譯好,但仍然給出奇怪的結果。這可能不需要處理你的代碼,但也許在我的代碼中的其他地方,其他類似的問題仍然在眼前。這一點也將一些數據放在progmem中,但不能正確編譯。可能是同樣的錯誤。我明天會研究這個。現在感謝! – user2371490

+0

我的不好:我在'memcpy_P'的調用中忘記了pstr之前的'&'。這是因爲memcpy_P會加載一個指向PROGMEM的指針,所以我必須傳遞我想要加載指針的地址,即指向char *的指針。 – CAFxX

0

正如您的編譯器所說,您正在使用char s進行數組訪問。通常數組下標必須是int s。

在這兩行上,您應該將您的變量轉換爲int s,或者只聲明它們爲int s以開始。

至於其他錯誤,我的猜測是,pgm_read_byte返回一個原始的char,你試圖分配給char*,這是不可能的。你或許應該歸還從pgm_read_byte

1

指針在tempText[x]arrayWaveform[hex]指數爲signed char類型的可佔用negavtive值太

更改爲unsigned char

GCC Warnings

Wchar-subscripts如果數組下標具有char類型,則發出警告。這是錯誤的常見原因,因爲程序員經常忘記這種類型是在某些機器上簽名的 。此警告由-Wall啓用。

+0

謝謝,你的正確,沒有想到這一點。通常我使用uint8_t,這次完全忘了。 – user2371490