2012-11-20 173 views
3

我在做一個使用Microchip C18編譯器的項目。我有一個叫做塊的結構,指向其他塊(東北西南)。這些塊將使我成爲一張地圖。 然後我有一個指針,我用來評估一切。ROM變量指針指向RAM變量?

只是使用RAM,它看起來像:

struct block{ 
     struct block *north; 
     struct block *east; 
     struct block *south; 
     struct block *west; 
}; 


struct block map[5] = 
{ // just a simple line. 
     { NULL, &map[1], NULL, NULL }, 
     { NULL, &map[2], NULL, &map[0]}, 
     { NULL, &map[3], NULL, &map[2]}, 
     { NULL, &map[4], NULL, &map[3]}, 
     { NULL, NULL, NULL, &map[4]} 
}; 


struct block* position = &map[0]; 

這讓我做的東西,如:

void goWest() 
{ 
if(position -> west != NULL) position = position -> west; 
} 

問題是,我已經在我的項目運行的RAM和需要使用ROM 我至今是:

struct block{ 
     rom struct block *north; 
     rom struct block *east; 
     rom struct block *south; 
     rom struct block *west; 
}; 
rom struct block map[5] = 
{ // just a simple line. 
     { NULL, &map[1], NULL, NULL }, 
     { NULL, &map[2], NULL, &map[0]}, 
     { NULL, &map[3], NULL, &map[2]}, 
     { NULL, &map[4], NULL, &map[3]}, 
     { NULL, NULL, NULL, &map[4]} 
}; 

我做了一些調試,能告訴ABO部分作品,但試圖讓位置指針讓我感到悲傷。 所以我想我的問題是:

我該如何容納一個指針,我可以編輯的值的ROM變量地址?

當我嘗試:

struct block *position = &map[0]; 

我得到「在分配警告[2066]類型限定符不匹配」我認識到,一個ROM變量,RAM變量是兩回事, 但我有不知道該怎麼做。

+0

嗨Cal普拉特,並歡迎。我對文字做了一些小修改,你可能想看看。 –

+0

謝謝,貓頭鷹! –

回答

4

宏是什麼意思rom宏?我猜測它擴大到const(可能還有一個編譯器特定的__attribute__或某些),因爲編譯器在抱怨「類型限定符不匹配」,它指的是constvolatile不匹配。

這意味着你試圖隱式地將一個指向常量數據的指針轉換爲指向非常量數據的指針。此代碼應生成你的編譯器相同的警告:

const int x = 0; 
int *y = &x; // &x is "pointer to const" but y is "pointer to non-const" 

要解決它,你需要聲明的是你的position指針是指向常量數據(這取決於rom宏的定義,應該是與任一romconst限定符)來完成:

// Declare a non-constant pointer to constant data 
const struct block *position = &map[0]; 

在每個指針級別,可以有一個const限定符或其缺乏,並且同樣地用於基本非指針對象。因此,單級指針可以有4種不同的變體:

int *x; // Non-constant pointer to non-constant data 
int *const x; // Constant pointer to non-constant data 
const int *x; // Non-constant pointer to constant data 
int const *x; // Same as above 
const int *const x; // Constant pointer to constant data 
int const *const x; // Same as above 

注意int constconst int是等價的,但在其他方面的const安置確實問題。

+0

Microchip PIC使用哈佛架構 - ROM和RAM位於完全獨立的地址空間中,因此您無法將指針混合到兩者。我相信他們正在使用自定義類型限定符來分隔兩者。 – duskwuff

+0

@duskwuff:好的,我沒有意識到這一點。在這種情況下,只需在上面的所有內容中用'rom'替換'const',並且它應該仍然適用,假定編譯器是合理表現的。所以'rom struct block * position =&map [0];'應該是正確的定義。 –

+0

@Adam Rosenfield:謝謝,解決了它! 我很確定我試過這樣做,但它失敗了:/我猜我應該很快就睡了哈哈。 –