小编Sha*_*baz的帖子

const string加上布尔值在C中复数

我很惊讶string plus boolean有类似三元操作的效果:

int apple = 2;                                                                      
printf("apple%s\n", "s" + (apple <= 1));
Run Code Online (Sandbox Code Playgroud)

如果apple <= 1,它将打印苹果.为什么这样做?

c string boolean plural

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

在单写入器多读取器线程中交换缓冲区

故事

有一个作家线程,定期从某个地方收集数据(实时,但这在问题中并不重要)。有很多读者然后从这些数据中读取。通常的解决方案是使用两个读写器锁和两个缓冲区,如下所示:

Writer (case 1):
acquire lock 0                        
loop
    write to current buffer
    acquire other lock
    free this lock
    swap buffers
    wait for next period
Run Code Online (Sandbox Code Playgroud)

或者

Writer (case 2):
acquire lock 0                        
loop
    acquire other lock
    free this lock
    swap buffers
    write to current buffer
    wait for next period
Run Code Online (Sandbox Code Playgroud)

问题

在这两种方法中,如果获取其他锁操作失败,则不进行交换并且写入器将覆盖其先前的数据(因为写入器是实时的,它无法等待读取器)因此在这种情况下,所有读取器都会丢失该帧数据的。

不过这没什么大不了的,读者是我自己的代码,他们很短,所以有了双缓冲区,这个问题就解决了,如果有问题,我可以把它变成三重缓冲区(或更多)。

问题是我想最小化的延迟。想象案例1:

writer writes to buffer0                reader is reading buffer1
writer can't acquire lock1              because reader is still reading buffer1
|                                       |
|                                       reader finishes reading,
| …
Run Code Online (Sandbox Code Playgroud)

c linux algorithm readerwriterlock double-buffering

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

C++从函数返回数组

我需要在数组中读取我的函数,提取数据,然后从函数返回一个数组.

该数组只能保存2个值.

这是我想要做的概念:

