小编Leo*_*ang的帖子

C - 不同操作系统上complex.h中的意外行为

请考虑以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
int main()
{
   complex double aaa = INFINITY + 0*I;
   printf("%.f + %.f*I\n", creal(aaa), cimag(aaa));
   complex double bbb = 1.0/aaa;
   printf("%.f + %.f*I\n", creal(bbb), cimag(bbb));
   return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

编译时gcc -std=gnu99 -lm,我希望输出是

inf + 0*我

0 + 0*我

这在Linux上是正确的(在使用gcc 4.4.7的Scientific Linux 6.8,使用gcc 5.3.1的Fedora 23和使用gcc 4.8.4的Ubuntu 14.04.5上测试).

但是,在OS X(10.11.5与clang-602.0.53)而不是我得到

inf + 0*我

nan + nan*I

很明显,clang不符合C99标准(参见N1256,G.5.1节;严格来说,它仅仅是推荐的做法,而不是标准).事实上,clang没有__STDC_IEC_559_COMPLEX__定义宏,这是在Sec.G.1.clang故意这样做吗?更新:经过一些检查后,我发现我测试的几个Linux环境也没有定义这个宏,但代码仍能在那里正常工作.

目前,我对跨平台支持的解决方法是检查宏

#include <stdio.h>
#include <stdlib.h>
#include …
Run Code Online (Sandbox Code Playgroud)

c c99 clang

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

OpenMP 并行区域中嵌套函数的内部编译器错误

我尝试调用GSL库的蒙特卡罗积分子程序来进行一些数值计算。因为我的 for 循环相当简单,这意味着不同运行的结果是独立的,所以我预计使用 OpenMP 进行并行化应该非常简单。然而,当我编译它时,它总是显示“内部编译器错误:分段错误”,并且什么也没生成。这是我的代码:

#include <stdlib.h>
#include <omp.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_monte.h>
#include <gsl/gsl_monte_vegas.h>
#include <math.h>     

 double
 Reg1 (double *x, double t, size_t dim, void *params)
 {
     return sin(x[1])*cos(t*t)*x[0]*x[0]*cos(x[0])*cos(3*x[0]);
 }


 void
 display_results (char *title, double result, double error)
 {
   printf ("%s ==================\n", title);
   printf ("result = % .10f\n", result);
   printf ("sigma  = % .10f\n\n", error);
 }


 void
 VEGAS_integration_routine (double (*function)(double *, size_t, void *), 
                            double xl[], double xu[], size_t calls, gsl_rng * r)
 {
 double res, err;
     gsl_monte_function Function …
Run Code Online (Sandbox Code Playgroud)

gcc openmp gsl internal-compiler-error

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

如何初始化基类构造函数的向量?

我有一个base_class没有默认构造函数,我想定义它的矢量版本(调用derived_class).我知道我应该在base_class构造函数中初始化构造derived_class函数,但下面的代码尝试初始化一个大小dimbase_class(0,1)每行的向量都无法编译(它抱怨错误:'derived_class'的构造函数必须显式初始化基类'base_class',除非我添加默认构造函数(注释行),否则没有默认构造函数)base_class.我想念或误解了什么吗?有没有办法让它工作而不定义默认base_class构造函数?

#include <iostream>
#include <vector>

class base_class
{
   public:
      //base_class(){};
      base_class(double a, double b){a_=a; b_=b;}
   private:
      double a_, b_;
};

class derived_class : public base_class
{
   public:
      derived_class(int dim): vector_object(dim, base_class(0,1)){};
      std::vector<base_class> print_vector_object() {return vector_object;}
   private:
      std::vector<base_class> vector_object;
};


int main()
{
  int dim = 3;
  derived_class abc(3);
  std::cout << abc.print_vector_object().size() << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

更新:我理解在这个简单的例子中我可以完全避免继承,但请假设我确实需要继承实际练习,谢谢.

UPDATE2:正如 …

c++

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

标签 统计

c ×1

c++ ×1

c99 ×1

clang ×1

gcc ×1

gsl ×1

internal-compiler-error ×1

openmp ×1