小编thi*_*ton的帖子

是否使用增量(operator ++)浮动坏样式?

在浮点数上使用递增运算符(++)是否被视为"坏样式"?它编译得很好,但我发现它很臭,反直觉.

问题:在什么情况下使用++浮点变量合理且优于+= 1.0f?如果没有用例,是否有一个值得尊敬的C++风格指南明确表示浮在上面的++是邪恶的?

对于float ++,不会增加最小的可能值,而是增加1.0.1.0f没有特殊含义(与整数1不同).它可能使读者感到困惑,导致他认为变量是int.

对于float,不保证operator ++更改参数.例如,以下循环不是无限的:

float i, j;
for (i=0.0, j=1.0; i!=j;i=j++);
Run Code Online (Sandbox Code Playgroud)

因此,在紧接着之后执行++并不能保证该值不变.

c++ floating-point coding-style

22
推荐指数
4
解决办法
3万
查看次数

不支持的操作.由JRC引擎处理的文档无法在C++堆栈中打开

当我在后端使用oracle 10g数据库在windows server 2003上部署我的asp.net网站时.我使用sap crystal report version 13.0.2000.0它给出了错误

Unsupported Operation. A document processed by the JRC engine cannot be opened in the C++ 
stack.Description: An unhandled exception occurred during the execution of the current web request.
Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.InteropServices.COMException: Unsupported Operation. A document processed by the JRC engine cannot be opened in the C++ stack.
Run Code Online (Sandbox Code Playgroud)

来源错误:

在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.

堆栈跟踪:

