小编cam*_*amh的帖子

对C++中的指针使用NULL或0(零)吗?

在C++的早期,当它被用螺栓固定在C之上时,你不能使用NULL,因为它被定义为(void*)0.你不能将NULL分配给除了之外的任何指针void*,这使得它变得毫无用处.在那些日子里,人们接受了你使用0(零)空指针.

直到今天,我继续使用零作为空指针,但我周围的人坚持使用NULL.我个人认为给NULL现有值一个name()没有任何好处- 因为我也喜欢将指针测试为真值:

if (p && !q)
  do_something();
Run Code Online (Sandbox Code Playgroud)

然后使用零更有意义(如果你使用NULL,你不能逻辑使用p && !q- 你需要明确比较NULL,除非你假设NULL是零,在这种情况下为什么使用NULL).

有没有客观的理由偏好零而不是NULL(反之亦然),或者只是个人偏好?

编辑:我应该添加(并且最初要说)使用RAII和异常,我很少使用零/ NULL指针,但有时你确实需要它们.

c++ null

186
推荐指数
13
解决办法
13万
查看次数

在一行的最后一个字段上排序

排序行列表的最简单方法是什么,对每行的最后一个字段进行排序?每行可以具有可变数量的字段.

就像是

sort -k -1
Run Code Online (Sandbox Code Playgroud)

是我想要的,但sort(1)不会从负数中选择字段而不是从开头.

我也希望能够选择字段分隔符.

编辑:为问题添加一些特异性:我要排序的列表是路径名列表.路径名可以是任意深度,因此可变数量的字段.我想对文件名组件进行排序.

此附加信息可能会更改操作行以提取最后一个字段(可能使用basename(1))的方式,但不会更改排序要求.

例如

/a/b/c/10-foo
/a/b/c/20-bar
/a/b/c/50-baz
/a/d/30-bob
/a/e/f/g/h/01-do-this-first
/a/e/f/g/h/99-local
Run Code Online (Sandbox Code Playgroud)

我希望这个列表按文件名排序,所有这些都以数字开头,表示文件的读取顺序.

我在下面添加了我的答案,这就是我目前正在做的事情.我曾希望有一种更简单的方法 - 也许是一种不同的排序实用程序 - 也许不需要操纵数据.

linux sorting shell

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

是否在函数调用期间实际传递了一个未命名的参数?

template <typename TAG>
fn(int left, TAG, int right)
{
}

fn(0, some_type_tag(), 1);
/* or */
fn(0,int(), 1); // where the primitive, int, is not empty.
Run Code Online (Sandbox Code Playgroud)

编辑:这个问题有两个视角.

  1. 函数声明与定义.声明可能没有命名参数,但声明可能会这样做.这不是感兴趣的视角.
  2. 该模板在元编程中有所体现.有问题的参数是用于从特征中提取元结构的标记.这就是参数未命名的原因,我只关心编译时信息 - 标签的类型.

/编辑

我的标签通常是空结构,但是在我的代码的某些部分,它们是原始类型的typedef.所以,我很想知道现代编译器是否会实际传递参数.这有两个方面.

  1. 调整堆栈大小,考虑未命名参数类型的大小.
  2. 实际上用传递的值构造堆栈.

让我们把它保持到gcc 4.5和msvc 2008+

c++ micro-optimization

17
推荐指数
3
解决办法
1284
查看次数

使用带有bash的命名管道 - 数据丢失问题

做了一些在线搜索,找到了使用命名管道的简单"教程".但是,当我对后台工作做任何事情时,我似乎丢失了大量数据.

[[编辑:发现一个更简单的解决方案,请参阅回复帖子.所以我提出的问题现在是学术性的 - 如果有人想要一个工作服务器]]

使用Ubuntu 10.04和Linux 2.6.32-25-generic#45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux

GNU bash,版本4.1.5(1)-release(x86_64-pc-linux-gnu).

我的bash功能是:

function jqs
{
  pipe=/tmp/__job_control_manager__
  trap "rm -f $pipe; exit"  EXIT SIGKILL

  if [[ ! -p "$pipe" ]]; then
      mkfifo "$pipe"
  fi

  while true
  do
    if read txt <"$pipe"
    then
      echo "$(date +'%Y'): new text is [[$txt]]"

      if [[ "$txt" == 'quit' ]]
      then
    break
      fi
    fi
  done
}
Run Code Online (Sandbox Code Playgroud)

