小编Ark*_*ady的帖子

如何提升自动链接作出选择?

当我使用Visual Studio 2012时,使用自动链接,我不需要手动添加boost/POCO/python库,它们会自动添加.如果我错过任何图书馆,我会得到这样的信息:

链接:致命错误LNK1104:无法打开文件'libboost_system-vc110-mt-1_55.lib'

但它如何知道我想要链接哪个文件?也许我想动态链接,使用boost_system-vs110-mt-1_55.lib,或者我想在名称中使用gdsgd

它是如何做出选择的?

问题是,我的程序正在寻找libboost_ ...(即静态)库,当搜索系统,线程等时,但它想要python的boost_(即动态),我只是不明白为什么?

c++ boost visual-studio-2012

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

"catch"无法从库中捕获异常

我在库中有这个方法:

#include <stdexcept>

mytype* myfunc()
{
  throw std::runtime_error("is uncatchable");
}
Run Code Online (Sandbox Code Playgroud)

这是int main()链接库的可执行过程.

  try {  myfunc(); }
  catch(std::exception const& ex) { std::cout << "handled: " << ex.what() << std::endl;  }
  catch(...) {   std::cout << "something else..." << std::endl;  }
Run Code Online (Sandbox Code Playgroud)

这是输出:

terminate called after throwing an instance of 'std::runtime_error'
  what(): is uncatchable
Abort (core dumped)
Run Code Online (Sandbox Code Playgroud)

问题:为什么异常没有被捕获?

我不管理我的编译器标志(icc-11.X),OS也不在我的控制之下.

编译器标志列表:

-DLINUX -DLINUX_X64 -DGNU_SOURCE -fPIC -Wcheck -Wshadow -Wdeprecated -Wreturn-type -Wcomment -Wmissing-prototypes -Wp64 -Drcsid="__attribute__((used)) rcsid" 
-D__EXTENSIONS__ -D__STD_C__ -D_XOPEN_SOURCE=500 -D_GNU_SOURCE -DNDEBUG  
Run Code Online (Sandbox Code Playgroud)

__EXCEPTIONS 被定义为.

可能存在导致这种情况的Linux设置吗?

可能存在导致这种情况的编译器设置吗?

c++ linux exception

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

一个编译单元中的静态初始化

静态初始化以及描述的内容,在这里在这个网站,甚至在这里

在任何地方都写出如果存在具有相关静态变量的不同编译单元,则会出现问题.如果一个编译单元中存在静态变量,则应该没有问题:它们将按照它们在文件中的位置的顺序进行初始化.

但我有这个代码:

template <typename T>
class A{
public:
    int _data;
    T _obj;
    A(int data) :_data(data){}
};

template <typename T>
class B{
public:
    const static B<T> nullObj;
    B(int data) :_a(new A<T>(data)){}
    A<T> *_a;
};

template <typename T>
class C{
public:
    const static C<T> nullObj;
    C() :_a(nullObj._a){}
    C(bool t) :_a(B<T>::nullObj._a){
        _a->_data++; //FAILS HERE!
    }
    A<T> *_a;
};

template <typename T>
const B<T> B<T>::nullObj(0);

template <typename T>
const C<T> C<T>::nullObj(false);

class _B{};
class  _A{ public: _A(){}; C<_B> g; }; …
Run Code Online (Sandbox Code Playgroud)

c++ static templates

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

带有 xpath 和带有前缀的命名空间的 python etree

我找不到信息,如何使用命名空间解析我的 XML:

我有这个xml:

<par:Request xmlns:par="http://somewhere.net/actual">
  <par:actual>blabla</par:actual>
  <par:documentType>string</par:documentType>
</par:Request>
Run Code Online (Sandbox Code Playgroud)

并试图解析它:

dom = ET.parse(u'C:\\filepath\\1.xml')
rootxml = dom.getroot()
for subtag in rootxml.xpath(u'//par:actual'):
    #do something
    print(subtag)
Run Code Online (Sandbox Code Playgroud)

并且得到了异常,因为它不知道命名空间前缀。有没有最好的方法来解决这个问题,计算那个脚本不会知道它要解析的文件和标签要搜索的文件?

搜索网络和 stackoverflow 我发现,如果我会在那里添加:

namespace = {u'par': u"http://somewhere.net/actual"}
for subtag in rootxml.xpath(u'//par:actual', namespaces=namespace):
    #do something
    print(subtag)
