首先,我是一个完整的C ++新手。我试图用一些结构数组(包括一个2D)调用一个函数作为参数,我得到以下错误:
没有用于调用'function'的匹配函数:候选函数不可行:没有已知的'struct _psoParticle [particleQnty] [2]'转换为'_psoParticle(&)[] [2]'作为第一个参数
我的结构(让我们假设材料= 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;
};
在main中初始化数据:
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 ¢ralStore,
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);
然后弹出错误消息。
关于我做错了什么想法?
谢谢!
答案 0 :(得分:0)
啊,是的,我知道这个......好吧,你的功能应该是这样的
int dbr(_psoParticle (&pso_CareUnit)[10][2], _psoParticle (&pso_CentralStore)[10],
int particle, unit (&CareUnit)[2], unit ¢ralStore,
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...
然后编译器会弄清楚你自己到底是怎么回事。你也可以将em作为指针传递,然后一些信息会丢失,你不得不以某种方式传递维度,但无论如何......
int dbr(_psoParticle ** pso_CareUnit, _psoParticle *pso_CentralStore,...
你也可以使用像std :: vector
这样的stl类型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 ++指南以获取样式提示。