我有一个由硬件供应商报告的理论上的(非确定性的、难以测试的、实践中从未发生过的)硬件问题,其中对某些内存范围的双字写入可能会破坏任何未来的总线传输。
虽然我没有在 C 代码中明确写任何双字,但我担心编译器被允许(在当前或未来的实现中)将多个相邻的字分配合并为一个双字分配。
编译器不允许重新排序 volatile 的分配,但不清楚(对我而言)合并是否算作重新排序。我的直觉说是,但我之前已经被语言律师纠正过!
例子:
typedef struct
{
volatile unsigned reg0;
volatile unsigned reg1;
} Module;
volatile Module* module = (volatile Module*)0xFF000000u;
// two word stores, or one double-word store?
module->reg0 = 1;
module->reg1 = 2;
Run Code Online (Sandbox Code Playgroud)
(我会单独询问我的编译器供应商,但我很好奇标准的规范/社区解释是什么。)
我想在向量中存储一组线程,并在退出程序之前将它们全部加入.尝试加入第一个线程时,无论我在集合中放置了多少,我都会收到以下错误:
system_error: thread::join failed: No such process
Run Code Online (Sandbox Code Playgroud)
这是一些演示我的问题的简单代码:
#include <thread>
#include <iostream>
#include <vector>
#include <functional>
using std::cout;
using std::endl;
using std::vector;
using std::thread;
using std::mem_fn;
int main()
{
vector<thread> threads(1);
threads.push_back(thread([]{ cout << "Hello" << endl; }));
for_each(threads.begin(), threads.end(), mem_fn(&thread::join));
// also tried --> for(thread &t : threads) t.join()
}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下内容构建它(尝试过clang ++ 4.2.1和g ++ 5.3.1):
g++ -o src/thread_test.o -c -std=c++14 src/thread_test.cpp -pthread
g++ -o thread_test src/thread_test.o -pthread
Run Code Online (Sandbox Code Playgroud)
我在互联网上看到很多这样的例子.合同中的某些内容是否发生了变化,<thread>
或者<vector>
说这些例子已经解散了?
注意:作为未来读者的一小部分,我在尝试{}
赋值后最终添加了(1)构造函数参数,由于私有拷贝构造函数而失败.在试图避免复制构造函数时,我最终分配了未初始化的线程 - 粗心的错误.
I have written the attached example program that uses GTK2 in conjunction with EGL and OpenGL. On my system this works fine. On the PC of friend it only will produce a black window and I cannot put my finger on why this happens. We event straces which libraries get loaded (Which are the same). My PC has a NVIDIA MX150, he has a GTX 1030, he uses Debian Strech and I use Debian buster.
I cannot put my finger …
我已经定义了这个宏
#define FIB(n) (( 4 << n*(3+n))/((4 << (2*n)) - (2 << n) - 1))%(2 << n)
Run Code Online (Sandbox Code Playgroud)
当我试图得到一个答案时,不能正常工作,例如,如果我打电话给FIB(7),它给我0,那显然是错的.我在python中测试了这个函数,它运行得很好.所以,任何人都可以解释为什么它在C和C++中不起作用?
作为程序的一部分,我将命令作为一系列标记进行处理。到目前为止我\xc2\xb4已经得到:
\n\nvoid exec_this(char* cmd) {\n char token[100] = {0};\n sscanf(cmd, "%s", token)\n if(0 == strcmp(token, "add")) {\n char arg1[100] = {0};\n sscanf(cmd, "%*s%s", arg1); \n // continue parsing more args...\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n“%*s”很难看,尤其是当有很多参数时。
\n\n查看http://www.cplusplus.com/reference/cstdio/scanf/,有一个可能的说明符“n”用于检索“到目前为止读取的字符”。不确定在这种情况下“读取”意味着什么,因为字符串中存在空格和内容,而不是检索到的字符串的一部分;“添加 foo 42”。这就是我希望它工作的方式,但不确定它是否正确:
\n\nvoid exec_this(char* cmd) {\n char token[100] = {0};\n int n;\n sscanf(cmd, "%s%n", token, &n);\n if(0 == strcmp(token, "add")) {\n char arg1[100] = {0};\n sscanf(&cmd[n], "%s%n", arg1, &n);\n // continue parsing more args...\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n 运行期望从终端输入的程序我可以通过Ctrl + D"关闭"标准输入.之后有什么方法可以重新打开stdin吗?
我正在尝试 GNU Make 分组目标,但似乎误解了一些东西,因为目标没有按照我的预期分组。这是我的生成文件:
all: foo bar
.PHONY: foo bar
foo bar &:
@echo grouped target run for \"target\" $@
Run Code Online (Sandbox Code Playgroud)
和输出:
$ make
grouped target run for "target" foo
grouped target run for "target" bar
Run Code Online (Sandbox Code Playgroud)
配方针对每个目标运行,因此未分组。我在这里缺少什么?
GNU Make 版本 4.2.1。
我正在将我在 Dafny 中做的一项练习翻译成 SPARK,其中验证尾递归函数与递归函数。Dafny 源代码(经过审查,因为它可能仍用于类):
function Sum(n:nat):nat
decreases n
{
if n==0 then n else n+Sum(n-1)
}
method ComputeSum(n:nat) returns (s:nat)
ensures s == Sum(n)
{
s := 0;
// ...censored...
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我在 SPARK 中得到了什么:
function Sum (n : in Natural) return Natural
is
begin
if n = 0 then
return n;
else
return n + Sum(n - 1);
end if;
end Sum;
function ComputeSum(n : in Natural) return Natural
with
Post => ComputeSum'Result = Sum(n)
is
s : Natural …
Run Code Online (Sandbox Code Playgroud) 一遍又一遍地阅读 Bazel 文档,没有什么新鲜感,但我似乎无法掌握如何为本机以外的变体(例如--cpu
和 )设置配置和变体--compilation_mode
。
为了解释我对配置和变体的含义,请考虑此配置行、变体点列和变体单元格的表(制作此表,希望它至少具有抽象意义):
有硬件模块 X | 接口已连接 | 快速失败 | |
---|---|---|---|
客户配置1 | 是的 | 以太网 | 是的 |
客户配置2 | 是的 | USB | 是的 |
客户配置3 | 不 | USB | 不 |
调试硬件配置 | 不 | 串口 | 是的 |
从 Bazel 用户的角度来看:
-DVARIANT_POINT_CONNECTED_ETH
用于以太网连接和-DVARIANT_POINT_CONNECTED_USB
USB 连接bazel build //my/target --//:configuration=debughw
select()
规则我有这个程序:
#!/usr/local/bin/wish
package require Tk
# Window properties
wm title . "Jau"
wm minsize . 320 240
# main frame
grid [ttk::frame .f -padding "0 0 0 0"] -column 0 -row 0 -sticky nwes
grid columnconfigure . 0 -weight 1; grid rowconfigure . 0 -weight 1
# drawing canvas
canvas .f.canvas -bg darkgreen
place .f.canvas -relwidth 1.0 -relheight 1.0
# cmd
ttk::entry .f.cmd -textvar cmd -width 30
pack .f.cmd -anchor s -side top
puts stderr "hello world"
Run Code Online (Sandbox Code Playgroud)
当我运行它时,控制台中没有打印“hello world”。有什么办法可以去puts …
当生成的模型具有与C++关键字冲突的属性时,我正在生成C++代码并遇到问题.我更喜欢这个模型保持语言不可知.
我已经尝试了一些#define int ReSeRvEd_int
本地生成的代码 - 但是分配其他符号感觉不对 - 问题并没有真正消失,并且生成的代码和模型之间的交叉引用变得更加困难.
有关如何抑制/隐藏关键字的任何建议?
我在我的脚本上运行shellcheck并且经常收到这个警告(在这种情况下是正确的,因为cd foo bar baz
没有意义):
cd ${SOME_DIR} || exit 1
^-- SC2046: Quote this to prevent word splitting.
Run Code Online (Sandbox Code Playgroud)
这个警告主要是一个好的警告。变量包含多个参数时的一种例外情况:
gcc ${OPTIONS} ...
^-- SC2046: Quote this to prevent word splitting.
Run Code Online (Sandbox Code Playgroud)
是否有关于故意分词的约定更明确,可能会避免此 shellcheck 警告?
我前几天有这个结构:
struct foo_t {
char a, b, c;
} *foo = (foo_t*)untyped_memory;
Run Code Online (Sandbox Code Playgroud)
...但是有一个命名类型是过度的.但是,它的未命名形式:
struct {
char a, b, c;
} *bar = untyped_memory;
Run Code Online (Sandbox Code Playgroud)
...由于指针类型不兼容而无法编译.
有没有办法使它工作?