我正在学习C ++,而且在我正在做的任务中,我得到了一些警告,我怀疑这些警告也导致了我得到的两个错误。问题是警告显示的行是他给我们的行(其中一行),所以我认为代码必须正确。这让我相信我的类声明或构造函数中存在问题。谁能发现任何错误?
警告(对于fillSystemCommandList函数的每一行)是 不推荐将字符串文字转换为'char *'
并且错误是 架构x86_64的未定义符号: “COMMAND :: COMMAND(char *,int)”,引自: system_utilities.o中的fillSystemCommandList() ld:找不到架构x86_64的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
你可以跳过ParseCommandLine函数,我觉得一切都很好。我只是把它包括在内,这样我就可以拥有整个文件(这不是我的主要文件。)
其他说明: - systemCommands数组应该是长度为NUMBER_OF_COMMANDS的COMMAND指针(我想我做对了)
- fillSystemCommandList函数应该使用包含指向命令字符串和相应定义常量的指针的结构填充systemCommands数组。
- 我知道这段代码几乎都是C,而且这又是因为我正在上课的是C ++课程。
#include "system_utilities.h"
#include "definitions.h"
using namespace std;
int getCommandNumber(char *s);
class COMMAND {
char* pointertochar;
int* pointertoint;
public:
COMMAND(char*, int);
int amIThisCommand(char*);
};
int COMMAND::amIThisCommand(char* command){
return 0;
}
COMMAND* systemCommands[NUMBER_OF_COMMANDS];
int parseCommandLine(char cline[], char *tklist[]){
int i;
int length; //length of line
int count = 0; //counts number of tokens
int toklength = 0; //counts the length of each token
length = strlen(cline);
for (i=0; i < length; i++) { //go to first character of each token
if (((cline[i] != ' ' && cline[i-1]==' ') || i == 0)&& cline[i]!= '"') {
while ((cline[i]!=' ')&& (cline[i] != '\0') && (cline[i] != '\r')){
toklength++;
i++;
}
//---------------
tklist[count] = (char *) malloc( toklength +1);
memcpy(tklist[count], &cline[i-toklength], toklength);
tklist[count][toklength]='\0';
//cout << "\n" << tklist[count] << "\n";
//cout << "\n" << i << "\n";
//cout << "\n" << toklength << "\n";
//--------------
count ++;
toklength = 0;
}
if (cline[i] == '"') {
do {
toklength++;
i++;
/*if (cline[i] == ' ') {
toklength--;
}*/
} while (cline[i]!='"');
//--------------
tklist[count] = (char *) malloc( toklength +1);
memcpy(tklist[count], &cline[i-toklength+1], toklength-1);
tklist[count][toklength]='\0';
//cout << "\n" << tklist[count] << "\n";
//cout << "\n" << i << "\n";
//cout << "\n" << toklength << "\n";
//--------------
count ++;
toklength = 0;
}
}
return count;
}
int getCommandNumber(char *s) {
/*switch (*s) {
// case "halt":
return HALT;
break;
default:
break;
}*/
return 0;
}
void fillSystemCommandList() {
systemCommands[0] = new COMMAND("halt", HALT);
systemCommands[1] = new COMMAND("status", STATUS);
systemCommands[2] = new COMMAND("time_click", TIME_CLICK);
systemCommands[3] = new COMMAND("new_sensor", NEW_SENSOR);
systemCommands[4] = new COMMAND("new_sensor_node", NEW_SENSOR_NODE);
systemCommands[5] = new COMMAND("new_network", NEW_NETWORK);
systemCommands[6] = new COMMAND("add_sensor_to_node", ADD_SENSOR_TO_NODE);
systemCommands[7] = new COMMAND("add_node_to_network", ADD_NODE_TO_NETWORK);
systemCommands[8] = new COMMAND("sensor_command", SENSOR_COMMAND);
}
再次感谢您提供任何帮助!
答案 0 :(得分:1)
systemCommands
是一类COMMAND
个对象。 COMMAND
类的成员具有char*
类型,但
"halt"
systemCommands[0] = new COMMAND("halt", HALT);
属于const char*
,因此您收到了该警告消息。您没有定义COMMAND
类的构造函数。
COMMAND(const char*, int); //needs to be defined. note ptr is const
因此,当您这样做时出现错误:
systemCommands[0] = new COMMAND("halt", HALT);
尝试使用原型调用构造函数:COMMAND(char*, int);
。