вектор массива символов - PullRequest
1 голос
/ 04 июня 2010

У меня есть следующий код:

static unsigned char S0_gif[] = {
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x0f, 0x00, 0x0f, 0x00, 0x91, 0x02,
..
};

Это шестнадцатеричное представление gif-файла. У меня есть 500 картинок, которые мне нужно хранить таким образом, поэтому я хочу использовать вектор для облегчения доступа.

Что-то вроде:

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

Then in the loop:
{
MakeImage(gif[i], sizeof gif[i] );
}

Я не могу найти правильный код для этого. Любая помощь будет принята с благодарностью.

1011 * Petry *

Ответы [ 3 ]

2 голосов
/ 04 июня 2010

Вы не можете сделать это, потому что векторы хранят структуры постоянного размера, а ваши имеют переменный размер. Однако вы можете сохранить вектор vector:)

vector<vector<char> > gifs; // note the neccessary space between > >
gif.push_back( vector<char>( S0_gif, S0_gif + sizeof(S0_gif) )  );

Then in the loop:
{
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] );
}

Отказ от ответственности: Возможно, я забыл некоторые &, не стесняйтесь меня поправлять.

0 голосов
/ 04 июня 2010

Я считаю, что лучшим решением является создание файла C / CPP, который объявляет вектор изображений. Все остальное означает написание кода, который обычно не рекомендуется для большой инициализации (мое мнение).

unsigned char *Array[]={
S0_gif,
S1_gif,
S2_gif,
S3_gif,
...
};

Код для его генерации может быть легко написан на языке сценариев (bash, perl, python и т. Д.). Должно быть что-то вроде этого:

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

Это решение вашего вопроса?

0 голосов
/ 04 июня 2010

Похоже, вы храните все 500 файлов GIF подряд. Вы не можете определить размер каждого без разбора его заголовка. Если ваша функция MakeImage может анализировать заголовок GIF, вы можете вернуть указатель на следующее изображение.

Тогда цикл будет выглядеть так:

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