Вывод SDL Console работает при отладке, но не при запуске с exe

Я пишу экспериментальную сетевую программу, в основном тестовую программу для изучения сетей. Я использую SDL и SDL_net в Code :: Blocks с mingw, поэтому вывод консоли направлялся в stdout.txt. Я искал вокруг и обнаружил, что вы можете исправить это, в том числе после SDL_Init ():

freopen("CON", "w", stdout); //stops redirect of output
freopen("CON", "w", stderr); //and errors...

Это работало отлично, но только при сборке и запуске программы в IDE: при запуске вне среды IDE (например, двойной щелчок по программе) программа работает правильно, за исключением вывода на консоль, который по-прежнему пуст. Так как программа должна быть консольной, это серьезная проблема … Я не хочу всегда запускать программу в IDE, чтобы использовать ее.

Любое решение ценится, но я бы предпочел, чтобы это было изменение кода, хотя в крайнем случае подойдет командный файл (я прочитал пару постов, где это единственное, что работает, но они не пошли в деталях, поэтому я не могу воспроизвести его). Благодарю.

3

Решение

Вы смотрели на FAQ по консоли SDL?

Они предоставляют много предложений, в том числе:

Первая попытка

freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );

Если это не работает (как в вашем случае), попробуйте

#include <fstream>
#include <iostream>
using namespace std;
....
ofstream ctt("CON");
freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );
...
ctt.close();

ИЛИ ЖЕ

FILE * ctt = fopen("CON", "w" );
freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );
...
ctt.close();

Другой вариант — перекомпилировать SDLmain библиотека или добавить SDLmain код для вашего проекта и прекратить ссылки на библиотеку.

0

Другие решения

SDL 2.0 отключает консоль по умолчанию, точнее, не включает ее.
С момента компиляции с -mwindows отключает консоль, stdout ни на что не указывает. SDL_Log немного интереснее и может найти консоль с помощью Windows API, но не может захватить стандартный ввод, потому что cmd.exe украл :(.

SDL не требует консоли по разным причинам, скорее всего потому, что программа была скомпилирована с -mwindows, Определение WinMain как точка входа может также сделать cmd.exe вернуть консоль. Из того, что я прочитал SDL_main может перенаправить стандартный вывод и стандартный вывод.

Вы могли бы сойти с рук #undefв основном и / или

  • вызов AllocConsole(); после SDL_init(...);
  • использование freopen("CON", stdout)
  • компилировать без -mwindows (#undef«ИНГ main кажется, не имеет никакого эффекта)

но вы должны просто перенаправить стандартный вывод, например, на кот, с main | cat (Всегда следуйте правилу «Не #undef главное если не надо «).

Захватить stdout для MinGW, просто перенаправьте вашу программу на cat: main | cat, Это хак, который просто гарантирует, что stdout и stderr ни на что не указывают.
Чтобы захватить оба stdin а также stdout, без компиляции -mwindows создайте консольное приложение Windows. Это откроет новое окно при необходимости.

Примечание: особенно важно сбрасывать вывод при использовании одного из вышеуказанных методов. В любом случае полагаться на буферизацию строки — это плохая практика.

2

(Я не мог опубликовать это вчера, потому что у меня не было достаточно репутации)

Хорошо, немного поэкспериментировал со строками командного файла. Мой полученный и (почти) рабочий пакетный файл:

program.exe

Не понимал, что это будет так просто, но все еще не могу понять, почему двойной щелчок по программе не работает. Я сказал, что почти работает, потому что после подключения клиента к серверу консоль отключается, поэтому проблема остается. Так что я все равно буду признателен за любую помощь в решении этой проблемы.

(Конец вчерашнего предполагаемого поста)

(Начало сегодняшнего ответа)

Я попробовал предложения Emartel, но это все равно не сработало. Провел некоторое тестирование и обнаружил, что бесконечный цикл печати пустой строки вызывал проблему пустого экрана после подключения клиента. Исправлен цикл, и теперь он работает правильно, хотя мне все еще нужно использовать пакетный скрипт.

Был бы признателен, если бы кто-нибудь когда-нибудь выяснил, почему двойной щелчок не работает.

1

Две причины:

  • С SDL консоль отключена. SDL использует окна, а не консоли.

  • SDL перенаправляет стандартный вывод (cout и printf ()) в файл с именем stdout.txt в той же папке, где находится каталог * .exe.

Ты можешь использовать:

std::cout << "Hello World";

И сообщение будет храниться в файле stdout.txt.

0
По вопросам рекламы [email protected]