1

私はcppを学習中です。私は今日、Macのコマンドラインでg++を介してコンパイルする通常のモードでプログラムを作成しました。XCodeでの作業も再確認しましたが、IDEでコードがコンパイルされない原因となっているコード行が見つかりました

行は次のとおりです。

string result[2] = subject[rand() % nsubject];

ここで、subjectは文字列の多次元配列であり、その各メンバーは2つの文字列の配列であり、nsubjectは配列の長さを保持するintです。Xcodeは次のように言っています:配列初期化子は初期化子リストでなければなりませんが、前に述べたように、g++は文句なしにコンパイルします。ですから、この言語に慣れていないので、このステートメントはおそらく貧弱な形式だと思います。XCodeが許容できると判断する方法が必要ですよね?

これは問題を示す可能性のあるフラグメントであり、コンテキストから削除してもあまり意味がありませんが、以下は私の端末で正常にコンパイルされますが、xcodeでビルドできません:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;

int main(){
    string subject[][2] = {
        {"a", "b"},
        {"c", "d"},
        {"e", "f"},
        {"g", "h"},
        {"i", "j"}
    };

    int nsubject = sizeof subject / sizeof subject[0];
    srand(static_cast<unsigned>(time(0)));
    string result[2] = subject[rand() % nsubject];
    cout << result[0] << endl; //should return 'a','c','e','g' or 'i'
    return EXIT_SUCCESS;
}
4

2 に答える 2

0

サブアレイの 1 つをsubject新しいアレイに割り当てようとしているようです。通常、配列全体を他の配列に割り当てることはないため、Xcode はおそらくこれを好まないでしょう。g++ は、両方の変数が type であることを認識しているため、問題なく処理していますstring*。ポインター変数にポインターを割り当てることを Xcode に明示的に伝える場合は、問題ありません。以下はどこでもコンパイルする必要があります。

string* result = subject[rand() % nsubject];

resultにはサブ配列の内容のコピーが含まれていないことに注意してsubjectください。これは配列への参照にすぎません。

于 2012-10-14T01:56:12.820 に答える
0

ああ、わかりました。したがって、問題は、この行で 2 つの文字列の別の配列を宣言し、別の配列をそれに割り当てようとしていることです。

string result[2] = subject[rand() % nsubject];

これは、単純な配列では実際には正当ではありません。サイズが指定されているかどうかに関係なく、ポインターである必要があります。例えば:

string *result = subject[rand() % nsubject];

... また:

string (&result)[2] = subject[rand() % nsubject];

ただし、gccがコンパイルする理由はわかりません。それが役に立てば幸い!

于 2012-10-14T01:58:28.247 に答える