2016-06-09 20 views
0

我正在嘗試爲我的Xilinx Zynq SoC(ARM Cortex)創建查找表。在編譯時使用C++創建CSV矢量

我有一個CSV文件,其中1330個條目,我不能在運行時讀取或解析。最新的我可以做的是在編譯時。我已經讀過,可以將文件嵌入到可執行文件中,以便在運行時使用它。

換句話說,我想在運行時讀取和解析CSV文件,而原始文件實際上並不在任何文件系統上,因爲它是嵌入式設備。所以我需要以某種方式將CSV文件嵌入到可執行文件中。我將如何實現這樣的事情?

CSV文件看起來像這樣(完整文件是here);

0,0,48,112,160,208,272,320,368,....,65440,65488 
+0

請出示csv樣本以及您如何使用它。 – teivaz

+0

@teivaz我添加了一個鏈接到csv。我需要找出一種方法來獲取數組中的所有值,並讓它們在運行時可用。 – Ortix92

+3

有沒有理由不能將它作爲數組編譯到代碼中? – Soren

回答

2

你問了vector,但我不知道爲什麼你一定希望這樣。數據將不可避免地佔用應用程序的只讀空間(「.text」或「.rodata」或類似內容)部分,並且在必要時可將其轉換爲vector(這將消耗堆空間並需要運行時構建並從只讀的.text/.rodata節中的數據進行初始化),您不妨將它用作POD array,因爲我懷疑您會在運行時更改數據。因此,要創造你可能只是做這樣的事情的數據const POD陣列....

const int myArray[] = 
{ 
    #include "myCsvFile.csv" 
}; 

如果元素的數目是不固定的,你的程序可確定與sizeof(myArray)/sizeof(myArray[0])數量。即使它是一個固定的大小,這種技術可能是最好的反正。當然,如果你的所有條目都是無符號的,並且可以在16位內進行(粗略的檢查建議如此),而不是將其定義爲int的數組,則可以將其定義爲unsigned shortuint16_t的數組以節省空間。

我還應該提一下const這個關鍵字在這裏很重要:沒有這個的話,你的數組將佔用兩倍的內存:第一,它將佔用只讀區域(.text或.rodata或其他)的空間,並且在應用程序初始化期間,運行時將在讀/寫數據部分(.data可能)中創建只讀數據的可讀/可寫副本,其中分配了myArray。爲了避免出現這種情況,請將其定義爲const,然後myArray的地址將位於只讀部分,並且不會被複制到讀/寫數據部分。

1

隨着數據是無符號整數的普通數組,你可以使用預編譯

假設您CSV文件中data.csv文件。

然後,只需在cpp文件可以如下:

const unsigned int k_Data[] = { 
#include "data.csv" // << Preprocessor will replace this line with the contents of data.csv 
}; 

#include <iostream> 

int main() 
{ 
    std::cout << k_Data[3]; 
} 
1

對於你有特定類型的CSV數據,例如

0,0,48,112,160,208,272,320,368,432,480,512,576,640,704,752,800,848,896,...... 

它基本上只是一堆數字,你應該能夠使用實際#include語句,所以包括他們。

const unsigned short myCSV[] ={ 
#include "./theCSV.data" 
}; 

進出口使用unsigned short以來的最大數量看起來像64K,它會爲你節省一些空間 - 但你可能想使用int相反,如果你beleive數量可以大於64K