bagade M Ответов: 2

В этом коде, как работают эти строки и какое значение принимает p[I]?


Я проходил через один код, который вычислял следующую функцию

TempLow=IndexCaln (TempActual,&Con1002ignTempMap [0][0],0,15);
используя следующий код
IndexCaln(int MainValue,int *p, int iLeft, int iRght)
{
    int i;
    while((iRght - iLeft) > 1)
    {
        i = (iLeft + iRght) >> 1;
        if(MainValue < p[i])
        {
            iRght = i;
        }
        else
        {
            iLeft = i;
        }
    }
    check=iLeft;
    check1=iRght;
    return iLeft;
}


здесь Con1002ignTempMap-это массив [2] [16].

В этом коде, как работают эти строки и какое значение принимает p[i]?

Что я уже пробовал:

Я прошел через C langauge bboks для 2D массива

2 Ответов

Рейтинг:
2

Jochen Arndt

Это похоже на функцию, которая находит близкое значение к MainValue внутри массива по возрастанию чисел и возвращает индекс. Значение close здесь определяется как наименьшее значение в массиве, которое больше или равно MainValue.

Сама функция использует не 2D-массив, а 1D-массив. Это не проблема, потому что 2D-массив может быть сопоставлен с 1D-массивом, где 1D-индекс эквивалентен x + y * 16, где x-самый правый 2D-индекс, y-самый левый и 16-размер x-части. В вашем примере функция вызывается с диапазоном от 0 до 15. Таким образом, он использует только нижнюю часть 2D-массива (Con1002ignTempMap[0][0] к Con1002ignTempMap[0][15]). При прохождении &Con1002ignTempMap[1][0], он будет выполнен для верхней части.

Срок

i = (iLeft + iRght) >> 1;
вычисляет средний индекс текущего диапазона поиска. Использование этого индекса уменьшает среднее число циклов, которые должны быть выполнены до тех пор, пока не будет найден результат.


bagade M

если мой массив имеет такие значения, как

Con8881EngTemp[2][16]={{-10,0,5,10,15,20,30,40,50,60,70,80,90,100,110,120{22,20,17,14,12,8,7,5,4,4,2,0,0,1,2,3}};

Основное Значение= 28

будет ли после выполнения он показывать i=ileft=3?

Jochen Arndt

Это зависит от главного значения. Если это находится в диапазоне от 10 до 14, то 3 должны быть возвращены.
Однако я не выполнил код и просто говорю вам, чего бы я ожидал.

Чтобы узнать, что происходит на самом деле, используйте отладчик и наблюдайте за переменными или вставляйте некоторые операторы printf.

bagade M

спасибо, Йохен. Я получил

CPallini

В таком случае результат вызова функции IndexCaln будет равен 5.

Рейтинг:
1

CPallini

Он выполняет двоичный поиск[^] от MainValue в Con1002ignTempMap[0] часть массива, возвращающая индекс соответствующего элемента.

Например, на первой итерации, i=7, следовательно p[i] = Con1002ignTempMap[0][7];