有一个有点著名的 Unix 脑筋急转弯:写一个if表达式,使下面的程序打印Hello, world!在屏幕上。该expr中if必须是合法的C表达式,不应包含其他的程序结构。
if (expr)
printf("Hello, ");
else
printf("world!\n");
Run Code Online (Sandbox Code Playgroud)
答案是fork()。
当我年轻的时候,我只是笑了笑,忘记了。但是重新思考它,我发现我无法理解为什么这个程序比它应该的可靠得惊人。之后的执行顺序fork()无法保证并且存在竞争条件,但在实践中,您几乎总是看到Hello, world!\n,从不world!\nHello,。
为了证明这一点,我运行了 100,000 轮程序。
for i in {0..100000}; do
./fork >> log
done
Run Code Online (Sandbox Code Playgroud)
在 Linux 5.9 (Fedora 32, gcc 10.2.1, -O2) 上,执行 100001 次后,子只赢了 146 次,父赢率为 99.9985%。
$ uname -a
Linux openwork 5.9.14-1.qubes.x86_64 #1 SMP Tue Dec 15 17:29:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ wc -l log
100001 log …Run Code Online (Sandbox Code Playgroud) 我听说单元测试是保持代码正常工作的好方法.
单元测试通常会对函数进行简单输入,并检查其简单输出.但是我该如何测试用户界面呢?
我的程序是用PyQt编写的.我应该选择PyUnit,还是Qt的内置QTest?
我正在尝试编写一个计算十进制数字的程序?到1000位数或更多。
为了有趣地进行低级编程,最终程序将以汇编形式编写在没有乘法或除法且仅执行16位加法的8位CPU上。为了简化实现,希望只能使用16位无符号整数运算,并使用迭代算法。速度不是主要问题。快速乘法和除法不在此问题的范围内,因此也不要考虑这些问题。
在进行汇编之前,我仍在尝试在台式计算机上的C语言中找到可用的算法。到目前为止,我发现以下系列相当有效并且相对容易实现。
该公式是使用收敛加速技术从Leibniz系列推导而来的,要推导该公式,请参见Carl D.Offner撰写的《计算?中的数字》(https://cs.umb.edu/~offner/files/pi.pdf) ,第19-26页。最终公式显示在第26页。我编写的初始公式有错别字,请刷新页面以查看固定公式。2第54页中解释了最大术语中的常数项。该白皮书还介绍了一种高级迭代算法,但是我在这里没有使用它。
如果一个人使用许多(例如5000)项来评估该系列,则有可能获得千位数的?。容易,并且我发现使用此算法,该系列也易于迭代评估:
用2填充数组以开始第一次迭代,因此新公式类似于原始公式。
让carry = 0。
从最伟大的任期开始。从数组中获得一项(2),将其乘以PRECISION对进行定点除法2 * i + 1,然后将提示作为新项保存到数组中。然后添加下一项。现在递减i,转到下一学期,重复直到i == 1。最后加上最后一项x_0。
由于使用的PRECISION是16位整数10,因此,将获得2个十进制数字,但只有第一个数字有效。将第二个数字另存为进位。显示第一个数字加进位。
x_0 是整数2,不应为后续迭代添加整数,将其清除。
转到第4步,计算下一个十进制数字,直到获得所需的所有数字为止。
将此算法转换为C:
#include <stdio.h>
#include <stdint.h>
#define N 2160
#define PRECISION 10
uint16_t terms[N + 1] = {0};
int main(void)
{
/* initialize the initial terms */
for (size_t i = 0; i < N …Run Code Online (Sandbox Code Playgroud) c algorithm fixed-point numerical-computing mathematical-expressions
我需要定义一个接受多个 3D 坐标作为参数的 C++ 模板。当这些坐标的所有维度都定义为单独的整数变量时,参数列表将变得非常长 - 3 个坐标需要 9 个参数,这使得模板难以使用。
因此,非常希望以使用编译时数组的方式声明模板。它们的默认参数也应该直接在模板声明的位置声明为值,而不是变量名。
经过一些实验,令我惊讶的是,我发现 GCC 13 将接受以下 C++ 程序std=c++20:
#include <cstdio>
#include <array>
template <
std::array<int, 3> offset = {0, 0, 0}
>
struct Array
{
void operator() (int i, int j, int k)
{
printf("(%d, %d, %d)\n", i + offset[0], j + offset[1], k + offset[2]);
}
};
int main(void)
{
Array arr_default;
arr_default(0, 0, 0);
Array<{1, 1, 1}> arr;
arr(0, 0, 0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,clang 18 拒绝使用 …
c++ language-lawyer list-initialization braced-init-list c++-templates
如果我放置一个MouseAreaQML元素,那么MouseArea将窃取所有鼠标事件.因此,TextEdit将是不可编辑和不可选择的.
TextEdit {
// some properties
MouseArea {
// some properties
OnClicked: { /* do something */ }
}
}
Run Code Online (Sandbox Code Playgroud)
有办法解决吗?
顺便说一句,如果我把一个大的MouseArea放在另一个上MouseArea,更大的MouseArea将窃取所有鼠标事件.我该如何解决?我认为手动传递鼠标事件可以解决这个问题,但是怎么做呢?
在SYCL中,内存分为三种类型:主机内存、设备内存和统一共享内存(USM)。对于主机和设备内存,数据交换需要显式复制。同时,进出 USM 的数据移动由 SYCL 运行时自动隐式管理。
sycl::malloc_device()不幸的是,在使用 SYCL 为数值内核实现 GPU 加速的过程中,我发现仅通过切换到到,性能就会下降高达 4000% sycl::malloc_shared()- 即使我所做的只是重复重新提交相同的 SYCL 内核,而不做任何尝试从主机访问数据。
当使用针对 AMD HIP GFX906 (Radeon VII / Instinct MI50) 的 OpenSYCL 构建代码时sycl::malloc_device(),程序在 0.27 秒内完成:
$ time ./fdtd.elf
simulate 16974593 cells for 10 timesteps.
real 0m0.271s
user 0m0.253s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)
当使用 构建相同的代码时sycl::malloc_shared(),程序需要 10.6 秒才能完成:
simulate 16974593 cells for 10 timesteps.
real 0m10.649s
user 0m15.172s
sys 0m0.196s
Run Code Online (Sandbox Code Playgroud)
这是 3925% 的减速。
在BIOS中启用“4G以上解码”和“可调整BAR大小”支持后,现在需要3.8秒而不是10.6秒。但这并不能解决不必要的内存传输的实际问题 - 1300% 的性能损失仍然相当显着。
我之前也使用英特尔 DPC++ 编译器测试了类似的内核,并在相同的硬件上看到了类似的结果。
我怀疑速度减慢是由不必要的主机和设备复制引起的,但我不确定。SYCL 运行时使用什么启发法来确定是否需要复制?
下面附有示例代码。
ArrayNXYZ.hpp:4维数组(n,x,y,z)包装类。 …
Qt使用9px默认字体大小,但用户(在Linux上)可以通过使用来改变它qtconfig.
那么,我如何获得系统默认的字体大小?我看了文档,但是找不到任何API.
我在Github上分叉了一个存储库.现在,原来有一些更新.如何从原始存储库中提取更改并与它们保持同步?
如果我的源与原始源冲突,我是否有机会手动编辑它?
编辑1:谢谢大家的帮助.我想我需要RTFM :)
我正在尝试编写一个 X11 程序来监视桌面上的所有鼠标移动。每当人类用户移动鼠标或通过XWarpPointer()机器人应用程序以编程方式移动鼠标时,该程序应该能够接收通知。我知道通过设置PointerMotionMaskviaXSelectInput()和 monitor应该可以实现MotionNotify,但是我在从所有窗口接收鼠标事件时遇到了麻烦,而不仅仅是一个窗口。
最初,在下面的演示中,我只是尝试从根窗口接收指针运动事件。
#include <stdio.h>
#include <X11/Xlib.h>
int main(int argc, char **argv)
{
Display *display;
Window root_window;
XEvent event;
display = XOpenDisplay(0);
root_window = XRootWindow(display, 0);
XSelectInput(display, root_window, PointerMotionMask);
while (1) {
XNextEvent(display, &event);
switch(event.type) {
case MotionNotify:
printf("x: %d y: %d\n", event.xmotion.x, event.xmotion.y );
break;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它不会接收任何事件,除非鼠标指针位于空桌面背景上。很明显,仅仅从根窗口接收事件是行不通的。然后我尝试了一个解决方法:首先,SubstructureNotifyMask在根窗口上设置以监视所有CreateNotify事件以捕获所有新创建的窗口,然后调用XSelectInput()以启用PointerMotionMask这些窗口。
#include <stdio.h>
#include <X11/Xlib.h>
int main(int argc, char …Run Code Online (Sandbox Code Playgroud) 我发现了很多关于从QVBoxLayout中删除小部件的答案.
但我没有找到任何关于删除布局的答案.我知道我可以把我的子布局放到QWidget中.我只是想了解更多.
layout = QtGui.QVBoxLayout()
item_in_layout = create_layout()
layout.addLayout(item_in_layout)
# Remove?
Run Code Online (Sandbox Code Playgroud)