как назначить массив из списка инициализаторов

У меня ограниченные знания о 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,

Я был бы признателен, если кто-то может помочь.


person Dalek    schedule 11.05.2015    source источник
comment
Похоже, ваш компилятор не находится в режиме совместимости с С++ 11 (или не поддерживает его)? Какой компилятор вы используете?   -  person Michael Dorgan    schedule 12.05.2015
comment
Ну, там написано, что вы должны использовать флаг -std=c++11. Так почему бы и нет?   -  person MikeMB    schedule 12.05.2015
comment
@MikeMB ошибка сама по себе не из-за отсутствия поддержки c++11. Даже с -std=c++11 вы все равно получите ту же ошибку (но не предупреждение). Вы получаете предупреждение даже в коде C++98, поскольку современные компиляторы g++ (›=4.9) интерпретируют фигурные скобки как std::initializer_list (даже если вы не компилируете с -std=c++11). Они рассматривают это как расширение, и оно включено по умолчанию (см. предупреждающее сообщение).   -  person vsoftco    schedule 12.05.2015
comment
@vsoftco: Вы, конечно, правы - сначала мне нужно было поближе взглянуть на код. Но я бы все же рекомендовал использовать флаг С++ 11, если это возможно.   -  person MikeMB    schedule 12.05.2015
comment
@MikeMB, это действительно хороший момент, поскольку некоторые C ++ 11 не реализованы в виде расширений, и если код их использует, он не будет компилироваться без -std=c++11.   -  person vsoftco    schedule 12.05.2015


Ответы (3)


Вы не можете присваивать непосредственно массиву после его объявления. В основном ваш код такой же, как

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
 }
person vsoftco    schedule 11.05.2015

когда ты сказал:

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

это было неправильно, потому что С++ не позволяет переназначать значения массива. Существует легкая работа вокруг, но это несколько утомительно. Все, что вам нужно сделать, это присвоить значения одно за другим. Например:

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

и так далее. У меня была такая же проблема в программе Arduino.

** Я НЕ знаток С++, поэтому это может быть некорректно.

person Miles C.    schedule 20.02.2020

Массив - это просто указатели. C++ (язык программирования, основанный на символах) имеет свои собственные интерпретации массивов. Значение:

интервал* а[3]; вы объявили массив, но в настоящее время значения, присвоенные каждому элементу, представляют собой некоторые ненужные значения, которые уже были сохранены в ячейке памяти, выделенной для вашего массива.

а={1,2,3}; не будет работать, потому что: С++ обрабатывает имя массива «a» как указатель, указывающий на адресное расположение 1-го элемента в массиве. 'a' в основном интерпретируется C++ как '&a[0]', который является адресом элемента a[0]

Итак, у вас есть 2 способа присвоения значений

  1. использование индексации массива (единственный вариант, если вы не знаете, что такое указатели)

    интервал [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', и в любом случае использование ++ приведет к ошибке компилятора.

Рекомендую прочитать книгу Стивена Дэвиса C++ для чайников.

person user13833197    schedule 29.06.2020
comment
Массивы не являются указателями, они сами по себе являются типами, например. sizeof(int[2][2]) равно 4 * sizeof(int), а не sizeof(int*) или 2 * sizeof(int*). Массив может быть присвоен указателю соответствующего типа, но это разные типы (и я рассматриваю такое поведение присваивания как дефект C и C++). - person Hugo Burd; 02.02.2021