小编And*_*eas的帖子

是否允许 C 编译器合并对 volatile 变量的顺序分配?

我有一个由硬件供应商报告的理论上的(非确定性的、难以测试的、实践中从未发生过的)硬件问题,其中对某些内存范围的双字写入可能会破坏任何未来的总线传输。

虽然我没有在 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)

(我会单独询问我的编译器供应商,但我很好奇标准的规范/社区解释是什么。)

c volatile compiler-optimization language-lawyer

64
推荐指数
5
解决办法
3802
查看次数

矢量中的线程无法连接

我想在向量中存储一组线程,并在退出程序之前将它们全部加入.尝试加入第一个线程时,无论我在集合中放置了多少,我都会收到以下错误:

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)构造函数参数,由于私有拷贝构造函数而失败.在试图避免复制构造函数时,我最终分配了未初始化的线程 - 粗心的错误.

c++ vector stdvector c++11 stdthread

18
推荐指数
1
解决办法
1352
查看次数

EGL and OpenGL only produces black screen

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 …

linux x11 gtk opengl egl

8
推荐指数
0
解决办法
198
查看次数

Fibonacci函数无法正确计算

我已经定义了这个宏

#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++中不起作用?

c++ macros bit-shift fibonacci

6
推荐指数
1
解决办法
192
查看次数

scanf 说明符“n”算什么?

作为程序的一部分,我将命令作为一系列标记进行处理。到目前为止我\xc2\xb4已经得到:

\n\n
void 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\n
void 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

c scanf

5
推荐指数
1
解决办法
2433
查看次数

如何在Ctrl + D后重新启动stdin?

运行期望从终端输入的程序我可以通过Ctrl + D"关闭"标准输入.之后有什么方法可以重新打开stdin吗?

c linux

5
推荐指数
1
解决办法
441
查看次数

GNU Make 分组目标未分组

我正在尝试 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。

makefile gnu-make

5
推荐指数
1
解决办法
588
查看次数

如何在SPARK中为递归函数设置前置条件和后置条件?

我正在将我在 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)

recursion ada dafny spark-2014

5
推荐指数
1
解决办法
673
查看次数

如何在 Bazel 中进行配置和变体处理?

一遍又一遍地阅读 Bazel 文档,没有什么新鲜感,但我似乎无法掌握如何为本机以外的变体(例如--cpu和 )设置配置和变体--compilation_mode

为了解释我对配置和变体的含义,请考虑此配置行、变体点列和变体单元格的表(制作此表,希望它至少具有抽象意义):

有硬件模块 X 接口已连接 快速失败
客户配置1 是的 以太网 是的
客户配置2 是的 USB 是的
客户配置3 USB
调试硬件配置 串口 是的

从 Bazel 用户的角度来看:

  • 默认情况下,所有目标都应该可针对所有配置构建
    • 无法在添加配置时到处添加“客户配置 X”
    • 配置特定组件应该能够明确声明它特定于哪个配置
      • 我认为这就是constraint_value的用途
  • 规则应根据配置添加标志
    • 例如-DVARIANT_POINT_CONNECTED_ETH用于以太网连接和-DVARIANT_POINT_CONNECTED_USBUSB 连接
  • 我想要一个简单的构建命令来构建/测试/运行单个配置
    • 就像是bazel build //my/target --//:configuration=debughw
    • 认为skylark 配置文档中有一些关于它的内容,但没有看到如何从示例转到使用constraint_values和select()规则

bazel

3
推荐指数
1
解决办法
1138
查看次数

如何让我的 Tcl/Tk 希望应用程序将调试内容打印到控制台?

我有这个程序:

#!/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 …

tk-toolkit tcl

2
推荐指数
1
解决办法
1417
查看次数

如何抑制C++关键字?

当生成的模型具有与C++关键字冲突的属性时,我正在生成C++代码并遇到问题.我更喜欢这个模型保持语言不可知.

我已经尝试了一些#define int ReSeRvEd_int本地生成的代码 - 但是分配其他符号感觉不对 - 问题并没有真正消失,并且生成的代码和模型之间的交叉引用变得更加困难.

有关如何抑制/隐藏关键字的任何建议?

c++

2
推荐指数
1
解决办法
92
查看次数

如何明确故意分词?

我在我的脚本上运行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 警告?

bash sh shellcheck

2
推荐指数
1
解决办法
1372
查看次数

如何将指针转换为未命名的struct指针?

我前几天有这个结构:

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)

...由于指针类型不兼容而无法编译.

有没有办法使它工作?

c++

1
推荐指数
1
解决办法
132
查看次数