1

mainの上のいくつかの構造を次のように定義しました。

struct arguments
{
   int c;
   char *v[];
};

今、私はこれをメインでやりたいです:

int main(int argc, char *argv[])
{
    arguments arg;

    arg.c = argc;
    arg.v = argv; /* error: incompatible types in assignment of 'char** to char* [0]' */
}

だから、私は自分が何をしているのか完全には理解していませんが、本能的に線char *v[];が代わりになるように構造を作り直しましたchar **v[];が、これは、参照を参照して構造を渡すときに、arg逆参照しての値を取得したい場合を意味しarg.v[0]ます。プログラム名、私は今やらなければなりません*arg.v[0]、そしてこれはもはやのために働きません*arg.v[1]

私は次のような機能を持っています:

void argument_reader(arguments &arg)
{
   cout << "Number of arguments: " << arg.c << endl << endl;
   cout << "Array\t\tValue\n";
   cout_bar(40);
   for (int i = 0; i < arg.c; i++)
   {
      cout << "argv[" << i << "]\t\t" << *arg.v[i] << endl;
   }
   return;
}

しかし、私が呼び出すと*arg.v[i]、プログラムは2番目の引数の値やその他の値を出力せずに終了します。

だから私の質問は、私が意図したように(のアドレスを格納するために)メインワークarg.v[some_index < arg.c]の行を何らかの方法で作成することによって別の関数内で呼び出すことができるように、構造体を使用して関数間を渡すことができる方法はありますか?arg.v = argvargvarg.v

構造体が行うのは、次のようなデクレレーションを持つ関数に渡す代わりにargcargv次のように宣言された関数void func(int &argc, char *argv[]);に変数名を持つ新しい構造体タイプを渡すことができるようにすることだけです。 。したがって、これができない場合は、最初の方法に戻ることができます。argvoid func(arguments &arg)

4

3 に答える 3

4

あなたは書く必要があります:

struct arguments
{
    int    c;
    char **v;
};

今、あなたmain()は働きます。(そして、この種の混乱は私がいつも使う理由ですint main(int argc, char **argv)が、それは個人的な癖です。)

C99以降で作業していた場合、構造体を使用して作成したのは、 「フレキシブル配列メンバー」(FAM)と呼ばれるもので、C89(したがって、C ++ 98)よりもC99に追加されます。あなたがC++で作業していることに気づきませんでした!CのFAMには特別な規則があり、柔軟な配列メンバーの場合のように割り当てを行うことはできません。

ただし、修正はCと同じようにC++でも機能します。FAMを使用しているとは限りません。拡張機能としてFAMをサポートするC++コンパイラを使用していますか?

出力行には、次のものがあります。

cout << "argv[" << i << "]\t\t" << *arg.v[i] << endl;

これにより、引数の最初の文字が出力されます。をドロップする*と、最初の引数が文字列として取得されます。

cout << "argv[" << i << "]\t\t" << arg.v[i] << endl;
于 2013-02-28T05:22:29.430 に答える
3

構造体を次のように変更します。

struct arguments
{
   int c;
   char **v;
};

Cスタイルの配列とポインターは非常に似ており、バージョンや元のargvパラメーターと同じように上記の構造体を使用できます。

実際、多くの場合、main関数は[]を使用する代わりにそのように宣言されます。

int main(int argc, char **argv)

この回答コードはcharへのポインターvの元の配列を指しているため、ポインターはコピーされないことに注意してください。argv実際にコピーが必要な場合は、charポインタの配列を動的に割り当ててコピーする必要があります。

于 2013-02-28T05:28:57.317 に答える
1

2つのこと:

struct arguments
{
   int c;
   char *v[]; /*unknown length, hence structure is incomplete*/
};

のアドレスを保持するダブルポインタが必要ですargv

    struct arguments {
       int c;
       char **v;
    };
于 2013-02-28T05:26:11.257 に答える