我在后台运行:

> jqs&
[1] 5336
Run Code Online (Sandbox Code Playgroud)

现在我喂它:

for i in 1 2 3 4 …
Run Code Online (Sandbox Code Playgroud)

linux bash named-pipes data-loss

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

如何找到当前的虚拟终端

我正在解决Ubuntu 10.04中的问题,在恢复后,鼠标光标消失.

这可以通过chvt 1; chvt 7在/etc/pm/sleep.d中的脚本中运行来"修复" ,以便这些命令在解冻和恢复时运行.

但是,X控制台并不总是vt#7,因此chvt 7在这些情况下是错误的.

我想要做的是找出修复脚本中的当前vt,并确保我改回到该vt.

我怎样才能找到当前的vt?(tty(1)只报告"不是tty")

linux shell console

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

Linux是否为应用程序提供单调递增的时钟

Linux/Unix/Posix是否为用户空间应用程序提供API以访问单调增加的时钟,精度为厘秒到毫秒?

在Linux上,/ proc/uptime提供了一个基于字符串的表示形式,表示系统启动的秒数的浮点数.

gettimeofday(2)不提供单调增加的时钟.

我可以在ITIMER_REAL时域中使用getitimer(2),将计时器设置为以(平台相关的)最大值开始并忽略生成的信号,但根据手册页,计时器可以运行的最长时间大约为100天,比我预期的运行时间短.

unix linux timer

11
推荐指数
2
解决办法
3915
查看次数

查找嵌入式Linux系统中的延迟问题(停顿)

我有一个在Atmel AT91SAM9260EK板上运行的嵌入式Linux系统,我有两个进程以实时优先级运行.管理器进程使用POSIX消息队列定期"ping"工作进程,以检查工作进程的运行状况.通常往返ping大约需要1ms,但偶尔需要更长时间 - 大约800ms.没有其他进程以更高的优先级运行.

看来停顿可能与日志记录(syslog)有关.如果我停止记录问题似乎消失了.但是,如果日志文件位于JFFS2或NFS上,则没有任何区别.没有其他进程写入"磁盘" - 只是syslog.

我有哪些工具可以帮助我找出这些摊位发生的原因?我知道等待时间并将使用它.还有其他一些可能更有用的工具吗?

一些细节:

  • 内核版本:2.6.32.8
  • libc(syslog函数):uClibc 0.9.30.1
  • syslog:busybox 1.15.2
  • 没有配置交换空间[在编辑中添加]
  • 根文件系统在tmpfs上(从initramfs加载)[在编辑中添加]

linux embedded latency

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

复杂函数的Pythonic错误处理

我想知道是否有一种Pythonic方法来处理长时间运行的函数中的错误,这些错误可能会导致部分错误,而这些错误不会影响函数的继续运行能力.

例如,考虑一个给定URL列表的函数,它以递归方式检索顶级URL路径下的资源和所有链接资源.它将检索到的资源存储在本地文件系统中,其目录结构镜像URL结构.本质上,这是一个页面列表的基本递归wget.

这个函数可能会失败的点很多:

  • URL可能无效或无法解析
  • 主机可能无法访问(可能是暂时的)
  • 在本地保存可能有磁盘错误
  • 你能想到的任何其他事情.

检索或保存任何一个资源失败只会影响该函数继续处理该资源的能力以及可能与之链接的任何子资源,但可以继续检索其他资源.

一个简单的错误处理模型是,在第一个错误上,会引发一个适当的异常以供调用者处理.这个问题是它终止了函数并且不允许它继续.错误可能是固定的,并且函数从一开始就重新启动,但这会导致重做工作,任何永久性错误都可能意味着我们永远无法完成.

我想到的几个选择是:

  • 在列表发生错误时记录它们并中止处理任何子资源的资源,但继续下一个资源.如果发生太多错误,可以使用阈值来中止整个功能,或者只是尝试一切.调用程序可以在函数完成时查询此列表,以查看是否存在任何问题.
  • 调用者可以提供每个错误调用的可调用对象.这将记录错误的责任移回给调用者.你甚至可以指定如果callable返回False,那么处理应该停止.这会将阈值管理移动到调用者.
  • 用后者实现前者,提供错误处理对象而不是编码前者的行为.