Run Code Online (Sandbox Code Playgroud)

那个有效。完美的。但是我不知道我将解析哪个 XML,并且//par:actual我的脚本也不知道搜索标记(例如)。所以,我需要找到从 XML 中提取命名空间的方法。

找了很多方法,如何提取namespace URI,比如:

print(rootxml.tag)
print(rootxml.xpath('namespace-uri(.)'))
print(rootxml.xpath('namespace-uri(/*)'))
Run Code Online (Sandbox Code Playgroud)

但是我应该如何提取前缀来创建 ElementTree 想要的字典?我不想在 xml 正文上使用正则表达式怪物来提取前缀,我相信必须存在支持的方式,不是吗?

也许必须存在一些方法让我通过 ETree 命名空间从 XML 中提取作为字典(如 ETree 想要的!)而无需手动操作?

python prefix elementtree xml-namespaces

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

在linux中创建子进程并处理可能失败的最佳方法

我有父进程,必须创建几个子进程.我发现最好的方法是使用fork+ execl.但是父进程需要知道execl具体的孩子是否失败,我不知道如何实现.

        int pid = fork();
        if (pid < 0) {
           std::cout << "ERROR on fork." << std::endl;
        } if (pid == 0) {
           execl("/my/program/full/path", (char *)NULL);
           exit(1);
        }
        else {
            if (/*child's process execl fails*/) {
                std::cout << "it failed" << std::endl
            } else {
                std::cout << "child born" << std::endl
            }
        }
Run Code Online (Sandbox Code Playgroud)

我认为这个想法并不好:

