为什么glGetString(GL_EXTENSIONS)的搜索不能正常工作?

时间:2011-06-07 12:16:03

标签: c++ opengl

我读了这个页面: http://www.opengl.org/wiki/GlGetString

  

例如,如果是扩展名   GL_EXT_pixel_transform_color_table是   列出,做一个简单的搜索   GL_EXT_pixel_transform将返回一个   无论是否定义都是肯定的。

由于空间分隔,这怎么可能?你为什么不在你正在搜索的关键词之后放一个空格?

例如:

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

我想知道为什么这不起作用,因为对我来说它确实有用。

3 个答案:

答案 0 :(得分:4)

您可以使用space作为分隔符来标记返回的字符串,以便更可靠地搜索(如果您不想使用较新的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
}

答案 1 :(得分:3)

如果您要查找的扩展程序列在最后,该怎么办?然后不会有空白。

答案 2 :(得分:1)

我知道这是一个老问题,但也许其他人会觉得它很有用。如果您不想使用任何标记化库/类,则此函数会扫描字符串以查找确切的子字符串(没有提到的问题)。此外,它几乎不使用任何额外的内存(不复制字符串数据):

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
}