2015-11-24 5 views
1

Итак, после публикации this question Я попытался использовать решения, предоставленные в связанных вопросах (в частности, this), которые были указаны сообществом, но у меня была другая проблема.c - функция _setmode, вызывающая ошибку отладки

При попытке использовать функцию _setmode(), чтобы изменить консоль Windows для печати символов UTF, я получаю ошибку отладки, точно так же, как и сообщение, размещенное на this other question. Ошибка отладки выглядит следующим образом:

  • Текст:

    Debug Assertion Failed!

    Программа: ... Коут-Desktop_Qt_5_5_0_MSVC2013_64bit-Debug \ Debug \ Breakout.exe Файл: F: \ дд \ vctools \ элт \ crtw32 \ STDIO \ output.c Line: 1033

    Expression: ((_Stream -> _ флаг & _IOSTRG) || (п = _fileno (_Stream), ( (_textmode_safe (п) == _IOINFO_TM_ANSI) & & _tm_unicode_safe (п)))!)

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

    (Нажмите Retry для отладки приложения)

  • Скриншот:

Debug Assert Failed

Без функции _setmode() Я до сих пор не может печатать символы из верхней таблицы ASCII, как эти : «┌──┐». Что я могу сделать для решения этой проблемы? Решение вопроса с той же проблемой также не работает.

Опять же, я использую Qt Creator для Windows, с Qt версии 5.5.0 MSVC 64 бит. Компилятор - это Microsoft Visual C++ Compiler 12.0 (amd64).

  • Edit:

Вот небольшой пример кода, который вызывает ошибку:

#include <stdio.h> 

#include <io.h> 
#include <fcntl.h> 

int main(void) 
{ 
    //Using setmode to force the error 
    _setmode(_fileno(stdout), _O_U16TEXT); 

    printf("Hello World!\n"); 
    return 0; 
} 

После выполнения появляется ошибка.

+0

Не публикуйте только скриншоты! Опубликовать текст. – Olaf

+0

Отредактировано для добавления сообщения об ошибке;) – JefersonFG

+0

Возможно, вы можете опубликовать минимальную, полную программу, которая показывает проблему? –

ответ

0

Кажется, что если вы установите режим вывода на UTF-16, вы должны использовать wprintf вместо printf.

(Предположительно, поскольку вы сказали, что время выполнения переводится с UTF-16, вы должны предоставить UTF-16.)

Этот код работает на моей машине:

#include <fcntl.h> 
#include <io.h> 
#include <stdio.h> 

int main(void) { 
    _setmode(_fileno(stdout), _O_U16TEXT); 
    wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n"); 
    return 0; 
} 

Так же

wprintf(L"Hello world!\n"); 

PS - Я не уверен, будет ли это решить основную проблему, которую я подозреваю, должен делать с кодировкой исходного файла. Даже если использование UTF-16 делает, решите вашу проблему, это, вероятно, не лучшее решение.

+0

Это не работает, так как программа выводит ошибку независимо от того, что на ней происходит. Я пробовал искать кодировку, но не добился какого-либо прогресса, я просто прикрутил представление некоторых файлов в среде IDE. – JefersonFG

+0

Можете ли вы попробовать код, который я только что добавил в свой ответ? Он отлично работает для меня, но, конечно, мой шрифт не содержит кириллических символов, поэтому я просто получаю вопросительные знаки. (Но похоже, что ваша оригинальная проблема была решена, по другому вопросу?) –

+0

Это не сработало. Как я уже сказал, независимо от того, что еще происходит в коде, эта строка вызывает ошибку. Я принял ответ на другой вопрос, потому что это имеет смысл как источник проблемы, но тем не менее это не решило. Думаю, я вернусь к обходному пути. – JefersonFG

Смежные вопросы