Я использую библиотеку C ++, которая предоставляет объект, который для простоты более или менее похож на это:
class ExampleSO {
public double* narray;
};
У меня есть экземпляр ExampleSO
, у которого narray
около 200. Другой метод ExampleSO::method()
выполняет множество арифметических функций с этим массивом и назначает его различным элементам массива:
ExampleSO::method() {
// a lot of operations
narray[50] = narray[1] * narray[2] / narray[40];
// and so on
Этот код сгенерирован другой программой и использует набор определений для обработки элементов массива, поэтому код выглядит следующим образом:
#define A narray[0]
#define X narray[1]
#define Y narray[2]
// ...
#define Z narray[40]
// ....
#define U narray[50]
// ... more, until narray[199]
ExampleSO::method() {
// a lot of operations
U = X * Y / Z;
// and so on
}
Моя проблема в том, что в конечном итоге некоторые элементы массива становятся NaN, и я пытаюсь отладить код, чтобы понять, почему. Я уже обнаружил некоторые из них, которые в основном вызваны делением на ноль, другие - возведением в степень очень маленькими числами (маленькими, например, между 0 и +/- 0,1).
С моим небольшим знанием магии GDB мне удалось увидеть элементы массива по display *(this->narray) @ 200
, но этот массив очень большой и, следовательно, нечитаемый.
Так что отладка этого фрагмента кода оказалась непростой задачей, потому что #defines
скрывает мне положение элемента, массив слишком велик и потому, что так много элементов становятся NaN, я теряюсь.
Мой вопрос: какие идеи / предложения у вас есть, чтобы помочь мне отладить этот код? Возможно, была бы полезна условная точка останова, когда первый элемент массива становится NaN? Как я мог сделать это с такой структурой?
Спасибо!