C ++ std :: string to char для использования с OpenGL LoadBMP - PullRequest
0 голосов
/ 08 января 2011

У меня есть строковый массив

string name[1000];

и с

int counter;
counter = 0;

while(FindNextFile(fHandle, &wf))
{

 ... //some more code which is checking if its a folder

string theName = wf.cFileName;
if(theName.find(".bmp") != std::string::npos)
{
    name[counter] = theName;
    counter++;
}
}

Я добавляю каждый файл .bmp в массив имен.

Использование Учебное пособие NeHe Я добавляю текстуры в свои кубы, что работает очень хорошо.

Теперь мой настроенный код выглядит так:

int n; string imageFileString[1000]; char *imageFile[1000];
for(n=0; n<1000; n++)
{
    imageFileString[n] = name[n];
    imageFile[n] = new char[imageFileString[n].length()];
    strcpy(imageFile[n], imageFileString[n].c_str());

    if(TextureImage[n] = loadBMP(imageFile[n]))
    {
        ... // Some more Functions to set textures
    }
}

Все работает хорошо, только файлы BMP не загружены.

Если я добавлю

name[0] = "pic1.bmp";
name[1] = "pic2.bmp";
name[2] = "pic2.bmp";
name[3] = "pic2.bmp";

перед установкой int n; string imageFileString..., поэтому для цикла for(...) мои картинки загружаются без каких-либо изменений. Мое первое мнение заключалось в том, что массив имен не имеет записей, но я создал файл журнала с выводом

name[0] << endl << name[1] << endl << name[2] ...

и в моем лог-файле были одинаковые имена

pic1.bmp
pic2.bmp
pic3.bmp

так что я думаю, что есть какая-то другая ошибка при добавлении cFileName в мой массив.

Может кто-нибудь помочь мне, пожалуйста? Я не знаю, как это исправить, я имею в виду, я понятия не имею, что случилось ...

Ответы [ 4 ]

4 голосов
/ 08 января 2011
imageFile[n] = new char[imageFileString[n].length()];

Вы не учитываете нулевой терминатор.Добавьте один к длине:

imageFile[n] = new char[imageFileString[n].length() + 1];
3 голосов
/ 08 января 2011

Это не ответ, но было бы слишком сложно опубликовать комментарий.

Почему вы все это делаете?

int n; string imageFileString[1000]; char *imageFile[1000];
for(n=0; n<1000; n++)
{
    imageFileString[n] = name[n];
    imageFile[n] = new char[imageFileString[n].length()];
    strcpy(imageFile[n], imageFileString[n].c_str());

    if(TextureImage[n] = loadBMP(imageFile[n]))
    {
        ... // Some more Functions to set textures
    }
}

Когда вы могли бы просто сделать это?

int n;
for(n=0; n<1000; n++)
{
    if(TextureImage[n] = loadBMP(name[n].c_str()))
    {
        ... // Some more Functions to set textures
    }
}
1 голос
/ 08 января 2011

Поскольку вы сказали, что все работает нормально, когда вы делаете name[0] = "pic1.bmp" и т. Д., Вам нужно распечатать / отладить string theName = wf.cFileName;Я предполагаю, что это проблема пути.Вероятно, wf.cFileName возвращает путь к файлу, который вы не ожидали.

Например, держу пари, он возвращает что-то вроде \MyData\Bitmaps\pic1.bmp, когда вы ожидаете только pic1.bmp

Обновление

Учитывая все другие замечательные измененияВы также можете сократить его еще больше и сделать это

int counter = 0;

while (FindNextFile(fHandle, &wf))
{
    if (strstr(wf.cFileName, ".bmp") != 0)
    {
          if(TextureImage[counter] = loadBMP(wf.cFileName)
          {
             ... // Some more Functions to set textures
             counter++
          }
    }
}

Нет никаких причин выделять больше памяти только для проверки наличия строки (".bmp").Также обратите внимание, что я не обновляю счетчик до тех пор, пока загрузка не будет успешной.

Вам действительно следует переключить TextureImage на std::vector, тогда вам не нужно будет делать какие-либо подсчеты.Проверьте, передаете ли вы wf.cFileName непосредственно в loadBMP, если что-то работает.И я понимаю, что это может привести к переполнению из-за TextureImage[] и счетчика, поэтому я предлагаю переключиться на std::vector.Мы не видим, как он выделяет TextureImage[], если он похож на все остальное с магическим числом 1000.

Также имейте в виду, что .cFileName определяется как TCHAR [], который может содержать значения Unicode,

0 голосов
/ 08 января 2011

Хорошо, я сам нашел проблему,

Обновление, исправленная версия (WinMain):

void ScanTheDirectory()
{
    // this function is scanning the directory and is adding
    // each bmp file to the string array "name"
}

int initGL()
{
    // this function calls the loadTextures() function
}

int loadTextures()
{
    // this function is loading all files of the string array "name"
    // converts them to a const char * and is adding them to the "textures" GLuint (array)
}

int WINAPI WinMain()
{
    // this function is the main window which is showing the
    // qubes (GL_QUBES)

    ScanTheDirectory();
    initGL();
}

Проблема была в WinMain (), потому что это выглядело так:

initGL();
ScanTheDirectory();

Если он сначала вызывает initGL (), поэтому он создает текстуры, и поскольку массив имен пуст, текстуры не добавляются в мой массив текстур.

После изменения на

ScanTheDirectory();
initGL();

Теперь он сначала вызывает ScanTheDirectory () void, поэтому мой массив имен заполнен именами файлов изображений BMP. Теперь он может вызывать initGL, и это создает текстуры из моих изображений.

Спасибо за помощь, теперь мой код выглядит немного яснее: D

Ahmet

...