2014-11-14 94 views
1

我有一大羣uint16_t以不同類型訪問陣列成員的正確方法?

其大多數成員是uint16_t,但有些是int16_t和一些uint8_t

你會如何處理?


順便說,我想:

  1. 指針:

    使用2個指針,一個int16_t*和其他uint8_t*,既初始化爲數組的開始,訪問部件的陣列是int16_tuint8_t

    (即最初的工作,但我遇到了問題時,後面的程序別的東西改變了指針的值,所以我不相信它。)與工會

  2. 類型定義。

    在file.h:

    typedef union { 
        uint16_t u16[NO_OF_WORDS];  // As uint16_t 
        int16_t s16[NO_OF_WORDS];  // As int16_t 
        uint8_t u8[2 * NO_OF_WORDS]; // As uint8_t 
    } ram_params_t; 
    extern ram_params_t ram_params[]; 
    

    在file.c:

    ram_params_t ram_params[] = {0}; 
    

    (這確實轟炸了。)

  3. 鑄造。

    (我沒有走得很遠這一點。)

+1

你怎麼知道哪些元素是哪些類型的?你能向我們展示鑄造嘗試嗎?這似乎是最明智的方法,如果他們真的必須是一個單一的數組。 – 2014-11-14 17:57:23

+1

你爲什麼這樣做?爲什麼不只是有其他類型的變量呢?這看起來很容易出錯,而且不可維護? – Degustaf 2014-11-14 19:17:30

+0

>你爲什麼這樣做? - 因爲陣列(在嵌入式系統中)與外部世界共享。外部系統可以訪問該數組,只能訪問該數組。數據是各種類型的。 – 2014-11-14 20:44:47

回答

2

你嘗試#2的問題是,你做一個數組的數組。

做這一點:

typedef union { 
    uint16_t u16;  // As uint16_t 
    int16_t s16;  // As int16_t 
    uint8_t u8[2]; // As uint8_t 
} ram_params_t; 
extern ram_params_t ram_params[NO_OF_WORDS]; 

ram_params_t ram_params[NO_OF_WORDS]; 

uval16 = ram_params[i].u16; 
sval16 = ram_params[i].s16; 
uval8_1 = ram_params[i].u8[0]; 
uval8_2 = ram_params[i].u8[1]; 

或者你這樣做:

typedef union { 
    uint16_t u16[NO_OF_WORDS];  // As uint16_t 
    int16_t s16[NO_OF_WORDS];  // As int16_t 
    uint8_t u8[2 * NO_OF_WORDS]; // As uint8_t 
} ram_params_t; 
extern ram_params_t ram_params; 

ram_params_t ram_params; 

uval16 = ram_params.u16[i]; 
sval16 = ram_params.s16[i]; 
uval8_1 = ram_params.u8[2*i]; 
uval8_2 = ram_params.u8[2*i+1]; 

我看不出有什麼毛病你嘗試#1無論是。我想我可能會這樣做,而不是使用工會。

+0

>我沒有看到你的嘗試#1有什麼問題 - 直到今天,我沒有發現任何錯誤,當其中一個指針的值發生改變時,就會破壞數組中的數據。指針在啓動時被設置一次。我如何確定它在運行一年後仍能正確設置而不需要重置?這只是不可靠的。我想,我必須定期檢查它的價值。 – 2014-11-14 21:02:33

+1

你的指針被破壞是一個標誌,說明程序中的其他內容是錯誤的,並且正在破壞內存。我實際上會建議你重試#1並調試你的程序,否則你可能最終會遇到不同的神祕故障。 – JS1 2014-11-14 21:05:05

+0

>你的指針被破壞是一個跡象,表明你的程序中有其他東西是錯誤的,並且正在破壞內存。 - 是的,一點沒錯!我找到並修復了它。但這是對依靠指針的危險的警醒。 – 2014-11-14 21:05:43

1

其他類型的數組元素必須爲uint16_t所以只投他們的大小相同。在8位數據的情況下,高8位可能是不確定的,所以我將它們掩蓋起來。

#include <stdio.h> 

#define uint16_t unsigned short 
#define int16_t  short 
#define uint8_t  unsigned char 

int main() { 
    uint16_t n; 

    // convert uint16_t to int16_t 
    n = 0xFFFF; 
    printf ("%d\n", (int16_t)n); 

    // convert uint16_t to uint8_t 
    n = 168; 
    printf ("%c\n", (uint8_t)(n & 0xFF)); 

    return 0; 
} 

計劃輸出

-1 
¿ 
相關問題