0

私は C++ を学んでおり、現在行っている課題で、同様に発生している 2 つのエラーの原因であると思われる警告が多数表示されます。問題は、警告が表示される行が彼が私たちに与えた行 (そのうちの 1 つ) であることです。そのため、コードは正しいに違いないと思います。これにより、クラス宣言またはコンストラクターに問題があると思われます。誰でも何か間違ったことを見つけることができますか?

警告 (fillSystemCommandList 関数の各行について) は、 Conversion from stringliteral to 'char *' is deprecated です。

エラーは、アーキテクチャ x86_64 の未定義シンボル: "COMMAND::COMMAND(char*, int)"、参照元: system_utilities.o ld の fillSystemCommandList(): アーキテクチャ 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);

}

あなたが与えることができるどんな助けにも感謝します!

4

1 に答える 1

1

systemCommandsCOMMANDオブジェクトのクラスです。ただし、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);.

于 2013-05-18T21:11:55.060 に答える