基本上,我几乎已经完成了整个代码,我只是遇到错误而且我不知道应该取出什么或添加到这些函数中。我知道他们之间的联系是因为他们的语言应该几乎相互对立。
在Insert函数中,它应该检查并查看新条目是否已经存在(如果存在,则函数不返回任何内容),如果条目不存在,则将条目插入到数组中。
bool ArrayRecord::InsertItem(int item, char* fName, char* lName, double gpa, char* pnum)
{
int location = 0;
// int item;
while (location < length)
{
if (list[location].id == item) return 0;
else {
list[length].id = item;
list[length].firstName = fName;
list[length].lastName = lName;
list[length].gpa = gpa;
list[length].phonenumber = pnum;
length++;
return 1;
/*for the duplicate id prevention search id first if found then return function immediately otherwise start insertion*/
}
}
}
以下是上述函数标题的调用:
bool InsertItem(int, char*,char*,double,char*);
现在,这真的让我头疼。我去过其他一些论坛,试图帮助解决这个问题,但我对给予的帮助感到困惑。修改是首先搜索条目。如果找到该条目,则修改该条目。如果未找到该条目,则将该条目插入到数组中。
bool ArrayRecord::Modify(int item, char* fName, char* lName, double gpa, char* pnum)
{
int location = 0;
int item; //item has no valid value
while (location < length)
{
//item has no valid value - how do you know it's equal to the id value in the current location?
if (list[location].id == item) return &list[location];
else location++;
}
/*Do a search if it's found then modify the selection but if it's not found then insert a new info*/
}
以下是修改标题中的调用。
bool Modify(int, char*, char*, double, char*);
这是错误
Error 1 error C2082: redefinition of formal parameter 'item'
Warning 2 warning C4800: 'StudentRecord *' : forcing value to bool 'true' or 'false' (performance warning)
我需要一些非常容易理解的语言示例,并希望能够非常详细地解释正在发生的事情以及我需要做什么。我是初学者而且我已经没有练习了,所以我忘了一些东西。我需要澄清。
答案 0 :(得分:2)
夫妻俩:
InsertItem中的循环只执行一次,因为位置在开始时无效。如果要在添加新项目之前检查项目ID,则函数体应如下所示:
for (int location = 0; location < length; ++location)
if (list[location].id == item) return false;
list[length].id = item;
list[length].firstName = fName;
list[length].lastName = lName;
list[length].gpa = gpa;
list[length].phonenumber = pnum;
length++;
return true;
第二个功能应该是不同的:
for (int location; location < length; ++location) {
if (list[location].id == item) {
// modify an item
list[location].firstName = fName;
list[location].lastName = lName;
list[location].gpa = gpa;
list[location].phonenumber = pnum;
return false;
}
}
// add new item
list[length].id = item;
list[length].firstName = fName;
list[length].lastName = lName;
list[length].gpa = gpa;
list[length].phonenumber = pnum;
length++;
return true;
在向其添加新项目或使用std :: vector
之前检查最大列表长度也会很好答案 1 :(得分:1)
“形式参数的重新定义”是因为您将item
作为输入添加到函数中,然后声明了具有相同名称的第二个item
(请参阅ArrayRecord::Modify
的第二行与提供给函数的参数列表。考虑尝试声明这样的变量:
bool myFunc() {
int item;
int item;
// ...
return 0;
}
这与将变量item
声明为函数参数,然后将其声明为局部变量相同:您在同一范围内对同一变量有两个定义。
其次,警告告诉您函数ArrayRecord::Modify
返回bool
类型的值,但是在此函数中的一个return语句中,您返回的值不是bool
类型,并且bool
类型没有“明显”的翻译。具体来说,行if (list[location].id == item) return &list[location];
返回对list
数组中某个位置的地址引用(如果一切顺利,它永远不会是0
),因此编译器必须决定如何翻译{ {1}}转换为&list[location]
或true
返回值。
在回答评论问题时,我建议修复上面提到的“返回值”问题,然后在每个函数中添加“回退返回”,例如false
作为每个函数中的最后一个语句。虽然您的代码似乎涵盖了使用return 0;
语句到函数末尾的所有可能路径,但编译器不同意,并且您的选项是提供“默认”返回值,以防其他所有方法都失败,或者关闭编译器中的特别警告。前者比后者更值得推荐。
如果警告所有代码路径中都没有返回值,请注意
return
不保证返回值。在while (a < b) {
if (q)
return 1;
else
return 0;
}
时,代码的执行可能跳过while (a < b) { ... }
,并且编译器看不到a>=b
是保证启动条件的任何原因。