ページ 1 / 1
argc argvの宣言
Posted: 2014年12月05日(金) 22:32
by chibago
お久しぶりです。chibagoです。
c++でとあるライブラリを使おうと思っております。
サンプルでは、
コード:
int main(int argc, char* argv[]){
lis_initialize(&argc, &argv);
のようになっています。ただ、比較的大きなプログラム
を作っており、このように、argc, argvを直接
受け渡すのは不合理ですし、処理の内容に合わせて、
プログラム実行時の引数ではなく、直接的に、
argvを作成して初期化関数に渡したいと考えております。
そこで、呼び出すクラスのメンバ変数として
コード:
int argc;
char argv[1000];
として定義し、
コード:
lis_initialize(&this->argc, &this->argv);
のように与えております。
ただ、コンパイルすると
コード:
: cannot convert ‘char (*)[1000]’ to ‘char***’ for argument ‘2’ to ‘int lis_initialize(int*, char***)’
となります。
どのように定義すればよいのでしょうか。
ポインタ周りはどうしても理解ができなくて
困っております。
ご指導いただければ幸いです。
Re: argc argvの宣言
Posted: 2014年12月05日(金) 23:24
by h2so5
そのまま定義するだけです。
コード:
int argc;
char* argv[1000];
Re: argc argvの宣言
Posted: 2014年12月05日(金) 23:50
by chibago
すみません、
やってみましたが今度は、
: cannot convert ‘char* (*)[1000]’ to ‘char***’ for argument ‘2’ to ‘int lis_initialize(int*, char***)’
となりました。
Re: argc argvの宣言
Posted: 2014年12月06日(土) 00:58
by h2so5
間違えました。もうひとつ変数が必要ですね。
コード:
int argc;
char* argv[1000];
char** a = argv;
lis_initialize(&argc, &a);
Re: argc argvの宣言
Posted: 2014年12月06日(土) 17:14
by chibago
h2so5さん、
ありがとうございました。
argvの引き渡しには成功したのですが、
宣言を変えた関係でargvの合成部分が
うまくいかなくなってしまいました。
自分なりにいろいろ試してみましたが、
うまくいきませんのでご教授いただければ
幸いです。
char argv[1000]としていたときは、
コード:
std::string arg = "dummy.exe";
arg.copy(argv, arg.size(), 0);
が問題なくコンパイルできましたが、
char* argv[1000]に変更した関係で、
コード:
: no matching function for call to ‘std::basic_string<char>::copy(char* [1000], std::basic_string<char>::size_type, int)’
となっております。
Re: argc argvの宣言
Posted: 2014年12月06日(土) 17:53
by h2so5
chibago さんが書きました:
自分なりにいろいろ試してみましたが、
うまくいきませんのでご教授いただければ
幸いです。
必要なのは試すことではなくポインタについて正しく理解することです。
今はコンパイルエラーで済んでいますが、ポインタまわりのバグは厄介なので理解しないままCのAPIを使おうとすると確実に問題が起きます。
コード:
char* argv[1000];
std::string arg = "dummy.exe";
argv[0] = &arg[0];
Re: argc argvの宣言
Posted: 2014年12月06日(土) 19:20
by chibago
h2so5さん、
ありがとうございました。
おっしゃることはごもっともです。
汎用性がありつつも低レベルの実装に煩わされたくないと
思いC++を選び、プログラミングの内容もアルゴリズムに
学術性を求めるもの書いている関係上、ポインタ周りの
問題は深入りしたくないという意識が働いていたと思います。
今後は、理解を深めるように心がけたいと思います。