Вы не можете создавать строки в коде, а затем использовать эти имена, чтобы вернуться к переменным, которые имели эти имена. Компилятор выбрасывает имена переменных при сборке вашей программы в исполняемый код.
То, что вы делаете, возможно, лучше решить с помощью массива . Определите имя массива hts
, которое имеет необходимые вам размеры. Массивы C ++ всегда индексируются с нуля, но ваша нижняя граница равна пяти. Вы можете либо вычесть пять из всех ваших индексов, когда бы вы их ни использовали, либо вы можете просто увеличить массив на пять элементов и «выбросить» нижние элементы.
TH1F* hts[17][70];
for (int i = 5; i < 17; ++i) {
for (int j = 53; j < 70; ++j) {
ostringstream name;
name << "hts_" << i << "_" << j;
hts[i][j] = HDir.make<TH1F>(name.str()), " Title", 100, 0., 100.);
}
}
У вас есть синтаксическая ошибка где-то в вашей строке make
; Я не пытался исправить это здесь.
Чтобы иметь массив минимального размера, вам придется помассировать индексы, прежде чем использовать их:
int const Offset1 = 5;
int const Offset2 = 53;
TH1F* hts[17-Offset1][70-Offset2];
for (int i = Offset1; i < 17; ++i) {
for (int j = Offset2; j < 70; ++j) {
ostringstream name;
name << "hts_" << i - Offset1 << "_" << j - Offset2;
hts[i][j] = HDir.make<TH1F>(name.str()), " Title", 100, 0., 100.);
}
}
Другой вариант - использовать map
из строк для ваших объектов TH1F:
std::map<std::string, TH1F*> hts;
for (int i = 5; i < 17; ++i) {
for (int j = 53; j < 70; ++j) {
ostringstream name;
name << "hts_" << i << "_" << j;
hts.insert(name.str()), HDir.make<TH1F>(name.str()), " Title", 100, 0., 100.));
}
}
Затем вы можете получить доступ к любому элементу, который хотите, используя имя:
hts["hts_5_62"]->Fill(f);