C ++ строка и управление памятью

Я не новичок в программировании, но плохо знаком с 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 я инициализировал пространство в основной программе, но использовал другой (неинициализированный) экземпляр пространства в одном из моих классов. Я удивлен, что что-то работало вообще.
Спасибо всем за время и помощь.

1

Решение

Это может быть проявлением того, что ваша программа не инициализирует переменные должным образом. Когда строка была короче, компилятор создавал определенную структуру памяти, а переменные, созданные в стеке (или в куче), имели определенные значения. По счастливой случайности эти ценности оказались для вас подходящими.

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

8

Другие решения

но кто-нибудь есть совет, в каком направлении смотреть

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


Имеет ли смысл думать, что длинная строка перезаписывает значение какой-либо другой переменной? Как это может быть возможно?

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


Некоторое руководство по чистому программированию на C ++, которое я мог нарушить

Не хватает информации. С помощью std::string это хорошо, и это даже рекомендуется.

Проблема в другом. Похоже, неопределенное поведение для меня.

2

Высота количества аргументов для runExperiment с являются глобальные переменные говорят вам, что вам может понадобиться объект более высокого уровня, чтобы обернуть и организовать его. При попытке написать конструктор для такого объекта вы, вероятно, увидите и исправите проблему с неверными / неинициализированными переменными, с тем, что предотвратит неопределенное поведение.

1
По вопросам рекламы [email protected]