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

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

ただいまの
回答率

89.55%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 818

crossism

score 12

コマンドライン引数の個数が実行中一時的に少なくなっている

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で編集しターミナルでコンパイル

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

こんにちは。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/29 13:26

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/29 13:29

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

    キャンセル

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

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る