我最近遇到了一些看起来像的代码:
if(sizeof(var,2) == 4) { ... }
Run Code Online (Sandbox Code Playgroud)
(哪里var是一种类型)
我很惊讶地发现看起来似乎是sizeof运营商的两个论点.快速扫描ISO/ANSI C99标准并没有产生任何秘密.我无法想出任何允许在那里使用逗号的语法.
在搜索Google Code时,我能够在某些PPC代码中找到此语法的示例.
这是一些特定于PPC的语法吗?这是什么意思?
编辑:事实证明,我所看到的 - 以及链接代码 - 都是WindRiver Diab编译器特有的语法:
sizeof(type,int-const):
如果int-const为0,则sizeof返回类型的字节大小.
如果int-const为1 sizeof,则返回类型的对齐方式.
如果int-const为2 sizeof,则返回一个指定类型类型的整数常量.在Diab C/C++用户指南中查找"sizeof operator" 了解值.
哇,他们真的超载了sizeof运营商的意义.
编辑2:完整文档在这里:http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432
删除或省略Lua标准库包的最佳方法是什么?例如,删除特定环境中的os库函数.有问题的项目是从源文件构建Lua,所以我可以编辑源代码,尽管如果可能的话我宁愿通过API来完成.
有没有人对Linux可用的静态代码分析工具进行任何比较?以下工具的优点和缺点是什么:
您是否认为只使用其中一种工具就足够了?
我不是在寻找建议(我可以找到很多建议),但可以直接比较可用的工具.
我试图找到一种(有点)简单的方法来在窗口上截取屏幕截图并将生成的HBITMAP保存为JPEG.这里棘手的部分是,因为代码在CI中不能使用GDI +,并且由于代码是更大程序的模块,我不能使用外部库(如libjpeg).
此代码截取屏幕截图并返回HBITMAP.将该位图保存到文件中很容易.问题是位图是2或3mb.
HDC hDCMem = CreateCompatibleDC(NULL);
HBITMAP hBmp;
RECT rect;
HDC hDC;
HGDIOBJ hOld;
GetWindowRect(hWnd, & rect);
hBmp = NULL;
{
hDC = GetDC(hWnd);
hBmp = CreateCompatibleBitmap(hDC, rect.right - rect.left, rect.bottom - rect.top);
ReleaseDC(hWnd, hDC);
}
hOld = SelectObject(hDCMem, hBmp);
SendMessage(hWnd, WM_PRINT, (WPARAM) hDCMem, PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT | PRF_OWNED);
SelectObject(hDCMem, hOld);
DeleteObject(hDCMem);
return hBmp;
Run Code Online (Sandbox Code Playgroud)
关于如何做到这一点的任何想法?非常感谢,任何帮助表示赞赏
编辑:因为我们走向GDI +的方向我想我会发布代码iv C++,可以截取屏幕截图并使用GDI +将其转换为JPEG.如果有人知道如何使用FLAT GDI +实现这一目标我会很感激帮助.码:
#include <windows.h>
#include <stdio.h>
#include <gdiplus.h>
using namespace Gdiplus;
int GetEncoderClsid(WCHAR *format, CLSID *pClsid) …Run Code Online (Sandbox Code Playgroud) 我想监视X11下的所有打开的窗口.目前,我这样做如下:
XSelectInput( display, root_window, SubstructureNotifyMask | PropertyChangeMask ) 我主要担心的是第1点.在递归期间,XQueryTree将被多次调用.有没有办法确保树在此期间不会改变?换句话说,要在一个时间点获得整棵树的"快照"?
另外,我注意到在某些X11系统下,并非所有事件都正确到达.例如,在桌面上打开新窗口时,该窗口的MapNotify可能永远不会到达我的监控应用程序.怎么会这样?是否有可能在到达之前扔掉?
更新:
我写了一个小程序,它将监视根窗口上的X事件(见下文).现在,当我运行这个程序并启动并退出xcalc时,我得到以下输出:
Reparented: 0x4a0005b to 0x1001e40
Mapped : 0x1001e40
Destroyed : 0x1001e40
Run Code Online (Sandbox Code Playgroud)
而已.我从未收到过被破坏的真实窗口(0x4a0005b)的通知.甚至没有被映射!谁能告诉我为什么不呢?SubStructureNotifyMask是否仅导致发送直接子窗口的事件而不是整个子树?
顺便说一下,当Compiz运行时,这显然不会发生.然后没有重新完成:
Mapped : 0x4a0005b
Mapped : 0x4e00233
Destroyed : 0x4a0005b
Destroyed : 0x4e00233
Run Code Online (Sandbox Code Playgroud)
监控程序来源:
#include <X11/Xlib.h>
#include <cstdio>
int main()
{
Display *display;
Window rootwin;
display = XOpenDisplay( NULL );
rootwin = DefaultRootWindow( display );
XSelectInput( display, rootwin, SubstructureNotifyMask );
XEvent event;
while ( 1 ) {
XNextEvent( display, &event …Run Code Online (Sandbox Code Playgroud) 我一直在阅读K&R关于C的书,发现C中的指针算法允许访问超出数组末尾的一个元素.我知道C允许用记忆做几乎任何事情,但我只是不明白,这种特性的目的是什么?
对于非数学原因未定义的值,使用IEEE754浮点NaN(非数字)是一个好主意吗?
在我们的情况下,它们尚未设置,因为尚未从其他设备接收到值.上下文是使用IEC1131 REAL32值的嵌入式系统.编辑:编程语言是C,所以我们很可能使用来自C99的NAN和isnanf(x).虽然我们可能需要一些额外的扭曲来将这些扭曲到我们的操作系统兼容性层中.
编程语言中的默认设置似乎是初始化具有正零的浮点变量,其内部表示全为零.这对我们来说是不可用的,因为0在有效值的范围内.
使用NaN似乎是一个干净的解决方案,但也许它比它的价值更麻烦,我们应该选择其他一些价值?
我正在寻找一个可以在各种机器上编译和运行的快速基准程序.而不是使用商业/开源可用的选项,我宁愿自己使用线程和算法优化技术.
我有一对我已经使用过的,包括递归计算斐波那契序列的第n个数,以及播种/ rand()数千次.
是否有其他算法相对简单,但同时计算密集(可能与数学相关)?
(请注意,这些操作将以C语言实现.)
我在维基百科上找到了这段代码.
#include <stdio.h>
int main(void)
{
int c;
while (c = getchar(), c != EOF && c != 'x')
{
switch (c)
{
case '\n':
case '\r':
printf ("Newline\n");
break;
default:
printf ("%c",c);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我很好奇表达用作while循环的条件:
while (c = getchar(), c != EOF && c != 'x')
Run Code Online (Sandbox Code Playgroud)
它的作用非常明显,但我以前从未见过这种结构.这是特定于while循环吗?如果没有,解析器/编译器如何确定逗号分隔表达式的哪一侧为while循环返回布尔值?
我想拦截WM_DELETE_WINDOW发布到我正在编写的应用程序(AllTray)的某些窗口选择的消息,以便我可以对其进行操作而不是接收它的应用程序.目前,我看着在GDK级别尝试此通过gdk_display_add_client_message_filter,如果有可能,但我很高兴与Xlib的解决方案,如果有一个为好; 这似乎是可能的,但我似乎并不理解我是如何成功地做到的.
目前,我有两个程序(用C编写),我试图用它来解决这个问题,第一个程序除了创建一个它知道的窗口和寄存器之外什么也没做WM_DELETE_WINDOW,第二个试图捕获该消息,但是似乎没有这样做; 它似乎没有做任何事情.我是否理解文档错误,或者我需要做些什么(或者我是否需要完全避免使用GDK)?
背景是这样的:在我重新编写AllTray之前,它的工作方式似乎是试图拦截鼠标点击X按钮本身.对于某些窗口管理器,这种方法正常工作,对于其他窗口管理器根本不起作用,而对于其他窗口管理器,用户必须手动配置它并指示AllTray关闭窗口的按钮所在的位置.我正在寻找的是一个不涉及的解决方案,LD_LIBRARY_PRELOAD它将适用于任何符合当前标准的窗口管理器/应用程序组合,并WM_DELETE_WINDOW在窗口关闭时发送ClientMessage.
更新:我还在寻找答案.我现在采取的路线是尝试重新调整窗口并自行管理,但我无法使其工作.重新定位后,我似乎无法以任何方式取回它.我可能会遗漏一些非常基本的东西,但我无法弄清楚如何让它再次出现在我自己的窗口,将它带回屏幕.
更新2:好的,所以我打了另一个砖墙.X服务器文档说在窗口的事件掩码上设置StructureNotifyMask以接收MapNotify和ReparentNotify事件.我有兴趣接收任何一个.我目前的想法是创建一个窗口,作为事件接收器,然后当我获得有趣事件的事件时,通过创建和重新创建来对它们进行操作.但是,这根本不起作用.我实际收到的唯一事件是PropertyNotify事件.因此,这条路线似乎也没有做得很好.