给定一个C++源代码,我想找到每个函数写入和读取的类字段.使用Clang前端的最佳方法是什么?
(我不是要求对所有步骤进行详细解释;但是,有效解决方案的出发点会很棒.)
到目前为止,我尝试使用RecursiveASTVisitor解析语句,但是跟踪节点连接很困难.另外,我无法弄清楚如何跟踪下面的内容:
int& x = m_int_field;
x++;
Run Code Online (Sandbox Code Playgroud)
这明显改变了m_int_field
; 但Stmt
只要一个人就不可能知道; 所以AST遍历本身似乎不够.
对我来说,一个好处就是可以单独计算字段和子字段(例如,访问成员结构的三个字段).
例:
typedef struct Y {
int m_structfield1;
float m_structfield2;
Y () {
m_structfield1 = 0;
m_structfield2 = 1.0f;
}
} Y;
class X {
int m_field1;
std::string m_field2;
Y m_field3;
public:
X () : m_field2("lel") {}
virtual ~X() {}
void func1 (std::string s) {
m_field1 += 2;
m_field2 = s;
}
int func2 () {
return m_field1 + 5;
}
void func3 (Y& y) …
Run Code Online (Sandbox Code Playgroud) 我想在 C++ 项目中包含 NASM 本身(汇编程序)。我可以将 NASM 编译为共享库吗?如果没有,是否还有其他汇编程序可用作 C 或 C++ 库?
我检查了libyasm但不明白如何使用它来组装我的代码。
什么是最短的Intel x86-64操作码设置rax
为1?
我试着xor rax,rax
和inc al
(在NASM语法); 它给出了5字节的操作码48 31 c0
fe c0
.是否有可能以4个字节实现相同的结果?
您可以修改或读取任何其他寄存器,但不能假设特定值将来自之前的指令中的任何一个.
我想编写一个 Windows C++ 应用程序,其中窗口的内容是窗口后面的内容(就好像窗口是透明的一样)。也就是说,我想检索窗口的边界框;捕获下面的这些坐标,并将它们绘制在我的窗口上。因此,在捕获过程中排除窗口本身至关重要。
“为什么不让窗户透明呢?” 你问。因为我的下一步是对该图像进行修改。我想对其应用一些任意过滤器。例如,假设我想模糊该图像,使我的窗户看起来像毛玻璃。
我尝试使用https://code.msdn.microsoft.com/windowsdesktop/Magnification-API-Sample-14269fd2上的放大 API 示例 ,它实际上为我提供了不包括窗口的屏幕内容。然而,重新渲染图像是在计时器中完成的,这会导致图像非常抖动;我不知道如何检索该图像并将其应用任意变换。
我不知道从哪里开始,此时确实可以使用一些指针。抱歉,如果我是从一个愚蠢的角度来处理这个问题的。
编辑:我正在添加我的意思的模型:
编辑 2:就像放大 API 示例一样,视图将不断刷新(尽可能频繁地刷新,为了论证起见,假设每 16 毫秒刷新一次)。请参阅Visolve Deflector示例;尽管它不会对捕获区域施加任何效果。
再次强调,之后我将修改图像数据;因此我无法使用放大 API 的内核矩阵支持。
我一直在尝试调整我的笔记本电脑的风扇速度,我可以通过将20 (0x14)
EC 的地址设置为介于28 (0x1C)
和之间的值来在Windows中实现.41 (0x29)
(我从这个文件中得到这些数字:https://github.com/hirschmann/nbfc/blob/master/Configs/HP%20ENVY%20m6%20Sleekbook.xml)
当我在Windows中执行它时,它可以正常工作.所以我试图在Ubuntu 14.04中复制它.以下是我的尝试:
ec_sys
模块通过写sudo modprobe ec_sys write_support=1
这使/sys/kernel/debug/ec/ec0/io
可用.事实证明,如果我省略,write_support=1
我会在下一步中收到"权限被拒绝"错误.printf '\x1C' | sudo dd of="/sys/kernel/debug/ec/ec0/io" bs=1 seek=20 count=1 conv=notrunc
以便我可以写入EC 0x1c (28)
的地址20 (0x14)
并调整风扇速度.我检查上述寄存器是否通过输入更新sudo od -t x1 /sys/kernel/debug/ec/ec0/io
,然后输出:
0000000 00 00 00 00 00 01 50 04 00 00 ff 10 00 33 13 05
0000020 00 19 24 19 1c 00 ff ff …
如何在我正在解析的 ELF 文件中找到 .got 部分的偏移量?
我不想按名称搜索该部分,因为我不想依赖它。当我用其他东西更改部分名称时,二进制文件仍然有效。
我有一个动态编程(可能是贪婪的)问题.
设A是mxn矩阵.令k为整数,使得k≤min{m,n}.
找到A的k个元素,使得这些k个元素中的每一个都在它们唯一的列和行中; 并且这些k元素的总和被最小化.
换句话说,我想从A中选择k个元素,使得它们的总和最小; 但如果我选择A 2,3那么我就不能选择A 2,6或A 4,3.
贪婪的方法似乎是选择A中的最小元素,删除其行和列,并重复直到A'耗尽'.但是,在这种情况下,我无法证明贪婪的选择属性,或者它是否具有贪婪的选择属性.
我也无法弄清楚如何为DP解决方案构建表.
如果此问题已经提出并且有特定名称,请您分享一下吗?
我想在YACC中编写算术表达式的规则;其中定义了以下操作:
+ - * / ()
Run Code Online (Sandbox Code Playgroud)
但是,我不希望该语句带有括号。也就是说,a+(b*c)
应该有一个匹配的规则,但是(a+(b*c))
不应该。
我该如何实现?
动机:
在我的语法中,我定义了一个这样的集合:(1,2,3,4)
并且我想(5)
被视为1元素集合。模糊性导致减少/减少冲突。
在 Rust 中,我有一堆想要并行执行的异步函数。处理这些函数结果的顺序很重要。我还想在这些函数可用时检索它们的结果。
\n让我不好解释一下。
\n以下是 的描述FuturesOrdered
:
\n\n这个“组合器”类似于 FuturesUnordered,但它在 future 集合之上强加了一个顺序。虽然集合中的 future 将并行完成\n,但结果将仅按其原始 future 添加到队列的顺序返回。
\n
到目前为止,一切都很好。现在看这个例子:
\nlet mut ft = FuturesOrdered::new();\nft.push(wait_n(1)); // wait_n sleeps\nft.push(wait_n(2)); // for the given\nft.push(wait_n(4)); // number of secs\nft.push(wait_n(3));\nft.push(wait_n(5));\nlet r = ft.collect::<Vec<u64>>().await;\n
Run Code Online (Sandbox Code Playgroud)\n由于FuturesOrdered
\xc2\xa0await 直到所有future 都完成;这就是我得到的:
|--| ++\n|----| ++\n|--------| ++\n|------| ++\n|----------|++\n ++-> all results available here \n
Run Code Online (Sandbox Code Playgroud)\n这就是我要的:
\n|--|++\n|----|++\n|--------|++\n|------| ++\n|----------| ++\n \n
Run Code Online (Sandbox Code Playgroud)\n换句话说; 我要等待下一个未来;随着剩余的期货不断地完成。另请注意,即使任务#4 在任务#3 之前完成;由于最初的订单,它是在#3 之后处理的。
\n我怎样才能获得像这样同时执行的期货流?我希望有这样的事情: …