- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
出于调试原因,我希望能够在我的 GUI 应用程序的控制台中使用 printf
。我只希望控制台在调试构建目标中可见,而不是在发布构建目标中可见。为此,我右键单击工作区中的项目,选择属性...,然后在构建目标选项卡中,我选择控制台应用程序类型并选中执行结束时暂停框。完成此操作后,控制台和 GUI 窗口可以正常打开,但是当我使用 printf
时什么也没有发生。如何在带有控制台的 GUI 应用程序中使用 printf
?
这是我正在使用的代码的相关部分:
SDL_Init(SDL_INIT_VIDEO);
putenv("SDL_VIDEO_CENTERED=center");
SDL_WM_SetCaption("Railroad Builder",NULL);
SDL_WM_SetIcon(IMG_Load(strcat_const(parentFolder(exePath),"/icon.png")),NULL);
SDL_SetVideoMode(MAIN_WINDOW_WIDTH,MAIN_WINDOW_HEIGHT,32,SDL_OPENGL);
int running = 1;
while(running){
printf("myVar = %d",myVar);
}
myVar
是一个 int
,出于调试原因,我想检查它的值。
这个问题和this不一样因为在另一个问题中,他们已经知道从IDE运行程序时如何在控制台中编写,而这道题是关于如何在控制台中编写的。
最佳答案
SDL 用它自己的入口点覆盖程序入口点。
更多详情 here , there和 over there .
默认情况下,标准输出 ( stdout, stdin and stderr ) 被重定向到文件,这些文件与它们保存的流的内容具有相同的名称。
它们应该在您的程序目录中。
1 - 重定向流
要绕过该行为,您必须在 SDL_Init 之后插入以下内容。 如果 add after 不起作用,请尝试将它们添加到 main 的最顶部。
freopen ("CON", "w", stdout);
freopen ("CON", "r", stdin);
freopen ("CON", "w", stderr);
如果还是不行试试。
// Start : edit
SDL_Init (...)
FILE * ctt = fopen("CON", "w" ); // c
// or
ofstream ctt("CON"); // c++
// End : edit
freopen ("CON", "w", stdout);
freopen ("CON", "r", stdin);
freopen ("CON", "w", stderr);
/* ... */
// Start : edit
fclose (ctt); // c
// or
ctt.close(); // c++
// End : edit
了解 CON here .
从我读到的内容来看,“CON”似乎可以用 NULL 代替。
(物有所值。)
freopen(NULL,"w",stdout);
freopen(NULL,"w",stdout);
freopen(NULL,"w",stderr);
freopen 方法的另一种变体。
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
关于 CONOUT$ 和 CONIN$ 的更多信息 here .
如果您在使用 GNU/Linux BSD、Solaris、Mac Os 等时遇到问题,请尝试以下操作。
freopen ("/dev/tty", "w", stdout);
freopen ("/dev/tty", "r", stdin);
freopen ("/dev/tty", "w", stderr);
应用该方法应该如下面的代码所示。
/* ... */
int main {
SDL_Init(SDL_INIT_VIDEO);
/* start : redirecting the streams to the console */
FILE * ctt = fopen("CON", "w" ); // Edit
freopen ("CON", "w", stdout);
freopen ("CON", "r", stdin);
freopen ("CON", "w", stderr);
/* end : redirecting the streams to the console */
/*start : your code */
putenv("SDL_VIDEO_CENTERED=center");
SDL_WM_SetCaption("Railroad Builder",NULL);
SDL_WM_SetIcon(IMG_Load(strcat_const(parentFolder(exePath),
"/icon.png")),NULL);
SDL_SetVideoMode(MAIN_WINDOW_WIDTH,MAIN_WINDOW_HEIGHT,32,
SDL_OPENGL);
int running = 1;
while(running){
printf("myVar = %d",myVar);
}
/* end : your code */
/* ... */
fclose (ctt); // Edit
/* ... */
}
您可以在 SDL faq 上找到该示例.
2 - 更改程序的入口点
您也可以取消定义 SDL 的 main,这样您的 main 将第一个被调用。
为此,请在 main 函数之前添加下一条指令。
/*...*/
#ifdef main
#undef main // Prevent SDL from overriding the program's entry point.
#endif
/***/
int main(int argc, char **argv){
/*...*/
}
或
/*...*/
#ifdef __MINGW32__ // It can be __MINGW64__. Chose according to your architecture.
#undef main // Prevent SDL from overriding the program's entry point.
#endif
//or
#if defined(__MINGW32__) || defined(__MINGW64__)
#undef main // Prevent SDL from overriding the program's entry point.
#endif
/*...*/
int main(int argc, char **argv){
/*...*/
}
3 - 重建 SDL
使用从 SDL 站点下载的预编译 SDLmain.dll 二进制文件,您无法阻止 stdout/stderr 被重定向到文本文件。您可以做的是使用 NO_STDIO_REDIRECT 编译器标志自行编译 SDLmain,或者根本不使用 SDLmain。
请注意,不使用 SDLmain 会破坏可移植性,因此不推荐使用。
也就是说,有时将 stdout.txt 和 stderr.txt 写入可执行文件所在的目录会更好。
你可以用一些小技巧来做到这一点:
#include "SDL/SDL.h"
#ifdef WIN32
#include "sdl_winmain.h"
#else
#include "SDL/SDL_main.h"
#endif
其中sdl_winmain.h在你自己的工程目录下,是SDL源码包中src/main/SDL_win32_main.c的重写副本。这样您仍然可以在其他平台上使用,但不会在 Windows 中随处获取 stdout/stderr 文件。
来自 SDL faq .如需更多信息,请获取 wiki友好。
3.5 源码
在源代码 (~/SDL2-2.0.4/include/SDL_main.h) 中,我发现了以下内容
#ifndef SDL_MAIN_HANDLED
#if defined(__WIN32__)
/* On Windows SDL provides WinMain(), which parses the command line and passes
the arguments to your main function.
If you provide your own WinMain(), you may define SDL_MAIN_HANDLED
*/
source code 的在线副本.
如果定义 NO_STDIO_REDIRECT 没有成功,请尝试 SDL_MAIN_HANDLED。
在 SDL-1.2.15 (~/SDL-1.2.15/include/SDL/SDL_main.h) 中找不到它,但是,我找到的是
#define main SDL_main
这似乎与上面的#undef main 方法一致。
4 - 注意
将错误消息发送到 stderr 而不是 stdout 可能会很有趣。为此,请尝试使用 perror或 fprintf .
像这样:
/*...*/
perror ("Error"); // the string cannot be formatted
fprintf (stderr,"Error %s", str_err_msg); // the string can be formatted
/*...*/
关于c - 在 Code::Blocks 的 GUI 应用程序中使用 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39015282/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!