Невозможно получить доступ к определенному месту в трехмерном массиве

Fernando Franco Félix спросил: 03 февраля 2018 в 10:04 в: c++

Прежде всего, я использую библиотеки ROOT, и есть форум ROOT, но я не думаю, что это проблема с ROOT конкретно.

Теперь у меня есть 3 (гистограммы являются объектами в ROOT), и их размер зависит от некоторых массивов, которые я хочу изменить в будущем:

  //this are the arrays
  double pT_range[]         = {8, 4, 2, 1, 0.5}; //multiplicity ranges
  double Aj_range[]         = {0.22, 0, 0};
  double mult_range[]       = {234, 204, 188, 168, 152, 140, 128, 116, 104, 92, 76, 0}; //multiplicity ranges
  //this is the first array of histograms
  TH2D* all_histos[getSize(Aj_range)][getSize(pT_range)][getSize(mult_range)];

У меня есть чтобы инициализировать их и заполнить их данными, там нет проблем.

Затем я извлекаю из них некоторые данные и сохраняю эти новые данные в другом массиве гистограмм hist_final и сохраняю их, я могу видеть, что они верны .

TH1D* hist_final[getSize(Aj_range)][getSize(pT_range)][getSize(mult_range)];  for (int a = 0; a < getSize(Aj_range); ++a)
  {
   for (int p = 0; p < getSize(pT_range); ++p)
    {
     for (int m = 0; m < getSize(mult_range); ++m)
     {
      for (int n = 0; n < 9; ++n)
       {
        all_histos[a][p][m]->GetXaxis()->SetRangeUser( 0.2*n, 0.2*(n+1) );//we first define each ring
        hist_final[a][p][m]->SetBinContent( n+1, all_histos[a][p][m]->GetMean(2) ); //then take the average in that ring
        hist_final[a][p][m]->SetBinError( n+1, all_histos[a][p][m]->GetMeanError(2) );
       }
      }
     }
    }

Все это работает

Затем я хотел добавить несколько новых гистограмм с немного разными данными, поэтому я решил увеличить размерность hist_final в вторая координата на 1:

  TH1D* hist_final[getSize(Aj_range)][getSize(pT_range)+1][getSize(mult_range)];

, а затем я начал заполнять эти гистограммы немного разными данными, только чтобы получить нарушение сегментации.

for (int a = 0; a < getSize(Aj_range); ++a)
{
 for (int m = 0; m < getSize(mult_range); ++m)
 {
  for (int p = 1; p < getSize(pT_range); ++p)
  {
    all_histos[a][0][m]->Add(all_histos[a][p][m],1);
  }
  for (int n = 0; n < 9; ++n)
  {
    all_histos[a][0][m]->GetXaxis()->SetRangeUser( 0.2*n, 0.2*(n+1) );//we first define each ring
    hist_final[a][getSize(pT_range)][m]->SetBinContent( n+1, all_histos[a][0][m]->GetMean(2) ); //then take the average in that ring
    hist_final[a][getSize(pT_range)][m]->SetBinError( n+1, all_histos[a][0][m]->GetMeanError(2) );
  }
 }
}

Я думал, что это может быть много, и я начал их исключать:

all_histos[a][0][m]->GetMean(2) 

является двойным, поэтому

all_histos[a][0][m]->GetMeanError(2)

они, это не проблема, тогда я думал, что отбросить бункеры, но если я сохраню гистограммы, не заполняя их, я могу открыть их и посмотреть, сколько у них у них есть, у них 9, это не проблема.

В конце концов я узнал, что это было в

hist_final[a][getSize(pT_range)][m]

Если я изменяю

getSize(pT_range)

для 0 1 2 3 или 4, нет проблем, хотя это переписывает полезные данные. Помните, что я использовал:

 TH1D* hist_final[getSize(Aj_range)][getSize(pT_range)+1][getSize(mult_range)];

, чтобы создать этот массив, он должен иметь 6 мест от 0 до 5. Поэтому я сказал "ебать его"

 TH1D* hist_final[getSize(Aj_range)][500][getSize(mult_range)];

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

НО ЭТО НЕ. IT STILL FAILS НА 5 И НОМЕРАХ ГРАНИЦА, ЧЕМ 5.

Я понятия не имею, почему, но если я изменю вторую координату для любого целого числа, меньшего, чем 5, код работает, я попытался использовать вручную множество комбинаций значения для координат, только те, где второй - 5, терпят неудачу.

Из-за этого я знаю, что проблема в том, что координата, но для жизни я не могу понять, почему и как разрешите его.

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

У меня нет идей. Спасибо.

Здесь вы можете увидеть весь мой код


0 ответов