我正在做一个家庭作业项目,我必须通过一个基于数组的树进行修改的前序遍历,我需要将数组传递给函数才能使用它,但我一直在收到错误函数说它是从int
到int(*)[4]
的无效转换,我似乎无法弄清楚原因。
这是我的代码的副本:
#include <iostream>
#include <fstream>
char code[10];
void preOrder(int tree[][4], int index, int treeDepth)
{
int tempIndex;
if(tree[index][2] == -1 && tree[index][3] == -1)
{
std::cout << char(tree[index][1]) << ": ";
for(int i = 0; i < treeDepth; i++)
std::cout << code[i];
std::cout << "\n"
}
else
{
for(int i = 0; i < 2; i++)
{
code[treeDepth] = 0;
tempIndex = tree[index][2];
preOrder(tree[index][2], tempIndex, treeDepth + 1);
code[treeDepth] = 1;
tempIndex = tree[index][2];
preOrder(tree[index][3], tempIndex, treeDepth + 1);
}
}
return;
}
int main()
{
int numNodes = 0, i = 0, j = 0;
int root = 0, treeDepth = 0;
int numcols = 4;
std::fstream inFile;
inFile.open("tree.dat");
inFile >> root;
inFile >> numNodes;
int huffmanTree[numNodes][numCols];
for(i = 0; i < numNodes; i++)
for(j = 0; j < numCols; j++)
inFile >> huffmanTree[i][j];
preOrder(huffmanTree, root, treeDepth);
inFile.close();
return 0;
}
非常感谢任何帮助。 而且我也无法使用指针,我也可以将huffmanTree声明为全局,但无法弄清楚如何使其工作。并且对它所放置的一切感到抱歉。这是我第一次发帖。
错误是:
ola.cpp: In function ‘void preOrder(int (*)[4], int, int)’:
ola.cpp:28:53: error: invalid conversion from ‘int’ to ‘int (*)[4]’ [-fpermissive]
ola.cpp:10:6: error: initializing argument 1 of ‘void preOrder(int (*)[4], int, int)’ [-fpermissive]
ola.cpp:31:53: error: invalid conversion from ‘int’ to ‘int (*)[4]’ [-fpermissive]
ola.cpp:10:6: error: initializing argument 1 of ‘void preOrder(int (*)[4], int, int)’ [-fpermissive]
ola.cpp: In function ‘int main()’:
ola.cpp:67:39: error: cannot convert ‘int (*)[(((sizetype)(((ssizetype)numCols) + -1)) + 1)]’ to ‘int (*)[4]’ for argument ‘1’ to ‘void preOrder(int (*)[4], int, int)’
答案 0 :(得分:0)
关于第67行的错误:在标准C ++中,这是不允许的:
int huffmanTree[numNodes][numCols];
只有常量表达式可用作数组维度。
有些编译器实现了一个非标准的扩展来允许这种类型的数组,但不是很好:对于你的编译器来说,这个扩展似乎并没有扩展到将数组传递给一个需要数组的函数固定宽度。
可能会解决您的问题,而不是使用const int numcols = 4;
。
第28行和第31行的错误是由于调用preOrder(tree[index][2]
。你的第一个参数是int
,但函数需要指向数组的指针。如果你试图从某个特定的行和列开始创建一个数组切片 - 这实际上是不可能的。您必须通过tree, index, 2, tempIndex, treeDepth + 1
,向您的函数添加2个参数,以指示起点;并相应地修改功能逻辑。