在Python讨论中,我经常注意到某些方法被描述为Pythonic或非Pythonic.我想知道是否有任何特别的Pythonic方法来处理上述场景类型.

Python是否包含任何电池模型比异常处理的终止模型更复杂的错误处理,或者更复杂的电池是否使用我应该复制以保留Pythonic的错误处理模型?

注意:请不要专注于示例.我不打算在那个特定的空间里解决问题,但它似乎是一个很好的例子,大多数人都会对此有所了解.

python error-handling

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

一个可交换的密码?

我正在寻找一个可交换的密码 - 就是这样

E(K?,E(K?,P)) = E(K?,E(K?,P))
Run Code Online (Sandbox Code Playgroud)

但不是联想 - 也就是说

E(K,P) ? E(P,K)
Run Code Online (Sandbox Code Playgroud)

这排除了XOR,否则本来可以.

对称密码是优选的,但非对称密码也可以工作.

我想要实现的基本协议是:

  1. Alice有一个令牌列表(32位整数),她使用相同的密钥(K0)加密每个令牌
  2. Alice将加密令牌列表发送给Bob
  3. Bob随机化列表,使用单独的密钥(K1-Kn)加密每个令牌,标记每个令牌并将列表返回给Alice.
  4. Alice用K0解密每个令牌,留下一个令牌列表,每个令牌用一个单独的密钥加密(K1-Kn)
  5. 一段时间后,Bob向Alice发送了一个特定标签的密钥(Kx)
  6. Alice用Kx解密令牌,给她标记为x的令牌的明文
  7. 鲍勃可能会看到明文,所以鉴于他之前给出的信息,他必须无法从中获取K0.

有人可以建议我可以使用的密码并指出我对该密码的实现吗?

我对加密协议和应用程序有所了解,但我并没有真正了解大多数密码的数学.虽然分步数学指南也可以.

我计划在Clojure中实现它,所以任何Java库也都很好.但是,任何代码都很好,因为我理解代码.

cryptography

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

共享内存和unix管道之间的区别?

UNIX编程中共享内存管道之间的主要区别是什么?

unix terminology

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

使用方法指针启动一个线程

我正在尝试开发线程抽象(来自Windows API的POSIX线程和线程),我非常希望能够使用方法指针启动它们,而不是函数指针.

我想要做的是线程的抽象是一个带有纯虚方法"runThread"的类,它将被植入未来的线程类中.

我还不知道Windows线程,但要启动POSIX线程,您需要一个函数指针,而不是方法指针.而且我无法找到一种方法将方法与实例相关联,因此它可以作为一个函数工作.我可能只是找不到关键字(我一直在搜索很多),我认为它几乎是Boost :: Bind()所做的,所以它必须存在.

你能帮助我吗 ?

c++ methods multithreading member-function-pointers function-pointers

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

如何在包目录中运行单元测试

我有一个 python 代码库,我已经将一个模块(文件)重构到一个包(目录)中,因为文件变得有点大且无法管理。但是,我无法使用新结构按需要运行我的单元测试。

我将我的单元测试文件直接放在它测试的代码旁边(这是一个要求,不能更改 - 没有单独的test目录):

app/
+-- app.py
+-- config.py
+-- config_test.py
+-- model/
|   +-- __init__.py
|   +-- base.py
|   +-- base_test.py
|   +-- square.py
|   +-- square_test.py
+-- test.py
+-- web.py
+-- web_test.py
Run Code Online (Sandbox Code Playgroud)

以前,model包是model.py带有model_test.py测试套件的模块。

有一个顶级测试运行程序 -test.py并且工作正常。它在model目录中找到测试用例并成功运行它们(它使用了- 见文章结尾的discovery功能):unittesttest.py

$ python test.py
Run Code Online (Sandbox Code Playgroud)

但是,我也希望能够直接运行model目录中的测试用例:

$ python model/base_test.py
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为测试在包目录中。代码中的导入失败,因为它们要么在由测试套件直接导入时不在模块中,要么搜索路径错误。

例如,在 中model/square.py,我可以base.py通过以下两种方式之一导入:

from model import Base
Run Code Online (Sandbox Code Playgroud)

或者

from .base import …
Run Code Online (Sandbox Code Playgroud)

python unit-testing

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