Я не новичок в программировании, но плохо знаком с C ++.
Сейчас я работаю над довольно сложным проектом, включающим управление имитируемой роботизированной рукой.
Я закончил первую версию проекта, и он работает нормально.
Я просто добавил новый код, который собирает некоторую информацию о системе на каждой итерации, сохраняет ее в некоторых массивах и в конце печатает все в файле для последующего анализа.
Теперь происходит нечто действительно странное. Если я определю файл, в котором будут сохранены данные, выполните следующие действия:
const std::string SAVEFILE = "C:\\Users\\Vincent\\Desktop\\ta";
все работает отлично, точно так же, как и до добавления нового кода (плюс сохранение данных).
Но если я определю это следующим образом:
const std::string SAVEFILE = "C:\\Users\\Vincent\\Desktop\\tacit.txt";
тогда система ведет себя по-другому. Не падает, но рука робота движется по-другому.
Я попытался прокомментировать весь код, который использовал SAVEFILE, и даже любой новый код, связанный с сохранением данных, но проблема сохраняется.
Я знаю, что, имея только эту информацию, вряд ли кто-нибудь скажет мне, что не так, но есть ли у кого-нибудь совет, в каком направлении смотреть?
Имеет ли смысл думать, что длинная строка перезаписывает значение какой-либо другой переменной? Как это может быть возможно? Какое-то руководство по чистому программированию на C ++, которое я мог нарушить?
большое спасибо
РЕДАКТИРОВАТЬ (после первых ответов и комментариев)
Спасибо за ответы. То, что какой-то массив некорректно ведет себя как звуки, было первым, что я проверил. Я предполагаю, что это должно происходить из массивов, сохраняющих данные, поскольку они являются единственными новыми. Дело в том, что даже когда я комментирую весь соответствующий код, без изменений.
Я пытаюсь дать больше информации о моем коде. Здесь я впервые использую SAVEFILE (последний аргумент функции runExperiment)
int main(int argc, char *argv[]) {
std::vector<Controller*> controllers;
controllers.push_back(getConstrainedPDT(0,true));
controllers.push_back(getConstrainedPDT(1,true));
controllers.push_back(getConstrainedPDT(2,true));
runExperiment(controllers,LENGTHS,WEIGHTS,RADIUS,ANGLEMIN,ANGLEMAX,MAXTORQUES,PUSHVECTOR,GRAVITY,RUNTIME,TIMESTEP,XTARGET,YTARGET,ITERATIONSAVEDATA,SAVEFILE);
return 1;
}
а вот код функции
void runExperiment(std::vector<Controller*> controllers,const double * lengths, const double* weights, const double radius, const double* angleMin, const double* angleMax, const double* maxTorques,const double* pushVector,const dReal gravity,const dReal runTime,const dReal tstep,const dReal targetX,const dReal targetY,const int itSaveData,const std::string saveFile){
endTime = runTime;
simTime = 0.0;
timeStep = tstep;
dInitODE();
world = dWorldCreate();
space = dHashSpaceCreate(0);
contactgroup = dJointGroupCreate(0);
ground = dCreatePlane(space, 0, 0, 1, 0);
dWorldSetGravity(world, 0, 0, gravity);
createTargetObject(targetX,targetY);
int nbData = static_cast<int>( ( endTime / timeStep ) / static_cast<double>(itSaveData) );
robot = new R2DRobot(&world,controllers.size(),lengths,weights,radius,angleMin,angleMax,maxTorques,pushVector,controllers,itSaveData,nbData);
dsFunctions fn;
fn.version = DS_VERSION;
fn.start = &setViewPoint;
fn.step = &loop;
fn.stop = &stopSim;
fn.path_to_textures = PATH_TO_TEXTURES;
dsSimulationLoop(0, 0, 1280, 960, &fn);
dWorldDestroy(world);
dCloseODE();
// NOTE: commenting the next three lines does not fix the problem !
// it is the only place saveFile is used, except in the code of printData
// I do not show the code of printData as commenting it does not change anything
if (itSaveData>0){
robot->printData(saveFile);
}
delete robot;
}
Это помогает?
РЕДАКТИРОВАТЬ —
Нашел проблему. Действительно, некоторые переменные не были хорошо инициализированы. Для пользователей Open Dynamics Engine я инициализировал пространство в основной программе, но использовал другой (неинициализированный) экземпляр пространства в одном из моих классов. Я удивлен, что что-то работало вообще.
Спасибо всем за время и помощь.
Это может быть проявлением того, что ваша программа не инициализирует переменные должным образом. Когда строка была короче, компилятор создавал определенную структуру памяти, а переменные, созданные в стеке (или в куче), имели определенные значения. По счастливой случайности эти ценности оказались для вас подходящими.
Теперь, когда строка стала длиннее, компилятор немного изменил расположение памяти, и это привело к немного другому расположению. Теперь эти неинициализированные переменные могут иметь немного разные значения. Это не обязательно сбой, но работает по-другому.
но кто-нибудь есть совет, в каком направлении смотреть
К сожалению, этой информации действительно недостаточно. Может быть, вы можете попробовать использовать valgrind
или аналогичный инструмент для анализа вашего кода.
Имеет ли смысл думать, что длинная строка перезаписывает значение какой-либо другой переменной? Как это может быть возможно?
Нет, это не длинная строка. Это даже не близко к длинной строке. Если строка слишком длинная, у вас будет исключение для недопустимой длины.
Некоторое руководство по чистому программированию на C ++, которое я мог нарушить
Не хватает информации. С помощью std::string
это хорошо, и это даже рекомендуется.
Проблема в другом. Похоже, неопределенное поведение для меня.
Высота количества аргументов для runExperiment
с являются глобальные переменные говорят вам, что вам может понадобиться объект более высокого уровня, чтобы обернуть и организовать его. При попытке написать конструктор для такого объекта вы, вероятно, увидите и исправите проблему с неверными / неинициализированными переменными, с тем, что предотвратит неопределенное поведение.