haxe cpp - 如何将大型文本或二进制资源嵌入到代码中?

时间:2014-01-20 20:03:11

标签: resources binary embed haxe assets

我需要用相当大(超过44K)的文本初始化字符串,然后从中读取5个符号子串的序列。 Haxe编译器抛出编译错误,如“堆栈溢出,太复杂的源”,如果我这样做作为静态字符串变量的初始化。

我正在使用cpp haxe环境,所以我不能依赖于好的Assets类的openfl框架。而且我真的不想搞乱运行时文件系统操作。

是否可以将一些外部文件作为数据源(字符串或可能是字节)包含在项目中并轻松访问此数据?

3 个答案:

答案 0 :(得分:4)

这似乎不是Haxe的问题,但是视觉工作室的cpp编译器存在问题。

我刚刚尝试生成50000个字符并在cpp中打印,我收到此错误:“错误C2026:字符串太大,尾随字符被截断”http://msdn.microsoft.com/en-us/library/dddywwsc.aspx

然后我尝试将它编译成neko,它没有问题。

解决这个问题的方法是将较长的字符串拆分成较小的字符串并将它们连接起来,如“第1部分”+“第2部分”+ ...

编辑:我目前无法测试它,但我被告知每个编译器都存在类似的限制

答案 1 :(得分:3)

Haxe应该能够处理其源代码中较大的字符串,因此如果您遇到问题,我会尝试在小型测试文件中隔离问题(除了说跟踪大字符串),并在这里编辑你的问题或在Github上创建一个问题。

另一件值得尝试的事情是,如果您的示例编译为neko - 它与CPP的目标非常相似,但有时会出现一个故障,但不会出现在另一个目标上。

至于以低复杂度的方式管理静态导入,你可以使用haxe.Resource(http://api.haxe.org/haxe/Resource.html),或者我有一个名为" compiletime"它允许你编写static var myBigString = CompileTime.readFile("myBigFile.txt"),宏将把它全部包含在编译文件中,就像你直接在源代码中输入它一样。

答案 2 :(得分: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""。我使用这种好的方法,例如将我的OpenCL代码保存到我的应用程序,没有任何资源,也没有我的OpenCL代码所在的任何附加文件。我只是在C ++程序中使用C-arrays将我的代码保存到我的应用程序中。

所以在我的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, 
...
};
}