Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符数组向量_C++_Arrays_Vector_Char - Fatal编程技术网

C++ 字符数组向量

C++ 字符数组向量,c++,arrays,vector,char,C++,Arrays,Vector,Char,我有以下代码: static unsigned char S0_gif[] = { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x0f, 0x00, 0x0f, 0x00, 0x91, 0x02, .. }; 它是gif文件的十六进制表示。我有500个GIF,我需要像那样存储,所以我想使用一个向量,使它更容易访问 比如: vector<char[]> gifs; gif.push_back( {0x47, 0x49,..} ); Then in t

我有以下代码:

static unsigned char S0_gif[] = {
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x0f, 0x00, 0x0f, 0x00, 0x91, 0x02,
..
};
它是gif文件的十六进制表示。我有500个GIF,我需要像那样存储,所以我想使用一个向量,使它更容易访问

比如:

vector<char[]> gifs; 
gif.push_back( {0x47, 0x49,..} );

Then in the loop:
{
MakeImage(gif[i], sizeof gif[i] );
}
vectorgifs;
gif.push_back({0x47,0x49,…});
然后在循环中:
{
MakeImage(gif[i],gif[i]的大小);
}
我找不到正确的代码。任何帮助都将不胜感激


Petry

看起来您正在连续存储所有500个GIF文件。若不分析每个文件的标题,则无法检测其大小。如果您的函数
MakeImage
能够解析GIF头,那么您可以从中返回指向下一个图像的指针

然后,循环将如下所示:

char* img_ptr = S0_gif;
while ( img_ptr ) img_ptr = MakeImage( img_ptr );

你不能这样做,因为向量存储的是固定大小的结构,而你的是可变大小的结构。但是,您可以做的是存储向量:)

向量gifs;//注意>> gif.push_back(向量(S0_gif,S0_gif+sizeof(S0_gif)); 然后在循环中: { MakeImage(gifs[i]); } 另一个想法是,如果它们确实存储为静态变量,则不要将数据存储两次:

vector< unsigned char * > gifs; 
vector< size_t > gifsizes; 
gifs.push_back( S0_gif );
gifsizes.push_back( sizeof(S0_gif) );

Then in the loop:
{
MakeImage( gifs[i], gifsizes[i] );
}
vectorgifs;
向量<大小>大小;
gifs.推回(S0\u gif);
gifsizes.push_back(sizeof(S0_gif));
然后在循环中:
{
MakeImage(gifs[i],gifsizes[i]);
}

免责声明:我可能忘记了一些
&
,请随意更正。

我认为最好的解决方案是生成一个声明图像向量的C/CPP文件。其余的一切都意味着编写代码,这通常不推荐用于很多初始化(我的意见)

生成此代码的代码可以用脚本语言(bash、perl、python等)轻松编写。应该是这样的:

print "char *Array[]={"
for i in range(0,500)
   print "S"+i+"_gif"
print "};"

这是您问题的解决方案吗?

事实上,我想避免存储数据两次,所以我尝试了您的第二个想法,但我得到了MSVC2008编译错误:错误C2664:“std::vector::push_back”:无法将参数1从“unsigned char()[819]”转换为带有[\u Ty=const char*”的“const char*const&”原因:无法从“unsigned char()[819]”转换为指向的“const char*const”类型是不相关的;转换需要reinterpret_cast、C风格cast或函数风格cast问题是我需要将图像存储在可执行文件中。我有C++代码,将二进制文件转换成char数组。使用C++代码将二进制转换成数组,可以创建S0YGIF、S1GIF等。然后,使用该小脚本创建一个C/C++数组,该数组包含表示为无符号字符数组的所有图像。这不是你想要的吗?[当然,在创建CPP文件后,您只需将其添加到编译过程中,这意味着它将在最终可执行文件中]确切地说,我需要一个数组,该数组将包含表示为无符号字符数组的所有图像。我尝试使用您的第一段代码,但出现以下编译错误:错误C2440:“初始化”:无法从“unsigned char[819]”转换为“char*”,我的代码是char*;使用unsigned char*(我现在修改了我的帖子),就像它编译得很好,但图像根本没有解码一样。当我只使用MakeImage(S0_gif,sizeof S0_gif)时,它工作得很好
当我使用MakeImage(数组[0],数组[0]的大小)时,它不会。
unsigned char *Array[]={
S0_gif,
S1_gif,
S2_gif,
S3_gif,
...
};
print "char *Array[]={"
for i in range(0,500)
   print "S"+i+"_gif"
print "};"