質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GTK+

GTK+とはGUIを作るために作られた、とても使いやすく機能に富んだツールキットです。クロスプラットフォームによる互換性と、使いやすいAPIを備えています。

Q&A

解決済

2回答

381閲覧

コマンドライン引数の個数が変わっている

crossism

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GTK+

GTK+とはGUIを作るために作られた、とても使いやすく機能に富んだツールキットです。クロスプラットフォームによる互換性と、使いやすいAPIを備えています。

0グッド

0クリップ

投稿2017/08/29 03:24

編集2017/08/29 03:27

##コマンドライン引数の個数が実行中一時的に少なくなっている
C言語とGTK+を組み合わせたプログラムを作っています。GTK+で作ったウィンドウを開くプログラムの中に、別のプログラムのmain関数の中身を移植しています。(プログラム実行中にウィンドウを開くのが目的で、最初はsystem関数でウィンドウを開くプログラムをインサートしていたのですが、ウィンドウを閉じないと先に進めないという問題から、逆の方法を取っています。)

###発生している問題・実行状況
最初にコマンドライン引数の個数でusageを表示するエラーチェックをしたいのですが、そのusageもその後の処理の様子もどちらもprintfで出てきてしまいます。実行中に他の箇所でprintfを使って確認すると、場所によって個数が変わっています(正しい個数が2なのですが、エラーチェックを通る時1になっています)。

$ ./image-viewer add.c windowの宣言後のチェック 2 windowの宣言後のチェック 1 エラーチェック内でのチェック 1 用法: cci prgfile [--code] --code 生成コード表示 if文でのチェック 2

###該当のソースコード
コンパイルのコマンド
$ gcc -o image-viewer image-viewer.c cci_pars.c cci_tkn.c cci_tbl.c ccicode.c cci_misc.c pkg-config --libs --cflags gtk+-2.0

下記はimage-viewer.cです。他のファイルはhttps://github.com/iwabuchiken/Hayashi_1/tree/master/originalを参照してください。

#include <gtk/gtk.h> #include "cci.h" #include "cci_prot.h" /* ボタンがクリックされたときに呼び出される関数 */ static void cb_button_clicked (GtkWidget *button, gpointer user_data) { /* メインループを終了 */ gtk_main_quit (); } /* メイン関数 */ int main (int argc, char **argv){ GtkWidget *window; printf("windowの宣言後のチェック %d\n",argc); /*よそから移植したコード*/ if (argc == 1) { printf("エラーチェック内でのチェック %d\n",argc); puts("用法: cci prgfile [--code] "); puts(" --code 生成コード表示"); exit(1); } if (compile(argv[1])) { if (argc>=3 && strcmp(argv[2],"--code")==0) code_dump(); else printf("if文でのチェック %d\n",argc); } /*よそから移植したコード終わり*/ /* GTK+の初期化およびオプション解析 */ gtk_init (&argc, &argv); /* ウィンドウの作成 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* ウィンドウの大きさの設定 */ gtk_widget_set_size_request (window, 800, 600); { GtkWidget *vbox; vbox=gtk_vbox_new(FALSE,2); gtk_container_add(GTK_CONTAINER(window),vbox); { GtkWidget *image; GtkWidget *button; image = gtk_image_new_from_file (argv[1]); gtk_box_pack_start (GTK_BOX (vbox), image, TRUE, TRUE, 0); /*ボタンの作成*/ button = gtk_button_new_with_label ("Quit"); /* ボタンをウィンドウに配置 */ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); /* ボタンがクリックされたときに呼び出される関数の設定 */ g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (cb_button_clicked), NULL); } } /* ウィンドウの表示 */ gtk_widget_show_all (window); /* メインループ */ gtk_main (); return 0; }

###試したこと
コマンドライン引数の個数が変わるという経験が初めてで打つ手がわかりませんでした。検索の仕方が悪いのか、同じような事例も見つけられませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
Mac OSX GTK+ver.2.0 miで編集しターミナルでコンパイル

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

compile()の中身が分かりませんが、この中でimage-viewerを再度呼び出しているのではないでしょうか?
その時、コマンドライン引数を1つ減らしているのであれば説明がつきます。

投稿2017/08/29 04:21

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

crossism

2017/08/29 04:26

こんにちは、ご回答ありがとうございます。 まさしくその通りで、一緒にコンパイルしていたコードの一つにsystem関数が残っていました。お恥ずかしい限りです。 お世話になりました。また機会がありましたらよろしくお願いします。
guest

0

コマンドライン引数は、プログラミング時に定数として与えられるものではなく、実行時に都度都度決まるものです。どのようにプログラムを起動するか、を考えるべきだと思います。

投稿2017/08/29 03:59

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

crossism

2017/08/29 04:29

こんにちは、ご回答ありがとうございます。 コマンドライン引数の意味を少し取り違えていたかもしれません。今回のミスの原因もそういった視点から発見できたかもしれないなと感じ、勉強になりました。また機会がありましたらよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問