Код ведет себя по-разному с оператором std ::cout и без него

#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