2014-01-20 23 views
1

我需要初始化相當大(超過44K)文本的字符串,然後從中讀取5個符號子串的序列。 Haxe編譯器會拋出類似「堆棧溢出,過於複雜的源代碼」的編譯錯誤,如果我將其作爲靜態字符串變量的初始化。haxe cpp - 如何將大型文本或二進制資源嵌入代碼?

我正在使用cpp haxe環境,所以我不能依賴漂亮的Assets類的openfl框架。我真的不想搞亂運行時文件系統操作。

是否可以將一些外部文件作爲數據源(字符串或可能是字節)包含到項目中並獲得對這些數據的簡單訪問?

回答

3

這似乎不是Haxe的問題,而是visual studio的cpp編譯器 的問題。

我只是想產生50000個字符,並以CPP打印出來,我得到這個錯誤:「錯誤C2026:字符串太大,尾隨字符截斷」 http://msdn.microsoft.com/en-us/library/dddywwsc.aspx

然後我試圖編譯它ネ它沒有問題的工作。

解決這個問題是在分裂較小的字符串更長的字符串和連接他們像「一塊1」 +「片2」 + ...

編輯:我目前無法測試,但我有人告訴我,每個編譯器都有類似的限制

+0

如果我將長字符串分成短字符串(〜700行)並對其進行總結,則不會發生任何反應。編譯器引發相同的錯誤。我將嘗試通過'if(str == null)str + =「...」'序列初始化第一個調用構造函數中的字符串,但它看起來像解決方法。我的想法是使用私有的靜態預初始化變量,或者可能是對這些數據的外部引用。 – meps

+0

看來,字符串的最大長度取決於編碼,嘗試使用最多2000個字符的字符串,我在這個例子中做了它,它爲我編譯罰款https://gist.github.com/lordkryss/bcdb9c3d676a334b19a3 – npretto

+0

我再次檢查過。短字符串彙總〜每行700行中有50個符號會導致編譯器崩潰。對於170行中每行〜200個符號的字符串彙總編譯良好。可能它取決於'+'運算符在初始化時計數而不是數據長度。 – meps

3

Haxe應該能夠處理它的源代碼中較大的字符串,所以如果遇到問題,我會嘗試在一個小的測試文件(除了跟蹤大字符串之外的代碼)中隔離問題,並在此編輯您的問題或在Github上創建問題。

另一件值得嘗試的事情是,如果您的示例編譯爲neko - 它與CPP非常相似,但有時會在一個目標上出現故障,但不會出現在另一個目標上。對於以低複雜度的方式管理靜態導入,您可以使用haxe.Resource(http://api.haxe.org/haxe/Resource.html),或者我有一個名爲「compiletime」的庫,它允許您編寫static var myBigString = CompileTime.readFile("myBigFile.txt"),並且宏將包含它全部編譯好的文件,就好像你直接把它輸入源代碼一樣。

+0

我的意思是不是在haXe的長串的問題但這些字符串的靜態初始化問題。使用Resource類是個好主意,它與我所尋找的完全一樣。 – meps

0

我也有這個問題。在某些情況下,資源 - 是不好的主意,因爲例如您將需要Windows/Linux的不同實現。

我有更好的解決方案。

你可以這樣做:

unsigned char openClCode[] = 
{0x23,0x64,0x65,0x66,0x69,0x6E,0x65,0x20,0x55,0x53, 
    0x23,0x64,0x65,0x66,0x69,0x6E,0x65,0x20,0x55,0x53, 
    ... 
}; 

我怎麼知道在這種情況下,你沒有限制。我只是試圖用代碼約500K。所以輸出頭文件,這個變量位於我有約3 Mb。

你可以製作一個小程序,將你的字符串轉換爲「char array's」的標題。我使用這個好方法來處理將我的OpenCL代碼保存到我的應用程序中,無需任何資源,也無需在我的OpenCL代碼所在位置添加任何附加文件。我只是在C++程序中使用C數組來將我的代碼保存到我的應用程序中。

所以在我的CL應用程序,我有這樣的:

__kernel void TestMul(__global const float* a, __global const float* b, __global float* c, int iNumElements) 
{ 

,在我的頭文件這個轉換是這樣的:

#pragma once 
namespace Scl 
{ 

const char g_clCode_ProgTestComonent[] = 
{ 
    0x5F, 0x5F, 0x6B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 
    0x20, 0x76, 0x6F, 0x69, 0x64, 0x20, 0x54, 0x65, 
    0x73, 0x74, 0x4D, 0x75, 0x6C, 0x28, 0x5F, 0x5F, 
    0x67, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x63, 
    0x6F, 0x6E, 0x73, 0x74, 0x20, 0x66, 0x6C, 0x6F, 
... 
}; 
} 
相關問題