Почему поиск из glGetString (GL_EXTENSIONS) не будет работать правильно? - PullRequest
3 голосов
/ 07 июня 2011

Я прочитал эту страницу: http://www.opengl.org/wiki/GlGetString

Например, если расширение GL_EXT_pixel_transform_color_table is в списке, делая простой поиск GL_EXT_pixel_transform вернет положительный, определен ли он или нет.

Как это возможно, поскольку его пространство разделено? Почему вы не ставите пробел после ключевого слова, которое вы ищете?

Например:

char *exts = (char *)glGetString(GL_EXTENSIONS);
if(!strstr(exts, "GL_EXT_pixel_transform ")){ // notice the space!
    // not supported
}

Я хотел бы знать, почему это не работает, потому что для меня это работает.

Ответы [ 3 ]

4 голосов
/ 07 июня 2011

Вы можете маркировать возвращаемую строку, используя пробел в качестве разделителя для более надежного поиска (если вы не хотите использовать более новый API). Например. с Boost.Tokenizer :

typedef boost::tokenizer< boost::char_separator<char> > tokenizer;

boost::char_separator<char> sep(" ");
tokenizer tok(static_cast<const char*>(glGetString(GL_EXTENSIONS)), sep);

if (std::find(tok.begin(), tok.end(), "GL_EXT_pixel_transform") != tok.end()) {
    // extension found
}
3 голосов
/ 07 июня 2011

Что, если расширение, которое вы ищете, указано в списке последним?Тогда за ним не последует пробел.

1 голос
/ 11 января 2014

Я знаю, что это старый вопрос, но, возможно, кто-то найдет его полезным.В случае, если вы не хотите использовать какую-либо токенизирующую библиотеку / класс, здесь есть функция, которая сканирует строку для точной подстроки (без упомянутой проблемы).Кроме того, он почти не использует дополнительную память (строковые данные не копируются):

bool strstrexact(const char *str, const char *substr, const char *delim, const bool isRecursiveCall = 0)
{
    static int substrLen;

    if (!isRecursiveCall)
        substrLen = strlen(substr);

    if (substrLen <= 0)
        return FALSE;

    const char *occurence = strstr(str, substr);

    if (occurence == NULL)
        return FALSE;

    occurence += substrLen;

    if (*occurence == '\0')
        return TRUE;

    const char *nextDelim;
    nextDelim = strstr(occurence, delim);

    if (nextDelim == NULL)
        return FALSE;

    if (nextDelim == occurence)
        return TRUE;

    return strstrexact(nextDelim, substr, delim, TRUE);
}

Возвращает TRUE, если подстрока была найдена, или FALSE, если ее не было.В моем случае Вот как я это использовал:

if (strstrexact((const char*) glGetString(GL_EXTENSIONS), "WGL_ARB_pixel_format", " ")) {
    // extension is available
} else {
    // extension isn't available
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...