2016-08-03 26 views
2

我開發了PIC的代碼,我很滿意它。 問題是,我的變量推杆到RAM中,它幾乎已滿。基於指向const的指針的C函數

我已經嘗試與數組數組前面的const,但我失敗了基於指向常量數組的指針後來的函數。

有人可以告訴我如何定義該指針嗎?

這是我現在有:

#define type  unsigned int8 
#define memType const type 
memType n_006 = 2; 
type l_006[n_006]={0x03, 0xFF}; 

功能:

void writeLine(type adress, type *send, int8 numS) 
{ 
    int8 i = 0; 
    i2c_start(); 
    i2c_write(adress); 
    for(i = 0; i < numS; i++) 
    { 
     int8 toSend = send[i]; 
     i2c_write(toSend); 
    } 
    i2c_stop(); 
} 

而且在主:

writeLine(a1, &l_006[0], n_006); 

主要目標是到保存在ROM中的數據,我猜猜可能會被前面的const捐獻,但我真的沒有做到正確。

由於提前, 克里斯

+0

失敗怎麼辦?編譯器錯誤?運行時錯誤?請明確點。 – user694733

+0

爲什麼使用'#define'而不是'typedef' –

+0

一些PIC編譯器使用'memcpy()'等選擇函數將'const'數據傳遞給非''constst'。發佈失敗的代碼並描述失敗的原因。 – chux

回答

1

你的編譯器可以支持額外的符明確指定爲全局(EEPROM等)的存儲。

此外它更好地使用typedef的而不是宏。

typedef unsigned int8 type, *ptype; 
typedef const type memType; 
memType n_006 = 2; 
type l_006[n_006]={0x03, 0xFF}; 

你也可以擺脫n_006的所有,只是使用衆所周知sizeof招:

writeLine(a1, l_006, sizeof l_006/sizeof l_006[0]); 
+0

儘管宏定義的typedef肯定是首選,但它不應該是OP問題的根源。另外,在typedef後面隱藏一個指針類型總是很難看。 – user694733

+0

它不起作用。 上線: typedef const type memType; 我有一個錯誤「期待=」 –

+0

@ user694733「...在typedef後面隱藏一個指針類型總是很醜陋......」海事組織是一個品味問題。 – Sergio

0

由於serhio說,檢查你的特殊的編譯器符。例如在XC8編譯器(它沒有INT8,所以我必須使用CHAR)

const unsigned char ylist[] = { 0x03, 0xFF }; 

生成

stringdir: 
    movlw high stringdir 
    movwf 10 
    movf 4,w 
    incf 4,f 
    addwf 2,f 
__stringbase: 
    retlw 0 
__end_of__stringtab:  
_ylist: 
    retlw 3 
    retlw 255 
__end_of_ylist; 

但使用關鍵字EEPROM,而不是常量

eeprom unsigned char ylist[] = { 0x03, 0xFF }; 

生成

_ylist: 
;initializer for _ylist 
    db 3 
    db 255 

它使用了一半的空間量,並沒有字符串轉換例程。它的運行速度可能也快很多。

0

我使用CCS C編譯器

我用:

#define type  unsigned int8 
#define memType const type 
#define tabType rom type 

和它的工作

解決