小编Joh*_*nck的帖子

在sscanf中逃离方括号]

我想扫描像

"[25, 28] => 34"
Run Code Online (Sandbox Code Playgroud)

我写了一个小程序来测试它:

#include <cstdlib>
#include <iostream>

int main() {
        char* line = "[25, 28] => 34";
        char a1[100],  a2[100];
        int i;
        sscanf(line, "[%[^,], %[^\]] => %i", a1, a2, &i);
        std::cout << "a1 = " << a1 <<"\na2 = " << a2 << "\ni = "<<i <<"\n";
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译这给出了

warning: unknown escape sequence '\]'
Run Code Online (Sandbox Code Playgroud)

和输出

a1 = 25
a2 = 28
i = -1073746244
Run Code Online (Sandbox Code Playgroud)

如果我改成它

sscanf(line, "[%[^,], %[^]] => %i", a1, a2, &i);
Run Code Online (Sandbox Code Playgroud)

我没有得到编译器投诉但仍然

a1 …
Run Code Online (Sandbox Code Playgroud)

c parsing escaping scanf format-specifiers

6
推荐指数
2
解决办法
6895
查看次数

boost :: python和set :: erase - >奇怪的行为

我正在尝试将对象存储在std :: set中.这些对象是来自python环境的boost :: shared_ptr <>.向集合中添加值不会导致任何麻烦.但是当我尝试擦除一个值时,即使我传递了相同的引用,它也无法工作.这是一个例子:

#include <set>
#include <iostream>

#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>

using namespace std;
using namespace boost;
using namespace boost::python;

struct Bar
{
    Bar() {}
};

struct Foo
{
    set< shared_ptr<Bar> > v_set;
    shared_ptr<Bar> v_ptr;

    Foo() {}

    void add( shared_ptr<Bar> v_param ) {
    cout << "storing " << v_param << "in v_set and v_ptr" << endl;
    v_set.insert(v_param);
    v_ptr = v_param;

    }

    void del( shared_ptr<Bar> v_param ) {
    cout << "deleting " << v_param << endl;
    if (v_param …
Run Code Online (Sandbox Code Playgroud)

c++ boost shared-ptr boost-python c++11

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

Python Twisted与Cmd模块的集成

我喜欢Python的TwistedCmd.我想一起使用它们.

我有一些工作,但到目前为止,我还没有想出如何使标签完成工作,因为我没有看到如何在Twisted的LineReceiver中立即接收Tab键盘事件(不按Enter键).

到目前为止,这是我的代码:

#!/usr/bin/env python

from cmd import Cmd
from twisted.internet import reactor
from twisted.internet.stdio import StandardIO
from twisted.protocols.basic import LineReceiver

class CommandProcessor(Cmd):
    def do_EOF(self, line):
        return True

class LineProcessor(LineReceiver):
    from os import linesep as delimiter # makes newline work

    def __init__(self):
        self.processor = CommandProcessor()
        self.setRawMode()

    def connectionMade(self):
        self.transport.write('>>> ')

    def rawDataReceived(self, data):
        self.processor.onecmd(data)
        self.transport.write('>>> ')

StandardIO(LineProcessor())
reactor.run()
Run Code Online (Sandbox Code Playgroud)

除了标签完成,这有点起作用.我可以输入"help"之类的命令,Cmd模块将打印结果.但是我已经失去了Cmd模块的漂亮的tab-complete功能,因为Twisted一次缓冲一行.我尝试设置LineProcessor.delimiter为空字符串,无济于事.也许我需要找一些其他的Twisted而不是LineReceiver?或者也许有一种更简单的方法可以避免我必须逐个处理每个字符?

我不能单独使用Cmd,因为我想把它变成一个网络应用程序,其中一些命令将导致发送数据,并且从网络接收数据将异步发生(并显示给用户).

因此,无论我们从上面的代码开始还是完全不同的东西,我都想在Python中构建一个友好的,友好的终端应用程序,它响应网络事件和标签完成.我希望我可以使用已经存在的东西而不必自己实施太多.

python stdin twisted tab-completion python-cmd

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

在bash脚本中运行vi并执行vi命令以编辑另一个文件

所以我制作了一个从许多不同文件中收集数据的脚本:

#!/bin/bash

mkdir DATAPOOL"$1"

grep achi *out>runner
grep treat *out>>runner

cat runner | grep Primitive *gout | grep '=   '|awk '{print $1,$6}' > CellVolume"$1".txt 
cat runner | grep ' c ' *gout | grep 'Angstrom   '|awk '{print $1,$3}' > Cellc"$1".txt 
cat runner | grep 'Final energy ' *gout |awk '{print $1,$5}' > CellEnergy"$1".txt
Run Code Online (Sandbox Code Playgroud)

等等

cat runner |awk '{print "~/xtlanal",$1," > ",$1}' >runner2
vi runner2
:1,$s/gout:/xtl/
:1,$s/gout:/dat/
:wq

source runner2

grep Summary *dat | grep 'CAT-O  ' |awk '{print $1,$6}' > …
Run Code Online (Sandbox Code Playgroud)

vi bash shell terminal editor

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

可以在gdb中调用内联函数和/或使用GCC发出它们吗?

我们都知道内联函数可以使调试变得更加棘手,因为它们可以从堆栈跟踪等中省略.但是假设我想从gdb中调用内联函数,并且我知道它的名称及其参数.我想我应该能够做到这一点,但我得到了这个:

Cannot evaluate function -- may be inlined
Run Code Online (Sandbox Code Playgroud)

我曾经nm在我正在使用的共享库中列出符号,并发现我想调用的函数不在那里.没什么大惊喜.我想要的是一种生成这些内联函数的可见定义的方法.我可以访问当前包含内联定义的头文件,但我无法真正修改这些头文件.也许有一些方法可以告诉编译器发出它在翻译单元中看到的所有内联函数的定义?或者其他一些技巧可以让你更容易调用和检查gdb中的内联函数的结果?

我在Linux上使用GCC 4.7.2和GDB 7.5.1.而且我无法真正切换到非优化版本,因为我正在从生产中调试核心转储(在开发中我只是关闭优化,然后事情变得更容易).

c c++ debugging gdb inline-functions

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

计算两个字符串之间的差异

我正在尝试计算两个导入字符串(seq1和seq2,未列出的导入代码)之间的差异数量,但在运行程序时没有得到任何结果.我希望输出读取类似"2差异"的内容.不知道我哪里错了...

def difference (seq1, seq2):    
    count = 0
    for i in seq1:
        if seq1[i] != seq2[i]:
            count += 1
        return (count)
    print (count, "differences")
Run Code Online (Sandbox Code Playgroud)

python

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

boost :: filesystem :: create_directories(".")失败

boost::filesystem::create_directories(".")总是在我的系统上失败.看起来这可能是一个错误,但在阅读文档后我并不完全确定.这是一个示例程序:

#include <iostream>
#include <boost/filesystem.hpp>

int main(int argc, char* argv[])
try
{
    namespace fs = boost::filesystem;
    std::cerr << "is_directory: " << fs::is_directory(argv[1]) << '\n';
    std::cerr << "create_directory: " << fs::create_directory(argv[1]) << '\n';
    std::cerr << "create_directories: " << fs::create_directories(argv[1]) << '\n';
}
catch (const std::exception& ex)
{
    std::cerr << ex.what() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

如果我使用参数.(意味着当前目录)运行它,它会打印:

is_directory: 1
create_directory: 0
boost::filesystem::create_directories: Invalid argument
Run Code Online (Sandbox Code Playgroud)

前两行并不令人惊讶:.是一个目录,并create_directory()记录下来:

由于p解析为现有目录,因此创建失败不应视为错误.

但第三行对我来说是一个惊喜:create_directories(".")即使.存在也失败了.如果你使用不同的名字就没有这样的失败,比如foo- 它会愉快地创建那个目录,或者如果它已经存在则返回false.

文档有这样的说法:

效果:通过为不存在的p的任何元素调用create_directory()来建立后置条件.

后置条件:is_directory(p) …

c++ boost working-directory boost-filesystem

6
推荐指数
0
解决办法
3137
查看次数

MPI mpirun execvp错误:没有这样的文件或目录

我正在尝试使用MPI运行c ++代码(BCparallel.cpp); 用以下代码编译代码:

 mpic++ BCparallel.cpp -o BCparallel
Run Code Online (Sandbox Code Playgroud)

很成功,但当我通过这条线

 mpiexec -np 4 BCparallel file.txt
Run Code Online (Sandbox Code Playgroud)

它回来了

[proxy:0:0@lps-Inspiron-5537] HYDU_create_process 
(utils/launch/launch.c:75): execvp error on file BCparallel (No such 
file or directory)
[proxy:0:0@lps-Inspiron-5537] HYDU_create_process 
(utils/launch/launch.c:75): execvp error on file BCparallel (No such 
file or directory)
[proxy:0:0@lps-Inspiron-5537] HYDU_create_process 
(utils/launch/launch.c:75): execvp error on file BCparallel (No such 
file or directory)
[proxy:0:0@lps-Inspiron-5537] HYDU_create_process 
(utils/launch/launch.c:75): execvp error on file BCparallel (No such 
file or directory)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

mpi

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

Google Sparsehash在类型上使用realloc(),这不是简单的可复制

考虑这个简单的程序:

#include <string>
#include <sparsehash/dense_hash_map>

int main()
{
    google::dense_hash_map<std::string, int> map;
    map["foo"] = 0;
}
Run Code Online (Sandbox Code Playgroud)

使用GCC 8.2和-Wclass-memaccess(或-Wall)进行编译会产生警告:

sparsehash/internal/libc_allocator_with_realloc.h:68:40: warning:
‘void* realloc(void*, size_t)’ moving an object of non-trivially copyable type
    ‘struct std::pair<const std::__cxx11::basic_string<char>, int>’;
use ‘new’ and ‘delete’ instead [-Wclass-memaccess]
    return static_cast<pointer>(realloc(p, n * sizeof(value_type)));
                                ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

问题是:

  1. 是不确定的行为?
  2. 您能否建议可以应用于应用程序代码的修复或解决方法(不是通过更改Sparsehash或避免使用它)?
  3. (加分点)你能构造一个实际上由于这个而行为不正常的程序(使用std :: string或你自己的非平凡类型)?到目前为止,我还没有看到使用std :: string作为密钥类型的代码中的任何问题,尽管std :: string必须是一个非常常用的密钥类型.

我在这里提出了一个问题:https://github.com/sparsehash/sparsehash/issues/149

c++ realloc undefined-behavior sparsehash gcc8

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

CMake:如何获取安装规则的目标位置

我有一个CMakeLists.txt可以做到这一点:

get_target_property(myloc mytarget LOCATION)
Run Code Online (Sandbox Code Playgroud)

它曾经可以正常工作,但是不建议使用CMake 3.0 LOCATION(请参阅https://cmake.org/cmake/help/v3.0/policy/CMP0026.html)。所以我尝试使用生成器表达式:

set(myloc $<TARGET_FILE:mytarget>)
Run Code Online (Sandbox Code Playgroud)

这似乎是可行的,除了生成器表达式不是在任何地方都被求值,它们似乎仅在设置其他目标的属性时起作用,并且在“生成”步骤而不是之前的“配置”步骤中得到解析。问题是,我需要知道install()规则中的目标位置,如下所示(实际用途并不重要,strip但这无关紧要):

install(CODE "execute_process(COMMAND strip ${myloc})")
Run Code Online (Sandbox Code Playgroud)

使用时可以很好地工作,LOCATION但是现在已经过时了,我想不通正确的方法。问题的根源似乎install()是在目标路径未知时在“配置”步骤中调用的。

如何在调用之前弥合这一差距,并像以前一样发现目标输出路径install()

cmake

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