Я новичок в C ++, поэтому многое из того, чего я не совсем понимаю, я пытаюсь сузить, как я получаю exc_bad_access, но мои попытки распечатать значения, кажется, усугубляют (или вызывают) проблему!
#include <iostream>
#include "SI_Term.h"
#include "LoadPrefabs.h"
int main() {
SI_Term * velocity = new SI_Term(1, "m/s");
std::cout<<"MAIN: FIRST UNITS "<<std::endl;
velocity->unitSet()->displayUnits();
return 0;
}
Приведенный выше код выдает ошибку (EXC_BAD_ACCESS) еще до появления строки std :: cout <<.Я проследил это с помощью xcode, и он не работает в вызове функции для нового SI_Term (1, "m / s"). </p>
Повторный запуск с закомментированной строкой cout, он запускается и заканчивается.Я бы добавил больше кода, но у меня их много, и я не знаю, что имеет отношение к этой строке, которая словно пробирается назад и перезаписывает указатель.Может кто-нибудь помочь мне с тем, где искать или как отладить это?
НОВАЯ ИНФОРМАЦИЯ: Я сузил его до этого блока.Я должен объяснить, что этот блок пытается разложить набор физических единиц, записанных в формате кг * м / с ^ 2, и разделить его на кг, м, разделить на s * s.Когда что-то сломано, он использует LoadUnits (const char *) для чтения из файла.Я предполагаю (на данный момент правильно), что ни одна строка единиц не будет содержать где-либо около моего предела в 40 символов.
UnitSet * decomposeUnits(const char* setOfUnits){
std::cout<<"Decomposing Units";
int i = 0;
bool divide = false;
UnitSet * nextUnit = 0;
UnitSet * temp = 0;
UnitSet * resultingUnit = new UnitSet(0, 0, 0, 1);
while (setOfUnits[i] != '\0') {
int j = 0;
char decomposedUnit[40];
std::cout<<"Wiped unit."<<std::endl;
while ((setOfUnits[i] != '\0') && (setOfUnits[i] != '*') && (setOfUnits[i] != '/') && (setOfUnits[i] != '^')) {
std::cout<<"Adding: " << decomposedUnit[i]<<std::endl;
decomposedUnit[j] = setOfUnits[i];
++i;
++j;
}
decomposedUnit[j] = '\0';
nextUnit = LoadUnits(decomposedUnit);
//The new unit has been loaded. now check for powers, if there is one read it, and apply it to the new unit.
//if there is a power, read the power, read the sign of the power and flip divide = !divide
if (setOfUnits[i] == '^') {
//there is a power. Analize.
++i;++j;
double power = atof(&setOfUnits[i]);
temp = *nextUnit^power;
delete nextUnit;
nextUnit = temp;
temp = 0;
}
//skip i and j till the next / or * symbol.
while (setOfUnits[i] != '\0' && setOfUnits[i] != '*' && setOfUnits[i] != '/') {
++i; ++j;
}
temp = resultingUnit;
if (divide) {
resultingUnit = *temp / *nextUnit;
} else {
resultingUnit = *temp * *nextUnit;
}
delete temp;
delete nextUnit;
temp = 0;
nextUnit = 0;
// we just copied a word and setOfUnits[i] is the multiply or divide or power character for the next set.
if (setOfUnits[i] == '/') {
divide = true;
}
++i;
}
return resultingUnit;
}