#c #compiler-optimization
#c #оптимизация компилятора
Вопрос:
Пытаюсь отладить некоторые значения в изображении (массив 1D), но обнаружил поведение, которое я не могу понять:
- приведенный ниже код никогда
if()
не соответствует условиям, и консоль ничего не показывает. - при добавлении обратно строки
// std::cout << 4 * i << "t" << 4 * j << "n";
код работает правильно. - подтверждено, что переменные
W
,H
иstep
, когда они определены внутри функции как локальные переменные, проблема не возникает. - кроме того, при замене умножения
step*i
на делениеstx/step
проблема также не возникает.
Запуск Visual Studio 2019 версии x64. Проблема, похоже, связана с некоторой оптимизацией компилятора, но я не могу понять, что я делаю не так!
void testcode(int W, int H, int step) {
int n = 30;
int h = H/step;
int w = W/step;
float* arr = new float[h * w];
memset(arr, 0, h * w *sizeof(float));
int stx = 500, ndx = 550;
int y = 900;
for (int i = 0; i < h; i ) {
for (int j = 0; j < w; j ) {
int cost_idx_sc = i * w j;
int cost_idx = step * i * w j * step;
// std::cout << 4 * i << "t" << 4 * j << "n";
#if 0
if ((i >= stx/step) amp;amp; (i <= ndx/step)) {
if (j == y/step) {
std::cout << (float)(arr[cost_idx_sc]) << "t";
system("pause");
}
}
#else
if (((step*i) >= stx ) amp;amp; ((step*i) <= ndx )) {
if ((step*j) == y ) {
std::cout << (float)(arr[cost_idx_sc]) << "t";
system("pause");
}
}
#endif
}
}
system("pause");
delete[] arr;
}
int main(){
testcode(2000,1500,4);
return 0;
}
Комментарии:
1. Просто в качестве примечания: почему бы не умножить i на W в cost_idx? шаг * i * w = i * W.
2. Если компилятор оптимизирует вызовы std ::cout или system, то это нарушает правила C , другими словами, ошибка компилятора. Это кажется маловероятным, поэтому я бы сначала посмотрел на ваши собственные ошибки. Но, конечно, это не невозможно.
3. Что вы пытались до сих пор, чтобы попытаться самостоятельно отладить код? Как отлаживать небольшие программы
4. Я взял ваш код, и он работал для меня совершенно нормально (насколько я мог судить). Отсутствие вывода в консоли может быть связано с тем, что вы никогда не выводите a
n
. Попробуйте заменитьt
наn
.5. Кажется, работает просто отлично: godbolt.org/z/zd5zeK