Использование объекта структуры для операции двоичного поиска - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь использовать объект структуры для функции подсчета двоичного поиска, и я безуспешно пытаюсь скомпилировать код.

Функция подсчета двоичного поиска делает то, что подсчитывает количество значений до того, как будет достигнут предел. Я должен использовать структуры вместо классов, поскольку код переносится на микроконтроллер.

Ошибка, которую я получаю при попытке скомпилировать код: «Невозможно преобразовать аргумент 1 из 'volatile float' в float [] "

#include <iostream>

using namespace std;

#define DLS_MAX_DATAPOINTS 1200;

typedef struct TEST_SAMPLE
{
    float loadcell;     // loadcell (N)
} TEST_SAMPLE;


// See documentation in DATALOG.C for details
typedef struct BRAKETEST
{
    int dataflag;                                   // flags indicating what data is stored
    int dataPointsCount;                            // no of sample collected during test
    TEST_SAMPLE dataPoints[];       // data collection of sampled points
} BRAKETEST;

volatile BRAKETEST braketest;                   // test object holding test data



int binarySearchCount(float arr[], float n, float key)
{
    int left = 0, right = n;

    int mid;
    while (left < right)
    {
        mid = (right + left) >> 1;

        // Check if key is present in array 
        if (arr[mid] == key)
        {
            // If duplicates are present it returns 
            // the position of last element 
            while (mid + 1 < n && arr[mid + 1] == key)
                mid++;
            break;
        }

        // If key is smaller, ignore right half 
        else if (arr[mid] > key)
            right = mid;

        // If key is greater, ignore left half 
        else
            left = mid + 1;
    }

    // If key is not found in array then it will be 
    // before mid 
    while (mid > -1 && arr[mid] > key)
        mid--;

    // Return mid + 1 because of 0-based indexing 
    // of array 
    return (mid + 1);
}


int main()
{
    int braketest_trig_level_pedal = 30; 
    int count = 0;

    double n = sizeof(braketest.dataPoints[count].loadcell) / sizeof(braketest.dataPoints[0].loadcell);
    float results = binarySearchCount(braketest.dataPoints[count].loadcell, n, braketest_trig_level_pedal);   // braketest.dataPoints[count].loadcell
}

1 Ответ

0 голосов
/ 13 июля 2020

Вы должны изменить типы:

int binarySearchCount(volatile TEST_SAMPLE arr[], float n, float key)
binarySearchCount(braketest.dataPoints, n, braketest_trig_level_pedal);

И изменить доступы с arr[mid] на arr[mid].loadcell, например:

        if (arr[mid].loadcell == key)

Расчет размера неверен затем:

sizeof(braketest.dataPoints[count].loadcell) / sizeof(braketest.dataPoints[0].loadcell);

Должно быть:

    double n = sizeof(braketest.dataPoints) / sizeof(TEST_SAMPLE);

А не double, поскольку binarySearchCount ожидает float.

С этими изменениями он вернется искомый элемент +1 (из-за return (mid + 1), если он находит ключ или последний индекс (снова +1).

...