我有一个函数,它将两个数组作为输入并修改第一个数组。我在第一行收到错误void applyChange(int values[3][3][3], int changeCode[9]){
:
void hillClimb(int values[3][3][3],int pastData[20]){
int bestVal = evaluateValues(values,pastData);
int bestCode[9] = {0,0,0,0,0,0,0,0,0};
int valueChangeCode[9] = {0,0,0,0,0,0,0,0,0};
int valuesCopy[3][3][3];
//copyValues(valuesCopy,values);
while (incrementBaseThree(valueChangeCode,9)){
copyValues(valuesCopy,values);
applyChange(valuesCopy,valueChangeCode);
int evaluation = evaluateValues(valuesCopy,pastData);
if (evaluation > bestVal) {
bestVal = evaluation;
copyChangeCode(bestCode,valueChangeCode);
}
}
applyChange(values,bestCode);
}
void applyChange(int values[3][3][3], int changeCode[9]){
for (int a = 0; a < 9; a++){
changeCode[a] --;
}
for (int i = 0; i < 3; i++){
for (int k = 0; k < 3; k++){
values[i][k][ (0+k) % 3 ] += changeCode[ (3*i) + 0];
values[i][k][ (1+k) % 3 ] += changeCode[ (3*i) + 1];
values[i][k][ (2+k) % 3 ] += changeCode[ (3*i) + 2];
}
}
for (int a = 0; a < 9; a++){//we need this so that we don't mess up changeCode in the upper stack frame
changeCode[a] ++;
}
}
我查了一下,并没有意外地尝试两次定义该功能。我还确保我正确地调用它(即正确的输入并且不期望返回值)。
编辑:
{{1}}
copyValues和copyChangeCode只复制相应数组中的值。
答案 0 :(得分:2)
现在您已发布了代码。
您需要在之前声明applyChange()
。
把
void applyChange(int values[3][3][3], int changeCode[9]);
位于文件顶部
答案 1 :(得分:1)
您正在第61行和第68行调用函数applyChange()
。但该函数在第72行中定义。因此编译器不知道第61行或第68行中的applyChange()
函数。
您现在有两种选择:
1。)将函数applyChange()
放在函数调用上方。
2。)添加一个函数原型。
答案 2 :(得分:0)
您可能需要在头文件中包含applyChange
的原型。我猜测正在发生的事情是编译器在函数定义之前进入函数调用并且推断出与实际签名冲突的签名。