我正在尝试编写一个程序来计算一组Jobs:Workers的匈牙利方法。 我知道我将如何编写程序的大部分代码,但我仍然坚持加载我的矩阵。 我创建了一个用于存储信息的类,并且我已经创建了一个指向该类对象的二维数组。矩阵的每个条目都应包含分配给该Worker的成本值:Job组合。
每次我尝试将成本加载到数组中的对象时,我都会遇到内存访问冲突,我无法弄清楚原因。任何帮助将不胜感激。 谢谢, 克里斯
using namespace std;
class costPtr{
int cost;
int fillRow;
int fillColumn;
public:
costPtr()
{
int fillRow = 0;
int fillColumn = 0;
cost = 0;
}
void fillCost(int costInput)
{
cost = costInput;
}
int printCost() const
{
return cost;
}
};
void fillMatrix(costPtr*** matrix, int workers, int jobs);
void methodMain();
void printMatrix(costPtr*** matrix, int workers, int jobs);
int main()
{
methodMain();
}
void methodMain()
{
int jobs, workers;
cout << "How many jobs are there: ";
cin >> jobs;
cout << "How many workers are there: ";
cin >> workers;
costPtr*** matrix = new costPtr**[workers];
for (int i = 0; i < workers; i++)
matrix[i] = new costPtr*[jobs];
fillMatrix(matrix, workers, jobs);
printMatrix(matrix, workers, jobs);
}
void fillMatrix(costPtr*** matrix, int workers, int jobs)
{
int cost;
for (int i = 0; i < workers; i++)
{
for (int j = 0; j < jobs; j++)
{
cout << "What is the cost for worker " << i + 1 << " doing job " << j + 1 << ": ";
cin >> cost;
(matrix[i][j])->fillCost(cost);
cout << endl;
}
}
}
void printMatrix(costPtr*** matrix, int workers, int jobs)
{
cout << endl << endl;
for (int i = 0; i < workers; i++)
{
for (int j = 0; j < jobs; j++)
cout << (matrix[i][j])->printCost() << " ";
cout << endl;
}
}
答案 0 :(得分:2)
如果您希望它是“2d”矩阵,则应为costPtr** matrix
。
// An array of pointers
costPtr** matrix = new costPtr*[workers];
// Each element in the array is (a pointer to) another array
for (int i = 0; i < workers; i++)
matrix[i] = new costPtr[jobs];
当然,总有像std::vector
这样的标准容器。你可以有一个矢量矢量:
// Create and initialize a workers x jobs matrix
std::vector<std::vector<costPtr>> matrix(workers, vector<costPtr>(jobs));
matrix[2][3].printCost(); // Example usage
没有明确的内存分配或指针。
编辑:重新阅读后,我发现你想要一个“2d指针数组”,所以costPtr*** matrix
是正确的,但你还需要一步:
costPtr*** matrix = new costPtr**[workers];
for (int i = 0; i < workers; i++) {
matrix[i] = new costPtr*[jobs];
for (int j = 0; j < jobs; j++) {
matrix[i][j] = new costPtr;
}
}
答案 1 :(得分:2)
错误的具体原因如下:
(matrix[i][j])->fillCost(cost);
您已经声明了指针,但是然后您向指针所指向的对象发出命令 - 该命令不存在。你从来没有构建它。
更深层次的问题是,在使用指针尝试之前,您尝试使用指针数组。当你编写代码时,你应该从一些小而简单的东西开始,然后一点一点地增加复杂性,每一步都要进行测试。 (出于某种原因,这条规则永远不会出现在编程课程中。)
答案 2 :(得分:0)
看一下矩阵容器的动态分配。为了达到你的目标,每个明星&#34;在容器类型中必须有一个&#34; new&#34;。
你成功处理了前两个指针,如下:
costPtr*** matrix = new costPtr**[workers];
for (int i = 0; i < workers; i++)
matrix[i] = new costPtr*[jobs];
现在你需要做的就是处理第三个指针:
for (int i =0; i < workers; i++)
for (int j = 0; j < jobs; j++)
matrix [i][j] = new costPtr;
如果没有最后一个指针分配,所有元素都将指向null
。