如何从初始化列表中分配数组

时间:2015-05-11 22:47:44

标签: c++ arrays initializer-list

我对 c ++ 的了解有限。我尝试编译 c ++ 库,当我运行以下头文件的make文件时

mcmc_dhs.h

#include <algorithm>
#include <map>

// intrinsic shape and (reduced) shear just add?
//#define WLNOISE

// use shear instead of reduced shear for model
//#define NOREDSHEAR

/// parameters for the M200-concentration relation
const number mcreal[2] = {9.59,-0.102}; // Dolag et al. (2004)
//const number mcreal[2] = {5.26,-0.100}; // Neto et al. (2007) [Millenium Run]

/// critical density at z=0 (h100=1) in [Msun/Mpc^3]
const number rhocrit = exp(log(rhoCrit)+3.*log(Mpc)-log(Msun)); 

/// two extra halo parameters: r200 (and concentration: 2)
#define PARAMS 1

/// define region (square; twice value here) about halo that considers sources for model
#define REGION 10.0*arcmin

class mcmc_dhs : public mcmc
{
 public:

  mcmc_dhs() : 
  data(), cosmohandler(0.3,0.7,0.21,0.8,0.04),
    lenseff(), intrvar()
    {
      boundaries = 
    {{0,512},{0,512},{0.01,5.},{100.,3000.},{0.1,50}};
    }
  ~mcmc_dhs() {}

  /// size of grid for looking up sources
  static const int Ngrid = 200;

它返回以下错误消息:

mcmc_dhs.h:55:67: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
      boundaries = {{0,512},{0,512},{0.01,5.},{100.,3000.},{0.1,50}};
                                                                   ^
mcmc_dhs.h:55:17: error: assigning to an array from an initializer list
      boundaries = {{0,512},{0,512},{0.01,5.},{100.,3000.},{0.1,50}};
                 ^
In file included from ../modules/matrix.h:15:0,
                 from ../modules/probdensity.h:4,
                 from ../modules/mcmc.h:4,
                 from mcmc_dhs.h:4,

如果有人可以提供帮助,我将不胜感激。

3 个答案:

答案 0 :(得分:10)

声明后,不能直接指定数组。基本上你的代码与

相同
int main()
{
    double arr[2][2];
    arr = { {1, 2}, {3, 4.5} }; // error
}

您必须在声明中指定值

double arr[2][2] = { {1, 2}, {3, 4.5} };

或使用循环(或std::copy)来分配元素。由于您的数组似乎是一个成员变量,您也可以在构造函数初始化列表中初始化它:

 mcmc_dhs() : data(), cosmohandler(0.3,0.7,0.21,0.8,0.04), 
              lenseff(), intrvar(), 
              boundaries{{0,512},{0,512},{0.01,5.},{100.,3000.},{0.1,50}}
 { 
    // rest of ctor implementation
 }

答案 1 :(得分:1)

数组本质上只是指针。 C ++(基于符号的编程语言)对数组有自己的解释。含义:

int * a [3];您已经声明了数组,但是当前分配给每个元素的值是一些垃圾值,这些值已经存储在分配给数组的内存位置。

a = {1,2,3};将无法使用,因为:C ++将数组名称“ a”视为指向数组中第一个元素的地址位置的指针。 C基本上将'a'解释为'&a [0]',这是元素a [0]的地址

因此,您有2种分配值的方法

  1. 使用数组索引(如果您不知道什么是指针,则只能使用此选项)

    int a [3]; for(int i = 0; i <3; ++ i)//使用for循环为每个元素分配一个值 { cin >> a [i]; }

2 将其作为指针并使用指针操作

    int a[3];
    for(int i=0;i<3;++i) // using for loop to assign every element a value
    {
    cin>>*(a+i); // store value to whatever it points at starting at (a+0) upto (a+2)
    }

注意:不能使用++ a指针操作,因为++会更改指针的位置,而a + i不会更改指针'a'的位置,无论如何使用++都会产生编译器错误。 / p>

推荐阅读Stephen Davis C ++的傻瓜书。

答案 2 :(得分:0)

当你说:

boundaries = 
{{0,512},{0,512},{0.01,5.},{100.,3000.},{0.1,50}};

这是不正确的,因为c ++不允许您重新分配数组值。可以轻松解决,但这有些乏味。您要做的就是一一指定这些值。 例如:

boundaries[0][0] = 0;
boundaries[0][1] = 512;
boundaries[1][0] = 0;
boundaries[1][1] = 512;

,依此类推。我在Arduino程序中遇到了同样的问题。

**我不是c ++鉴赏家,因此容易出错。