[COMException (0x80041811): Unsupported Operation. …
Run Code Online (Sandbox Code Playgroud)

c++ asp.net sap crystal-reports

19
推荐指数
3
解决办法
4万
查看次数

将线性代数库与Boost :: Units组合在一起

我正在进行大量的科学编程,并使用Boost.Units提供了非常好的经验,它提供了数量的编译时尺寸分析(即带有单位的标签数量,从而通过经典物理尺寸分析捕获了许多误差)并使用了Eigen 2代表线性代数.

然而,Eigen没有单位的概念,虽然你可以在Eigen的矩阵中设置标量,但是它期望两个量的乘法产生相同的类型,这对于单位来说显然是不正确的.例如,代码如:

using boost::units::quantity;
namespace si = boost::units::si;
Eigen::Matrix< quantity< si::length >, 2, 1 > meter_vector;
quantity< si::area > norm = meter_vector.squaredNorm();
Run Code Online (Sandbox Code Playgroud)

不起作用,即使它在逻辑上是正确的.

有没有支持单位的矩阵库?我知道这在过去很难实现,而且C++ 11 decltype会更容易实现,但是C++ 03和模板专业化肯定是可能的.

c++ boost linear-algebra eigen boost-units

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

指向一个模板化函数的不同实例的指针保证比较不相等?

假设指向一个模板化函数的不同实例的两个函数指针将比较不相等是否安全?即使模板化的函数根本不使用模板参数,因此在每种情况下都完全相同?

例如,以下在我的编译器上工作正常,但我不确定它是否在其他任何方面:

class TypeChecker
{
public:
    template< typename T > static void foo( void )
    {}
    template< typename T > static void setType( void )
    { s_fooPtr = &foo< T >; }
    template< typename T > static bool checkType( void )
    { return ( s_fooPtr == &foo< T > ); }
private:
    static void ( * s_fooPtr )( void );
};

void ( * TypeChecker::s_fooPtr )( void ) = 0;

int main( void )
{
    TypeChecker::setType< char >();
    TypeChecker::checkType< char …
Run Code Online (Sandbox Code Playgroud)

c++ templates function-pointers

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

如何在读取无符号整数时检测负数作为解析错误?

我想从C++ iostream中读取基数为10(十进制)表示的无符号整数,至少具有基本的错误检测.在我看来,减号在这种情况下显然是一个错误,因为无符号整数没有任何符号.但是,gcc的观点不同:

#include <iostream>
#include <sstream>

int main() {
    std::stringstream a("5"), b("-0"), c("-4");
    unsigned int i;
    a >> i; if ( a ) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
    b >> i; if ( b ) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
    c >> i; if ( c ) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给我一个输出

4294967292
Run Code Online (Sandbox Code Playgroud)

对于最后一行,好像已经读取了有符号整数-4并将其转换为unsigned int. …

c++ iostream

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

编写编译器:如何使简单的模板工作?

我有一种语言与C++类似的语法.词法分析器和解析器就位并产生正确的AST.对于最大的部分,后端也已完成.

编译器用于创建类型的基本系统非常简单:所有类型都被认为是内置的,所有实例都是全局的.因此,只有一个简单的映射,它将类型名称与创建变量的方法相匹配,该变量基本上是一个泛型类型,如boost :: any.另一个变量名称为key且Variable为value的映射用作全局范围:

std::map< std::string, std::function< Variable() > typeList;

  //register some types
typeList[ "X" ] = Variable::Create<X>;
typeList[ "Y" ] = CreateInstanceOfY;
....
Run Code Online (Sandbox Code Playgroud)

当编译器获得AST节点进行初始化时就像X myVar;它基本上一样

std::map< std::string, Variable > globalScope;
globalScope[ "myVar" ] = typeList[ "X" ]();
Run Code Online (Sandbox Code Playgroud)

当稍后使用myVar时,可以通过简单的类型调度来访问它

X& x = myVar.GetReference<X>();
Run Code Online (Sandbox Code Playgroud)

现在我想扩展一下并使用简单的模板.假设存在使用向量实现的类型"数组".我可以注册一切像

typeList[ "array<X>" ] = Variable::Create< std::vector< X > >;
Run Code Online (Sandbox Code Playgroud)

但这不是很可管理的,因为它必须对所有组合重复.理想情况下,我需要功能允许写这样的东西:

typeList.CreateTemplateVariable( "array", "X" )
Run Code Online (Sandbox Code Playgroud)

然后会创建一个内部包含std :: vector <X>的Variable实例.我努力了,但无法弄清楚如何做到这一点.也许我只是用简单的类型映射开始了错误的方式,这就是我无法理解它的原因.

所以问题很简单:是否可以这样做?如何?

c++ compiler-construction abstract-syntax-tree c++11

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

Autoconf子目录与子包相互依赖?

我手上有一个大项目(主),它被分成几个组件(liba,b,c,d),以便于构建和维护.构建整个包时,必须按顺序构建所有子组件,其中一些组件相互依赖.

更明确地说,liba是b,c和d的先决条件,并且配置脚本会检查liba的存在.在构建b分发时,必须进行此检查以提供用户友好的错误消息.但是,在构建主包及其所有子包时,liba将构建为子目标.因此,当在主套件上运行configure时,尚未安装liba,并且b中的liba检查失败.

我可以通过将--with-liba = internal或类似的标志传递给b的configure脚本来纠正这个问题; 但是,我没有找到关于autoconf这种标志传递的任何文档.暂且,我已经在主长很长的定制生成文件,不只是一样与子目录的autoconf/automake的,但重新排序依赖性的位,而不是(配置利巴)=>使得(配置B)=>(建liba)=>(构建b),顺序是(configure liba)=>(build liba)=>(install liba)=>(configure b)=>(build b).

知道如何用标准的autoconf/automake子目录重构这个吗?

automake autoconf packaging autotools software-packaging

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

当我重构时,如何确保不破坏测试代码?

代码不断发展,如果没有修剪,它也会衰减,在这方面有点像花园.修剪意味着重构以使其实现其不断发展的目的.

如果我们有良好的单元测试覆盖率,重构会更安全.测试驱动的开发迫使我们在生产代码之前首先编写测试代码.因此,我们无法测试实现,因为没有.这使得重构生产代码变得更加容易.

TDD周期是这样的:编写测试,测试失败,编写生产代码直到测试成功,重构代码.

但是从我所看到的,人们重构生产代码,而不是测试代码.随着测试代码的衰减,生产代码将变得陈旧,然后一切都走下坡路.因此,我认为有必要重构测试代码.

问题在于:如何确保在重构​​时不破坏测试代码?

(我已经采用了一种方法,https://thecomsci.wordpress.com/2011/12/19/double-dabble/,但我认为可能有更好的方法.)

显然有一本书,http://www.amazon.com/dp/0131495054,我还没有读过.

还有一个关于此的Wiki页面http://c2.com/cgi/wiki?RefactoringTestCode,它没有解决方案.

tdd refactoring unit-testing

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

可以建立一个visual studio-2010项目吗?

我有一个visual studio-2010项目,其中包含许多源文件和头文件.现在我需要在最新的Debian GNU/Linux下自动生成这个项目.所以我选择使用MinGW.但是我需要这个visual studio项目的makefile.有没有一种简单的方法将vs项目转换为makefile?或者MinGW可以使用其他软件包或库直接构建可视化工作室项目吗?任何想法将不胜感激.

mingw makefile visual-studio-2010 mingw32

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

为什么返回后的语句会改变返回值?

C++在以下代码中返回无效值:

#include <iostream>
#include <vector>

using namespace std;

int f(){
    vector< int * > v[2];
    return 1;
    v[1].push_back(NULL);
}

int main(){
    cout << f();
}
Run Code Online (Sandbox Code Playgroud)

输出是:

205960
Run Code Online (Sandbox Code Playgroud)

当我在返回后通过线路时,它工作正常:

#include <iostream>
#include <vector>

using namespace std;

int f(){
    vector< int * > v[2];
    return 1;
    //v[1].push_back(NULL);
}

int main(){
    cout << f();
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1
Run Code Online (Sandbox Code Playgroud)

我使用mingw32-g ++.exe编译器的code :: blocks.mingw版本是:gcc版本4.4.1(TDM-2 mingw32).

c++

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