2014-04-22 62 views
1

我一直在爲Pebble開發軟件。這是我第一次與C一起工作,而我正在努力讓我的頭腦在如何管理程序中的信息/數據。 我習慣於能夠擁有數千個條目的多維數組。隨着卵石,我們非常有限。在空間有限的情況下有效存儲信息的不同方式

我可以談談我的計劃的要求,但很高興看到有關該主題的任何形式的討論。

我正在構建的應用程序需要在每次按下按鈕時存儲正在運行的數據源。理想情況下,我想在每次按下時存儲一個二進制值和兩個小整數值。我想利用Pebble上的本地存儲,每個陣列限制爲256字節,這是一個挑戰。

我曾想過使用自定義結構 - 並有多個這些數組,並確保檢查每個數組不超過256字節標記。它看起來很雜亂,管理起來很複雜......我是否錯過了一些基本上簡單的東西,還是它需要變得複雜?

目前我的程序只存儲二進制值,我根本沒有打擾小整數值。

+0

您希望存儲的小整數的範圍是什麼?例如,0-65535,0-255,較小? –

+2

你想要打包你的數據越緊密,它會變得越來越混亂和複雜。這是數據表示中空間與複雜性/時間之間的折衷。最簡單的非常緊湊的打包方案是對每種類型的數據項使用最小數量的比特。例如,如果數據項可以取3個值,則只需要兩位。如果你有另一個只需要5位的值,你可以把它們都打包成一個字節。有可能比這更緊張,但它也變得更加混亂。 :) – lurker

+2

如果數組大小有限,則可以使用包含每個數組的256個字節的數組和指向下一個結構的指針的鏈接列表。 – michaelmeyer

回答

2

也許你可以定義如下結構:

#pragma pack(1) 
typedef struct STREAM_RECORD_S 
    { 
    unsigned short uint16;  // The uint16 field will store a number from 0-65535 
    unsigned short uint15 : 15; // The uint15 field will store a number from 0-32767 
    unsigned short binary : 1; // The binary field will store a number from 0-1 
    } STREAM_RECORD_T; 

typedef struct STREAM_BLOCK_S 
    { 
    struct STREAM_BLOCK_S *nextBlock; // Store a pointer to the next block. 
    STREAM_RECORD_T  records[1]; // Array of records for this block. 
    } STREAM_BLOCK_T; 
#pragma pack(0); 

數組中記錄的實際數量將取決於nextBlock指針的大小。例如,如果您使用32位尋址運行,則nextBlock大小可能爲4個字節;它將是2個字節的16位尋址,或8個字節的64位尋址。 (我不知道ARM Cortex-M3處理器的指針大小)。

因此,recordsPerArray =(256 - sizeof(nextBlock))/ sizeof(STREAM_RECORD_T);

+0

感謝你們,我會試着瞭解這裏發生的事情。我對C很新,指針是讓我頭痛的東西,最讓我感到悲傷的是什麼。 – cstrat

相關問題