Объявление QApplication & quot; изменяет & quot; результат программы

В настоящее время я программирую на Qt, и у меня есть проблема, которую я не понимаю. Я не уверен, что это вызвано Qt.

У меня есть этот код:

cimg_library::CImg<float> img = model->convert("photo.jpg", 15);
model->save(img, "resIhm.jpg");

Это прекрасно работает, но когда я ввожу некоторый код QT (здесь объявление объекта QApplication), метод «convert» приводит к другим результатам.

QApplication *app = new QApplication(argc,argv);
cimg_library::CImg<float> img = model->convert("photo.jpg", 15);
model->save(img, "resIhm.jpg");

Но если я сделаю это:

cimg_library::CImg<float> img = model->convert("photo.jpg", 15);
model->save(img, "resIhm.jpg");
QApplication *app = new QApplication(argc,argv);

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

Я уверен, что без объявления QApplication это работает. Этот код в моей основной функции, для целей отладки.

Кроме того, когда я использую QCoreApplication, он тоже работает. Изменяет ли Qt потоки C ++?

Спасибо за вашу помощь 🙂

PS: я не использую Qt в моем классе Model.

РЕДАКТИРОВАТЬ: Используемые функции модели (цель — преобразовать изображение в ASCII Art):

CImg<float> Model::convert(const char* source, int tailleCaracteres) const throw (ConversionException) {
try {
CImg<float> image(source);

image.normalize(0,50);
int nbRef = 95;
CImgList<float> refCode(nbRef, tailleCaracteres, tailleCaracteres, 1, 3);

float white[3] = {255,255,255};
float black[3] = {0,0,0};

int i = 0;
for (char l=' '; l<='~'; l++) {
if(l == '%') {
char ch[3] = "";
ch[0] = '%';
ch[1] = l;
ch[2] = '\0';
refCode(i).draw_text(0, 0, ch, white, black, 1, tailleCaracteres);
} else {
char ch[2] = "";
ch[0] = l;
ch[1] = '\0';
refCode(i).draw_text(0, 0, ch, white, black, 1, tailleCaracteres);
}
i++;
}
CImg<float> imgDest;
CImgList<float> cols = image.get_split('y', -tailleCaracteres);

for(unsigned int i=0; i<cols.size(); i++) {
CImgList<float> rows = cols(i).get_split('x', -tailleCaracteres);
CImg<float> destRows;

for(unsigned int j=0; j<rows.size(); j++) {
int indice = recupImgProcheErreur(rows(j), refCode);
destRows.append(refCode(indice), 'x');
}
imgDest.append(destRows, 'y');
}
return  imgDest;
}
catch (CImgIOException exp) {
throw ConversionException(std::string(exp.what()));
}
}int Modele::calculErreur(CImg<float> img, CImg<float> car) const {
int erreur = 0;
cimg_forX(img, i) {
cimg_forY(img, j) {
erreur += img(i,j,0,0) - car.atXY(i,j);
}
}
return erreur;
}void Modele::save(CImg<float> img, const char* pathDestination) const {
img.save(pathDestination);
}

Valgrind сообщает, что в этой строке есть проблема (условный переход или перемещение зависят от неинициализированных значений):
erreur + = img (i, j, 0,0) — car.atXY (i, j);

Я попытался исправить это сегодня днем, но мне не удалось .. Я знаю, что это идет с car.atXY (i, j) (который, я думаю, такой же, как автомобиль (i, j, 0,0)).

Извините, если вы не понимаете имена переменных, это по-французски, но не стесняйтесь спрашивать меня 🙂

1

Решение

Задача ещё не решена.

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

Других решений пока нет …