Приращение по именам переменных для адреса памяти - PullRequest
0 голосов
/ 04 августа 2020

Это может быть очень простой ответ, я не уверен. Я должен указать адрес переменной для чтения в некоторых значениях в root. Мне нужны разные имена переменных, потому что я хочу сравнить их позже. Есть ли способ все за один шаг прочитать их в правильно названные переменные (типизированные double), которые имеют инкрементальные имена (Detector_P0, Detector_P1, et c.). Это то, что у меня есть до сих пор: (у меня это работает для branchName, но не для &variableName в SetBranchAddress()). Любой совет будет очень признателен !!!

for (int i = 0; i < nb_det; i++) {

std::string branchVarName = "Detector_P" + std::string(to_string(i));

const char * branchVarNameC;

 branchVarNameC = branchVarName.c_str();

All->SetBranchAddress(branchVarNameC,&???);

}

1 Ответ

1 голос
/ 04 августа 2020

Ваш лучший вариант - использовать массив или массив, подобный объекту, например std::vector или std::array.

Если размер массива известен во время компиляции, предпочтительнее использовать std::array<double, SIZE>. Если размер массива известен только во время выполнения, используйте std::vector<double>.

Пример использования std::vector:

std::vector<double> data(nb_det);
for (int i = 0; i < nb_det; i++)
{
   std::string branchVarName = "Detector_P" + std::string(to_string(i));
   const char * branchVarNameC = branchVarName.c_str();
   All->SetBranchAddress(branchVarNameC, &(data[i]));
}

Да, с каждой переменной Detector_P $ связано примерно 5000 номеров. Когда я запускаю этот файл, я сразу знаю, сколько там должно быть переменных Detector_P. Поэтому я хотел бы каким-то образом создать массив для каждого или в самом списке, который я могу увеличить, чтобы сравнить определенные индексы

Похоже, вам нужен std::map<std::string, std::vector<double>> для хранения данных.

std::map<std::string, std::vector<double>> allDetectorData;
for (int i = 0; i < nb_det; i++)
{
   std::string branchVarName = "Detector_P" + std::string(to_string(i));
   const char * branchVarNameC = branchVarName.c_str();
   All->SetBranchAddress(branchVarNameC, allDetectorData[branchVarName]);
}

Это позволяет вам считывать столько или меньше double, соответствующих детектору, и сохранять их в allDetectorData[branchVarName].

Однако меня больше всего беспокоит то, сколько из этого имеет смысл для вас. Стоит потратить время на то, чтобы действительно хорошо изучить шаблоны классов контейнеров в стандартной библиотеке, прежде чем начинать использовать их в своем приложении. Рекомендую узнать о них из хорошего учебника .

...