2014-01-20 22 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, 
... 
}; 
} 
相关问题