john ztech Ответов: 1

Почему условное выражение (выделенное в приведенном ниже коде) обнаруживает совпадение для значений, которые не определены в инициализированном 2d массиве...?


//initialization
int validtracks[17][2] = {{1,1}, {1,3}, {1,6},{2,3},{2,6},{3,4},{3,6},{3,8}, 
{4,2},{4,3},{4,7},{5,3},{5,5},{6,1}, {6,3},{7,1},{7,3}};


//main code
while (matchtrack == 0) 
{
     rndint = rand() % 7 + 1;

     for (int r = 1; r < 18; r++)
        {

        if (validtracks[r][2] == rndint && validtracks[r][1] ==   
            rndtracks[1] && matchtrack == 0)
             {
             matchtrack = 1;
              }

        }
}

What I have tried:

I have narrowed the problem down to the conditional:

if (validtracks[r][2] == rndint && validtracks[r][1] ==rndtracks[1] && matchtrack ==0)
            {
            matchtrack = 1;
            }


For some reason it's detecting a match with elements in the array, when it shouldn't be:
//initialized array
int validtracks[17][2] = {{1,1}, {1,3}, {1,6},{2,3},{2,6},{3,4},{3,6},{3,8}, 
{4,2},{4,3},{4,7},{5,3},{5,5},{6,1}, {6,3},{7,1},{7,3}};

1 Ответов

Рейтинг:
0

Patrice T

Цитата:
Почему условное выражение (выделенное в приведенном ниже коде) обнаруживает совпадение для значений, которые не определены в инициализированном 2d массиве...?

Потому что в C/C++ "не определено" не существует. Поскольку C/C++ не установлен, вы несете ответственность за то, чтобы всегда получать доступ к допустимым позициям в ваших массивах. С точки зрения C/C++, пока вы пытаетесь получить доступ к позиции, которой вы владеете в памяти, это правильно.
Для массива int validtracks[17][2], C/C++ выделяют непрерывную позицию из 34 целых чисел в памяти. Чтобы получить доступ к любой позиции в массиве validtracks[x][y], формула смещения такова x*2+y Поэтому при попытке доступа к недействительному validtracks[x][2], на самом деле вы получаете доступ к действительному validtracks[x+1][0] если существуют, то или что-то еще.

Любая позиция в памяти имеет значение, просто, если вы ее не инициализировали, вы просто не знаете, что это за значение, вам может повезти или нет.