2016-08-23 1 views
-4

У меня есть кусок кода, который объявляет 3D-массив поплавков, который неуловимо компилируется.«std :: bad_alloc» в объявлении массива в корневом каталоге (CERN), в зависимости от размера массива

void ImageCombine() 
{ 

    float *doseArrayTotal = new float[2350][2350][2350]; 
    float *doseArray1 = new float[1175][1175][1175]; 
    // I have commented out the rest of my code whilst debugging. 
} 

Если doseArray1 дается размеры [2350] [2350] [2350] или [1024] [1024] [1024], он будет собирать. Учитывая размеры выше [1175] [1175] [1175] или [1000] [1000] [1000], это приведет к ошибке.

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 

Так я бегу этот код через кусок программного обеспечения под названием корня (страшное название), разработанной ЦЕРН, а вход я обеспечиваю для запуска этой функции.

[[email protected] mysim]$ root 
root [0] .L ImageCombine.C 
root [1] ImageCombine() 

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

Приветствия Chris

+1

Вы пытаетесь выделить слишком много условной памяти, на вашем компьютере недостаточно места для кучи. Поэтому, когда вы уменьшаете размеры массива, он работает. Вам необходимо рассмотреть способ обхода, например, меньшую схему хранения. – CoryKramer

+1

Если вы уже обрабатываете массивы 'float' как плавающие указатели, не должен ли тип' float ***'? –

+0

@CoryKramer замечает, что он работает с большими размерами, но не с smalelr –

ответ

1

Первоначально размещен код не действует C++; это просто случилось, когда он был интерпретирован CERN Root. Для того, чтобы динамически объявить 3D массив:

float*** doseArrayTotal = new float**[2350]; 
for(int i = 0; i < 2350; ++i){ 
    doseArrayTotal[i] = new float*[2350]; 
    for(int j = 0; j < 2350; ++j){ 
    doseArrayTotal[i][j] = new float[2350]; 
    } 
} 

делать то же самое с использованием векторов:

vector<vector<vector<float> > > doseArrayTotal; 
doseArrayTotal.resize(2350); 
for (int i = 0; i < 2350; ++i) { 
    doseArrayTotal[i].resize(2350); 
    for (int j = 0; j < 2350; ++j){ 
    doseArrayTotal[i][j].resize(2350); 
    } 
} 

Эти два объекта теперь работают, как 3D-матрицы или изображения, и поплавок могут быть сохранены или доступ в позиции (1,2,3), например:

float ValueEntered = 7.3; 
float ValueExtracted; 
doseArrayTotal[1][2][3] = ValueEntered; 
ValueExtracted = doseArrayTotal[1][2][3]; 
+0

Пожалуйста, отредактируйте исходное сообщение вместо добавления ответа с улучшениями. –

+0

@KevinKatzke Я никогда не писал здесь раньше, только приходите сюда, чтобы найти похожие проблемы. Было предложено другим пользователем опубликовать мое решение в разделе ответов, разве это не правильный этикет? – Chris

+0

Я вижу, поэтому вы должны принять свой собственный ответ (щелкните значок «Проверить»), чтобы уточнить, что это решение для вашего начального ploblem, который вы хотите поделиться с сообществом. –

Смежные вопросы