ошибка: выражение должно иметь целочисленный тип или тип enum с незаданной областью при постепенном заполнении векторов - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь заполнить массивы, начиная с начальных значений (местоположение в пространстве XYZ) и двигаться вперед в пространстве с помощью дискретного шага, чтобы заполнить 3D-поле.

Я не могу найти решение для этого сообщения об ошибке где-нибудь подобное.Большинство ответов на аналогичный вопрос связаны с синтаксической ошибкой.Может быть, мой тоже, я все еще относительно новичок в C и C ++.

Я пытался привести i к int при индексации в x_array, и он просто выдает еще более загадочную ошибку:

error: no operator "=" matches these operands operand types are: std::vector<float, std::allocator<float>> = float

Вот мой код:

atom_box build_box(
          vector<xyz_coords> all_atom_coords, vector<string> all_atom_names, vector<float> box_origin_coords,
          map<string, float> p_charge_map, map <string, float> solv_access_map,
          int box_size = 20, const int channels = 7, float voxel = 1.0)
{
  float x1,x2, y1,y2, z1,z2; // first and last values of the box
  const int  x_dim = box_size, y_dim = box_size, z_dim = box_size;
  atom_box box(channels, x_dim, y_dim, z_dim);
  map<char,int> atom_chann_map = {  {'N', 0}, {'C', 1}, {'O', 2}, {'S', 3}, {'H', 4}  };

  float delta =  box_size/2.0;
  //cout << "Delta: " << delta << endl;

  x1 = box_origin_coords[0] - delta; x2 = box_origin_coords[0] + delta;
  y1 = box_origin_coords[1] - delta; y2 = box_origin_coords[1] + delta;
  z1 = box_origin_coords[2] - delta; z2 = box_origin_coords[2] + delta;

  int size = (x2 - x1)/voxel + 1;
  vector<float> x_range[size], y_range[size], z_range[size];

  for (float i = 0, x = x1, y = y1, z = z1;
       i < size;
       i++, x += voxel, y += voxel, z += voxel)
  {
    x_range[i] = x; y_range[i] = y; z_range[i] = z;
  }

  return box;
}

1 Ответ

2 голосов
/ 09 мая 2019

Проблема проистекает из этой строки:

vector<float> x_range[size], y_range[size], z_range[size];

vector<float> x_range[size] объявляет массив векторов вместо одного вектора из-за квадратных скобок []. К сожалению, поскольку size не является константой времени компиляции, это нестандартное поведение, называемое массивом переменной длины, и ваш компилятор допускает его только как причуду.

В связи с этим каждый x_range[i] сам является a vector<float>, а не просто float.

Вы, вероятно, хотите vector<float> x_range(size);, который объявляет один вектор с определенным размером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...