C ++ - функция-кандидат недопустима: нет известного преобразования из «struct» в «struct (&)» - PullRequest
0 голосов
/ 27 апреля 2018

Прежде всего, я новичок в C ++. Я пытаюсь вызвать функцию с несколькими массивами структур (включая 2D) в качестве аргументов, и я получаю следующую ошибку:

Нет подходящей функции для вызова функции: функция-кандидат недопустима: нет известного преобразования из «struct _psoParticle [частицыQnty] [2]» в «_psoParticle (&) [] [2]» для 1-го аргумента

Мои структуры (Предположим, материал = 1 и период = 10):

struct unit{
    int inventory[material][period];
    int consumption[material][period];
    int replenishment[material][period];
    int planned[material][period];
    int accPlanned[material][period];
    int demandPull[material][period];
    int costPenalty[material][period];
    bool delivery[material][period];
    int leadtime;
    int inventoryControl[material][period];
    double bufferSize[material][period];
    double bufferLevel[material][period];
    double bufferMgmt[material][period];
    const double lbGamma{-100.0};
    const double ubGamma{100.0};
};

struct _psoParticle{
    double positionBest;
    double velocityBest;
    long pbest;
};

Инициализация данных в основном:

struct unit CareUnit[2]{};
struct unit centralStore{};
struct _psoParticle psoParticle_CareUnit[10][2];
struct _psoParticle psoParticle_CentralStore[10];
int totalConsumption[material]{}, totalInventory{}, totalLateness{};
int particleQnty{10};
int x[particleQnty]{};

Заголовок функции:

int dbr(_psoParticle (&pso_CareUnit)[][2], _psoParticle (&pso_CentralStore)[],
            int particle, unit (&CareUnit)[], unit &centralStore,
            int (&totalConsumption)[1], int &totalInventory, int &totalLateness);

Продолжение в основном:

for (int i = 0; i < particleQnty; ++i)
    x[i] = dbr(psoParticle_CareUnit, psoParticle_CentralStore, i, CareUnit,
           centralStore, totalConsumption, totalInventory, totalLateness);

А затем выскакивает сообщение об ошибке.

Есть идеи, что я сделал не так?

Спасибо!

1 Ответ

0 голосов
/ 28 апреля 2018

Ах, да, я знаю это .... Ну, ваша функция должна выглядеть следующим образом

int dbr(_psoParticle (&pso_CareUnit)[10][2], _psoParticle (&pso_CentralStore)[10],
        int particle, unit (&CareUnit)[2], unit &centralStore,
        int (&totalConsumption)[material], int &totalInventory, int &totalLateness);

Обратите внимание, что для каждого аргумента заданы полные измерения. Теперь причина этого в том, что все ваши массивы статические массивы, поэтому компилятор должен знать, что это с самого начала, до того, как вы запустите свою программу. Чтобы он мог делать причудливые свистки и свистки, как sizeof(arr) и for(T obj: arr){}, а что нет.

Теперь, как вы могли заметить, такой способ работы - беспорядок. У вас есть несколько вариантов, чтобы сделать его лучше. Минимум усилий - заменить типы аргументов на шаблоны. как

template<typename T1, typename T2, etc...
int dbr(T1 &pso_CareUnit, T2 & pso_CentralStore...

Тогда компилятор сам выяснит, какого черта вы все это кормите. Вы также можете передавать их как указатели, тогда некоторая информация будет потеряна, и вам придется как-то передавать измерения, но что угодно ...

int dbr(_psoParticle ** pso_CareUnit, _psoParticle *pso_CentralStore,...

Вы также можете использовать типы stl, такие как std :: vector

int dbr(std::vector<std::vector<_psoParticle>>& pso_CareUnit, std::vector<_psoParticle>& pso_CentralStore,...

Вы также можете инкапсулировать все это, как

struct Container{
_psoParticle careUnit[10][2];
_psoParticle centralStore[10];
};

int dbr(Container & iContainer...

или даже лучше

class Pso{
public:
    int dbr(...
private:
    _psoParticle careUnit[10][2];
    _psoParticle centralStore[10];
    // ... the rest of arguments
};

Есть также несколько более прикольных способов справиться с этим, таких как итераторы и еще много чего. Но в вашем случае я думаю, что простого решения с указателем или инкапсуляции будет достаточно. Хотя я бы предупредил вас в будущем воздерживаться от использования структур и массивов в стиле C, с ними надоело иметь дело, и для этого есть множество отличных контейнеров STL. И это соглашение о присвоении имен является очень странным, обратитесь к руководству по Google или GNU C ++ для советов по стилю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...