int status(0);
sleep(100);
int res = waitpid(pid, &status, WNOHANG);
if (res < 0 && errno == 10) {
    std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ linux fork exec

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

如何在Windows上运行pip?

如何在Windows上运行pip?

我理解,这可能是一个非常愚蠢的问题,但所有指南,整个网络都有相同的:

$ pip install <package>
Run Code Online (Sandbox Code Playgroud)

但我应该在哪里找到这个"$"?它不是Windows控制台.它不是Python控制台.它们的组合并不相同.我应该在Windows上哪里找到这个神奇的"$"?

python windows pip

4
推荐指数
2
解决办法
5320
查看次数

使用参数导入python脚本

我有脚本:

moving1.py:

def move():
    print("walk!")
Run Code Online (Sandbox Code Playgroud)

moving2.py:

def move():
    print("run!")
Run Code Online (Sandbox Code Playgroud)

man.py,可以通过参数move1或moving2脚本来接受.

man.py:

import sys

if len(sys.argv) <= 1:
    exit("Too less arguments calling script")

__import__(sys.argv[1])
moving = sys.modules[sys.argv[1]]

def move():
    moving.move()
Run Code Online (Sandbox Code Playgroud)

现在我有testman.py脚本,必须测试man.py执行的所有变体:

testman.py

import man #and somehow add here as argument "moving1"
man.move()

import man #and somehow add here as argument "moving2"
man.move()
Run Code Online (Sandbox Code Playgroud)

存在许多类似的问题,但它们并不完全符合我的要求.如何为导入的脚本添加参数?问题不是检查

if __name__ = "__main__":
Run Code Online (Sandbox Code Playgroud)

在那里,问题是使用我想要的参数完全导入脚本.可能吗?

python import arguments

4
推荐指数
2
解决办法
9220
查看次数

奇怪的python类型"文字"?

我使用库"suds"与SOAP服务器进行通信.请求成功完成后,我收到回答:

answer = client.invoke('RetrieveBLABLAObject', modelthings)
Run Code Online (Sandbox Code Playgroud)

这个答案是所请求对象的许多不同领域的结构.每个字段都是由"字符串"参数"_type"和参数"value"组成的结构,它们可以具有不同的类型.

answer [key] [value] - 返回参数"value"的值.但是在调试模式下(我使用Python 2.7.6和PyCharm),它告诉我该值的类型为"Text".不是"str",不是"unicode",而是"Text".

如果我检查一下

isinstance(obj[cur_key]['value'], unicode)
Run Code Online (Sandbox Code Playgroud)

它告诉我,它将此文本视为"unicode".但是,如果我将它与具有相同主体的unicode进行比较,则返回false:

if obj[cur_key]['value'] != u'String that I know is there':
    print("true") #it is printing, but it shouldn't
Run Code Online (Sandbox Code Playgroud)

为什么会这样?如何将"Text"转换为unicode?我试过了

obj[cur_key]['value'].decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

它除外.我该如何处理这种"文字"类型?

python suds

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

如何避免可能丢失数据的警告?

我得到了相当旧的代码,存在这样的天延迟计算:

#define _SECOND ((ULONGLONG) 10000000)
#define _MINUTE (60 * _SECOND)
#define _HOUR   (60 * _MINUTE)
#define _DAY    (24 * _HOUR)

FILETIME CurTime;
GetSystemTimeAsFileTime(&CurTime);

ULONGLONG qwCurResult = (((ULONGLONG)CurTime.dwHighDateTime) << 32) + CurTime.dwLowDateTime;

DWORD days = (qwCurResult - SomeULONGLONGMoment) / _DAY;
Run Code Online (Sandbox Code Playgroud)

当然我收到消息

warning C4244: 'argument' : conversion from 'ULONGLONG' to 'DWORD', possible loss of data
Run Code Online (Sandbox Code Playgroud)

在现代VS2013编译器.我知道,这将是可以在DWORD中存储的两个时刻之间的完整天数.如何避免这条消息?

我不想用这个号码禁用所有警告,因为在其他地方它们可能非常有用.是否存在避免可能的数据丢失的正确方法?除了DWORD之外,我无法计算任何类型的天数(或者我只会将带有此警告的地方移动到代码的其他部分).

如果你认为这是不可避免的,最好的解决方案是使用另一种获取当前日期的机制 - 我将能够使用它,只要有方法将SomeULONGLONGMoment(即ULONGLONG)转换为它使用的类型.

c++ winapi date data-loss

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

在哪里放置模板专业化

我发现模板专业化存在很奇怪的问题。

此处:类型特征 - 显式模板专业化。在 xcode 上失败

这里:C++ 模板专业化

据记载,成员函数模板特化必须在类之外,但在相同的命名空间中(是的,如果模板特化在类内部,gcc 4.1.x 版本会失败并出现错误)。

因此,如果我将成员函数模板专业化移动到类下面的同一命名空间中,那么 msvc-2010 编译器会认为我定义了它两次:我有编译器错误:

错误LNK1169:找到一个或多个多重定义的符号

错误LNK2005及其定义两次的详细描述。

如果我将同一命名空间下的模板专业化移动到cpp文件中,则 msvc-2010 看不到它,并且在尝试对专用参数使用默认模板函数时会失败并出现多个错误:

错误 C2678:二进制“>>”:找不到采用“std::istringstream”类型的左侧操作数的运算符(或者没有可接受的转换)

(发生错误是因为它尝试调用运算符 >> 到 const char 指针)

因此,当模板专门化位于类内部时,msvc-2010 对我有用,但 gcc-4.1.x 不起作用。

最后,我应该在哪里放置模板专门化,以便能够在两个编译器中编译它?

那是标题:

#include <iostream>
#include <sstream>
#include <string>
class MyMap
{
public:
   template<typename T>
   T getValue(std::string phrase, T def)
   {
     std::istringstream ss(phrase);
     T ret;
     ss >> ret;
     if(ss.fail() || !ss.eof())
        return def;
     else
        return ret;
   }
Run Code Online (Sandbox Code Playgroud)

而这个专业化(来自cpp,但我不知道它必须在哪里):

template<>
std::string  MyMap::getValue(std::string phrase, std::string def)    
{ 
   return …
Run Code Online (Sandbox Code Playgroud)

c++ gcc templates visual-studio-2010

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

在Windows中设置子进程名称?

我有进程,运行多次子进程(每个没有GUI),并且需要为任务管理器设置所有子进程不同的"名称"和"描述".是否可以使用Win API?我找不到Windows系列的解决方案.

我期待WriteProcessMemory,但它看起来像作弊的形式,即使有可能改变名称.复制.exe文件的解决方案,运行它,并在处理完成后删除它 - 更是作弊.可能存在使用内存中的启动过程的解决方案(因此,我将exe文件加载到内存中,然后从那里启动它),但它也看起来很糟糕,我不确定我是否能够更改名称.

我希望有必要解决方案将进程名称设置为我自己的子进程,不是吗?

c++ windows winapi

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