int myfunction(int my_array[1])
{
    int f_array[1];
    f_array[0] = my_array[0];
    f_array[1] = my_array[1];

    // modify f_array some more

    return f_array;
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了关于指针等的内容,但是我们非常感到困惑,并希望了解如何最好地解决这个问题的一个非常基本的例子!

谢谢!

c++ arrays return function

5
推荐指数
2
解决办法
2万
查看次数

graph - 如何避免在Depth First Search中重复处理相同的边缘两次?

算法设计手册介绍了BFS和DFS相当不错.在决定是否避免双重处理边缘时,书中dfs的代码存在问题.我找到了勘误表并将勘误表应用到代码中,但我仍然认为精炼代码存在检查双处理边缘的问题.

我粘贴精炼代码如下:

dfs(graph *g, int v) {
       edgenode *p;
       int y;
       if (finished) return;
       discovered[v] = TRUE;
       time = time + 1;
       entry_time[v] = time;
       process_vertex_early(v);
       p = g->edges[v];
       while (p != NULL) {
             /* temporary pointer */
             /* successor vertex */
             /* allow for search termination */
             y = p->y;
             if (discovered[y] == FALSE) {
                   parent[y] = v;
                   process_edge(v,y);
                   dfs(g,y);
             }
             else if (**(!processed[y] && parent[v] != y)** || (g->directed))
                   process_edge(v,y);
             if (finished) …
Run Code Online (Sandbox Code Playgroud)

algorithm graph depth-first-search data-structures

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

从void**转换为char**有多危险

所以我们知道标准不会强制指针大小相等.(这里这里)(而不是谈论函数指针)

我想知道实际上这可能是一个问题.我们知道void *可以容纳任何东西,所以如果指针大小不同,那将是最大的尺寸.鉴于此,指定void **一个char **意味着麻烦.

我的问题是假设void *char *具有相同的大小是多么危险?实际上有一个架构,这不是真的吗?

此外,16位dos不是我想听到的!;)

c pointers void-pointers

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

以双引号开头的行是什么意思?

在其中一次采访中我被问到,C中的以下行是什么?在我看来,以下行没有任何意义:

"a"[3<<1];
Run Code Online (Sandbox Code Playgroud)

有人知道答案吗?

c

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

什么是"__cdecl"?

我想将AES算法与MPI一起使用.

我用visual c ++编写代码.当我编译代码时,我收到此错误:

函数_main中引用的未解析的外部符号"void __cdecl BTM(int,int)"(?BTM @@ YAXHH @ Z)

c++ visual-c++

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

将模块移植到较新的Linux内核:无法分配内存

我有一个非常大的驱动程序模块,我正在尝试编译最近的Linux内核(3.4.4).我可以insmod使用2.6.27.25内核成功编译和使用相同的模块.GCC版本也不同,4.7.0对4.3.0.请注意,此模块非常复杂,我不能简单地浏览所有代码和所有makefile.

当"插入"模块时,我得到一个Cannot allocate memory带有以下痕迹:

vmap allocation for size 30248960 failed: use vmalloc=<size> to increase size.
vmalloc: allocation failure: 30243566 bytes
insmod: page allocation failure: order:0, mode:0xd2
Pid: 5840, comm: insmod Tainted: G           O 3.4.4-5.fc17.i686 #1
Call Trace:
 [<c092702a>] ? printk+0x2d/0x2f
 [<c04eff8d>] warn_alloc_failed+0xad/0xf0
 [<c05178d9>] __vmalloc_node_range+0x169/0x1d0
 [<c0517994>] __vmalloc_node+0x54/0x60
 [<c0490825>] ? sys_init_module+0x65/0x1d80
 [<c0517a60>] vmalloc+0x30/0x40
 [<c0490825>] ? sys_init_module+0x65/0x1d80
 [<c0490825>] sys_init_module+0x65/0x1d80
 [<c050cda6>] ? handle_mm_fault+0xf6/0x1d0
 [<c0932b30>] ? spurious_fault+0xae/0xae
 [<c0932ce7>] ? do_page_fault+0x1b7/0x450
 [<c093665f>] sysenter_do_call+0x12/0x28
-- clip --
Run Code Online (Sandbox Code Playgroud)

显而易见的答案似乎是模块分配了太多内存,但是:

  • 我对旧内核版本没有任何问题,这个模块的大小
  • 如果我修剪这个模块的某些部分以获得更低的内存消耗,我会得到与新内核相同的错误消息
  • 我可以卸载很多其他模块,但它没有任何影响(并且无论如何相关?Linux是否存在关于模块总内存使用量的全局限制)

因此,我怀疑新内核的问题与有限的内存没有直接关系.

新内核抱怨 …

c kernel insmod linux-kernel vmalloc

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

在Linux中除以零的异常处理

我很好奇理解linux中的零除异常处理。当执行零除运算时,将生成陷阱,即将陷阱INT0发送到处理器,并最终将SIGFPE信号发送到执行该操作的进程。

如我所见,除零异常在trap_init()函数中注册为

set_trap_gate(0, &divide_error);
Run Code Online (Sandbox Code Playgroud)

我想详细了解一下,在INT0生成之前和SIGFPE发送到流程之前发生了什么?

signals exception linux-kernel

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

测试具有非标准文件名的脚本的"框架"

以下是对一些问题(特别是对于shell)的许多评论,这些问题基本上表示以下一个或多个:

  • 对于包含空格,换行符等的文件名,这将失败,
  • 如果文件是符号链接(或不是),这将失败,
  • 如果$filaneme是目录而不是常规文件,这将失败,
  • 等等.

虽然我知道每个脚本都需要自己的测试环境,但这些是脚本应该免受攻击的常见问题.

因此,我的目的是编写一个脚本,它将创建一些带有"特制"文件名的目录层次结构,以便进行测试.

问题是:什么"特殊"文件名对这个测试有好处?

目前我有(脚本创建文件和目录):

  • 文件名中的空格
  • 文件名中的换行符
  • 以下列之一开头的文件名:
    • - (比如命令参数)
    • # (评论char)
    • ! (命令历史)
  • 文件名包含以下之一:
    • | 炭(管)
    • () 字符
    • *?(通配符)
  • 带有unicode字符的文件名
  • 所有上面的目录
  • 目录的符号链接
  • 文件的符号链接

还有什么我不应该错过的想法吗?

bash shell

5
推荐指数
0
解决办法
123
查看次数