Тип данных ошибки сегментации - PullRequest
0 голосов
/ 22 ноября 2011

Я пытался получить математический результат, но продолжал получать ошибку сегментации, ошибка сегментации происходит в строке «cout».Я не думаю, что что-то не так в массиве r [] или LJ [].

   for (k = 0; k < 15; k++)
    {
        for (i = 0; i < 15; i++)
        {
            if (i == k)
            {
                NULL;
            }
            else
            {
                //Use the 3D distance formula
                term1 = fabs(x[k] - x[i]);
                term1 = pow(term1, 2);
                term2 = fabs(y[k] - z[i]);
                term2 = pow(term2, 2);
                term3 = fabs(z[k] - z[i]);
                term3 = pow(term3, 2);
                result = term1 + term2 + term3;
                result = sqrt(result);
                r[h] = result;                      //Store the result in an array
                h++;
            }
        }
    }




    //Calculate Lennard-Jones potential of every pair
    for(itr = 0; itr < 210; itr++)
    {
        term1 = pow(r[itr], 12);
        term1 = 1/term1;
        term2 = pow(r[itr], 6);
        term2 = 2/term2;
        LJ[itr] = term1 - term2;
    }

    double Ei;

    for(itr = 0; itr < 210; itr++)
    {
        Ei = LJ[itr] + Ei;
    }
    Ei = Ei/2;
    cout << "The new Energy level " << Ei << endl;

Ответы [ 2 ]

0 голосов
/ 22 ноября 2011

Обновление : вы обновили определение ЖЖ, так что это больше не проблема.Так как это C ++, почему вы используете цикл и индексацию?Лучшее (как в: более безопасном) решении было бы использовать стандартные библиотечные алгоритмы и, в частности, накапливать .Делая это, вы получите ясность и возможно удалите источник сегфоута.

Если другие требования не ограничивают вас, вы должны следовать Скотту Майеру совет о предпочтении алгоритмов над циклами.

Второе обновление с полным кодом : Вы должны убедиться, что вы обращаетесь только к тем ячейкам памяти, которые вы правильно распределили.Итак:

  1. убедитесь, что h инициализируется с нуля, а
  2. , что вы никогда не пишете в r [210] и выше.

Еще лучше, уберите все эти магические числа, вместо 210 используйте k_max * (j_max - 1) и определите

const unsigned int k_max = 15;
const unsigned int j_max = 15;

Используйте std :: vector вместо массива, это позаботится о выделении памяти для вас.

Печать значений h и itr (или с помощью отладчика, который является очень полезным инструментом) покажет вам, куда вы обращаетесь к памяти, которую вы не делалирезерв.

0 голосов
/ 22 ноября 2011

Я думаю, что у вас повреждена память в строке

Ei = LJ[itr] + Ei;

которые генерируют segfault позже, когда выполнение cout получает место.

...