小编Fad*_*mic的帖子

在C++中复杂变量的OpenMP减少的优雅(和典型)解决方法?

我意识到减少仅适用于C++中的POD类型.您将如何实现复杂类型累加器的减少?

complex<double> x(0.0,0.0), y(1.0,1.0);
#pragma omp parallel for reduction(+:x)
for(int i=0; i<5; i++)
{
    x += y;
}
Run Code Online (Sandbox Code Playgroud)

(注意到我可能已经遗漏了一些语法).似乎一个明显的解决方案是将实部和虚部分成临时双重,然后积累在那些上.我想我正在寻找优雅,这似乎......不仅仅是漂亮.这是典型的方法吗?

c++ openmp

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

如何在出错后结束C++程序?

我正在重构旧代码,我想解决的一个问题是处理错误的方式.我很清楚异常以及它们是如何工作的,但我并不完全确定它们是我正在尝试处理的情况的最佳解决方案.

在这段代码中,如果事情没有验证,那么解开堆栈真的没有理由或优势.我们完成了.尝试保存船只没有意义,因为它是一个非交互式代码,通过Sun Grid Engine并行运行.用户无法干预.更重要的是,这些验证失败并不真正代表特殊情况.他们是预料之中的.

那我该如何最好地解决这个问题呢?我不确定自己想要的一件事是每个类方法中的退出点都可能失败.这似乎无法维持.我错了吗?在这样的代码中调用exit()或abort()处于失败点是否可以接受?或者我应该一直抛出一个异常回到main中的一些泛型catch语句?有什么好处?

c++ error-handling

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

SRP没有违反封装

我无法将单一责任原则与封装协调一致.似乎在类之间分配责任需要暴露大量数据.举个例子,考虑一些叫做的对象DataPoints.DataPoints其中包括x和y坐标.我可以创建一个填充的Generator类DataPoints.现在,假设我想绘制这些数据点.显然,这是一个单独的责任,可能来自一个叫做的类DataPointsPlotter.但是为了绘制数据,我需要知道内部x和y坐标是什么.只需一个处理两个类,这没问题.x和y是内部变量,但create()和print()方法都可以访问这些变量.我可以暴露x和y(也许是通过getter/setters - 呃)或者我可以通过DataPointsPlotter类的结构,但它仍然需要进入x和y.我可以在DataPoints我发送x和y 的类中声明一个Plotter实例.但这仍然是曝光.

在这个例子中,如何使用绘图仪绘制x和y而不违反封装?

language-agnostic encapsulation single-responsibility-principle

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

当向量被清除时,stl向量内的stl向量是否超出范围?

在这段代码中:

class myClass
{
    ...
    vector<myThing> thing(10);
    vector<myStuff> stuff(10);
    ...
}

vector<myClass> vecClass(10);
...
vecClass.clear();  /// calls destructor on myClass instances
Run Code Online (Sandbox Code Playgroud)

每个元素vecClass保存10个元素向量的东西和东西.当clear()被调用时,是否会使事物和东西超出范围,从而被正确销毁?或者有什么明确的我必须做的事情?

c++ stl vector

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

Boost property_tree:每个键有多个值

Boost属性树看起来像是一个用于解析配置文件的优秀库.但是,我无法弄清楚如何处理每个键有多个值的情况.例如,假设我正在指定一个这样的框:

box
{
    x -1 1
    y -1 1
    z -1 1
}
Run Code Online (Sandbox Code Playgroud)

其中x,y和z是框的边界上x,y和z轴分别使用property_tree的INFO格式指定.我在手册中提到使用带有空格的值的引号,但后来我没有看到我可以将这些值作为数字导入.我必须将字符串解析为数字,这似乎首先打败了使用property_tree的目的.我当然可以给每个数字一个关键:

box 
{
    xlo -1
    xhi 1
    ylo -1
    yhi 1
    zlo -1
    zhi 1
}    
Run Code Online (Sandbox Code Playgroud)

但这似乎很麻烦,并会膨胀我的配置文件.我还注意到我可以在program_options中处理这种情况,但是我失去了嵌套的配置文件功能(是的,我知道我可以使用点符号来"嵌套",但它不一样).

有没有办法导入例如x作为这样的数字列表?

c++ boost configuration-files boost-propertytree

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

Intel MPI_SIZEOF 不适用于 Fortran 复杂类型

给出以下 Fortran 代码:

integer, parameter :: double = kind(1.0d0)

integer :: integerTest
real(double) :: doubleTest
complex(double) :: complexTest
integer :: testSize
integer :: ierr

integerTest = 0
doubleTest = real(0.d0, kind=double)
complexTest = cmplx(0.d0, 0.d0, kind=double)

call MPI_SIZEOF(integerTest, testSize, ierr)
! ...
call MPI_SIZEOF(doubleTest, testSize, ierr)
! ...
call MPI_SIZEOF(complexTest, testSize, ierr)
Run Code Online (Sandbox Code Playgroud)

使用 Intel MPI 编译时,出现错误:

error #6285: There is no matching specific subroutine for this generic subroutine call. [MPI_SIZEOF]
Run Code Online (Sandbox Code Playgroud)

在线上

 call MPI_SIZEOF(complexTest, testSize, ierr)
Run Code Online (Sandbox Code Playgroud)

使用 OpenMPI 编译和执行此代码不会出现任何问题。出现这个错误的原因是什么?看起来它正在寻找 类型的特定匹配complexTest …

fortran mpi intel-fortran

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

大小数字的C++标准库常量?

C++ std lib中有一个常量,意味着"最大可表示数"和"最小可表示数"吗?在Matlab中,我们有类似的东西EPS,realmax和realmin.我想知道是否有相当于C++的东西.

c++ standard-library

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

nullptr作为boost :: any map的标志值

如果我使用设置通用容器映射boost::any,并使用nullptrC++ 11中的新函数作为类似于isset()类型操作的初始化值,是否存在任何潜在的缺陷?

例如:

std::map<std::string, boost::any> map;
map["A"] = nullptr;
map["B"] = nullptr;
map["C"] = nullptr;
map["D"] = nullptr;

map["A"] = 1;
map["C"] = 3;

// assume error checking, other types, etc.
for(auto k : map) {
    if (k.second.type() != typeid(nullptr)) {
        std::cout << k.first << " : " << boost::any_cast<int>(k.second) << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

在C++ 11之前,我把它boost::any包装在带有a的结构中bool isset,但这似乎有效.任何陷阱?

c++ boost-any c++11

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

使用左值引用错误地调用右值引用构造函数

当我编译这段代码时:

class Base { /*...*/ };
class Derived : public Base { /*...*/ };

class C
{
public:
    template<typename T>
    C(T const& inBase) : baseInC(new T(inBase)) { /*...*/ }

    template<typename T>
    C(T&& inBase) : baseInC(new T(std::move(inBase))) { /*...*/ }

    std::unique_ptr<Base> baseInC;
};

int main()
{
    Base base;
    Derived derived;

    C ca(base);
    C cb(derived);

    C cc( (Base()) );
    C cd( (Derived()) );

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

我得到一个编译器消息:

In instantiation of C::C(T&&) [with T = Base&]': required from C ca(base); error: new cannot …

c++ rvalue-reference c++11

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