Показать вывод glGetString в поле сообщения [дубликат]

Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.

Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.

41
задан AutoBotAM 7 November 2011 в 04:11
поделиться

6 ответов

Используйте массив std::wstring вместо массива переменной длины C99. Текущий стандарт гарантирует непрерывный буфер для std::basic_string. Например,

std::wstring wc( cSize, L'#' );
mbstowcs( &wc[0], c, cSize );

C ++ не поддерживает массивы переменной длины C99, поэтому, если вы скомпилировали свой код как чистый C ++, он даже не компилируется.

Сменив эту функцию

Не забудьте установить соответствующий язык в main.

Например, setlocale( LC_ALL, "" ).

Cheers & amp; HTH.,

29
ответ дан Leushenko 31 August 2018 в 11:15
поделиться

В вашем примере wc - это локальная переменная, которая будет освобождена при завершении вызова функции. Это ставит вас в неопределенную область поведения.

Простое исправление:

const wchar_t *GetWC(const char *c)
{
    const size_t cSize = strlen(c)+1;
    wchar_t* wc = new wchar_t[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
}

Обратите внимание, что вызывающий код должен будет освободить эту память, иначе у вас будет память протечь.

34
ответ дан Andrew Shepherd 31 August 2018 в 11:15
поделиться

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

Следуйте этому Золотому правилу: «Если вы используете указатели на голые символы, вы делаете это неправильно. (За исключением случаев, когда вы этого не делаете.)«

I 've ранее опубликовал некоторый код для преобразования и передачи информации и ввода в объекты C ++ std::string и std::wstring.

1
ответ дан Community 31 August 2018 в 11:15
поделиться

Я сделал что-то вроде этого. Первые 2 нули - это потому, что я не знаю, какие вещи типа ascii эта команда хочет от меня. Общее чувство, которое у меня было, - создать массив temp char. пройти в широком массиве символов. бум. оно работает. +1 гарантирует, что нулевой завершающий символ находится в нужном месте.

char tempFilePath[MAX_PATH] = "I want to convert this to wide chars";

int len = strlen(tempFilePath);

// Converts the path to wide characters
    int needed = MultiByteToWideChar(0, 0, tempFilePath, len + 1, strDestPath, len + 1);
0
ответ дан Gandalf458 31 August 2018 в 11:15
поделиться

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

Чтобы исправить это, вы можете передать размер буфера на GetWC, но тогда у вас есть тот же интерфейс, что и mbstowcs. Или вы могли бы выделить новый буфер внутри GetWC и вернуть указатель на него, оставив его вызывающему, чтобы освободить буфер.

2
ответ дан Greg Hewgill 31 August 2018 в 11:15
поделиться
const char* text_char = "example of mbstowcs";
size_t length = strlen(text_char );

Пример использования «mbstowcs»

std::wstring text_wchar(length, L'#');

//#pragma warning (disable : 4996)
// Or add to the preprocessor: _CRT_SECURE_NO_WARNINGS
mbstowcs(&text_wchar[0], text_char , length);

Пример использования «mbstowcs_s»

Microsoft предложите использовать «mbstowcs_s» вместо «mbstowcs».

Ссылки:

Пример Mbstowcs

mbstowcs_s, _mbstowcs_s_l

wchar_t text_wchar[30];

mbstowcs_s(&length, text_wchar, text_char, length);
4
ответ дан Maks 31 August 2018 в 11:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: