menuを自動生成するプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しょしんしゃ
記事: 9
登録日時: 3週間前

menuを自動生成するプログラム

#1

投稿記事 by しょしんしゃ » 1週間前

->おやつ
・飯

みたいな感じのメニューを自動生成してくれる自作関数を作ってみたいと思ってますがエラーが出てしまってお手上げ状態です。。。
もともとwin10で使っていたものをlinuxに持って来て動くように直したつもりだったんですどエラーが出てしまった。。。

エラー内容
menu.c: 関数 ‘main’ 内:
menu.c:6:3: 警告: passing argument 4 番目の ‘menu’ の引数を渡すときにポインタからキャスト無しに整数を作成しています [デフォルトで有効]
x=menu(2,2,2,mainmenu);
^
In file included from menu.c:1:0:
game_hedder.h:7:5: 備考: expected ‘char’ but argument is of type ‘char (*)[255]’
int menu(int,int,int,char);
^
menu.c: トップレベル:
menu.c:10:5: エラー: ‘menu’ と型が競合しています
int menu(int x, int y, int koumoku, char menu[][255]){
^
In file included from menu.c:1:0:
game_hedder.h:7:5: 備考: 前の ‘menu’ の宣言はここです
int menu(int,int,int,char);
^


本体

コード:

#include"game_hedder.h"

main(){
  char mainmenu[2][255]={"oyatu","mesi"};
 int x;
  x=menu(2,2,2,mainmenu);
  printf("%d\n,x);
}

int menu(int x, int y, int koumoku, char menu[][255]){
  initscr();

//select 選択中の番号   0〜
//menu_number 項目番号 0〜
  int select=0, menu_number;

  while(1){
    for(menu_number=0;menu_number<koumoku;menu_number++){
      move(x,y+menu_number);
      if(select==menu_number) printw("->");
      else printw("・");

      printw(menu[menu_number]);
    }

    switch(getch()){
      case 'w':
        if(select!=0) select--;
        break;
      case 's':
        if(select!=koumoku-1) select++;
        break;
      case 'g':
        return select;
      default:
        break;
    }
  }
  endwin();
}

game_hedder.h

コード:

#include"game_hedder.h"

main(){
  char mainmenu[2][255]={"jyanken","osero"};

  menu(2,2,2,mainmenu);
}

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: menuを自動生成するプログラム

#2

投稿記事 by みけCAT » 1週間前

menu関数を呼び出す場所の前に、以下の例のようなmenu関数の宣言

コード:

int menu(int x, int y, int koumoku, char menu[][255]);
または定義が必要です。

また、提示されているgame_hedder.hは、インクルードが無限に再帰してしまうなどの問題があるため、
適切な内容に書き換えるか、本体からのインクルードを外す必要があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

しょしんしゃ
記事: 9
登録日時: 3週間前

Re: menuを自動生成するプログラム

#3

投稿記事 by しょしんしゃ » 1週間前

みけCAT さんが書きました:
1週間前
menu関数を呼び出す場所の前に、以下の例のようなmenu関数の宣言

コード:

int menu(int x, int y, int koumoku, char menu[][255]);
または定義が必要です。

また、提示されているgame_hedder.hは、インクルードが無限に再帰してしまうなどの問題があるため、
適切な内容に書き換えるか、本体からのインクルードを外す必要があります。
ありがとうございます!エラーが出ずにコンパイルできるようになりました!
いままで

コード:

int main(int,int,int,char);
って宣言してたのが駄目だったみたいです。。。

続けてで申し訳ないのですが新たな問題があって
->xxxxxx
-kkkk
のような感じで表示するために

コード:

    for(menu_number=0;menu_number<koumoku;menu_number++){
      if(select==menu_number){mvprintw(x,y+menu_number,"->%s",menu[menu_number]);}
      else {mvprintw(x,y+menu_number," -%s",menu[menu_number]);}
    }
という感じにしてみたのですが、実行すると
->kkkkxxx
のように重なって表示されてしまいます。
ncursesを使っていて、mvprintwのy座標をfor文で増やすことで表示する行をずらせません。
原因がわかれば教えてほしいです。よろしくお願いします。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: menuを自動生成するプログラム

#4

投稿記事 by みけCAT » 1週間前

mvprintw(3) manページ
mvprintw
mvprintw - man pages section 3: Curses Library Functions

mvprintfw関数の第一引数と第二引数はy, xの順番であるのに、
誤ってx, yの順番で座標を渡してしまっているのが原因であると考えられます。
オフトピック
x, yと書いているサイトもあるので、引っかかってしまったのかな…?
ncursesの使い方
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

しょしんしゃ
記事: 9
登録日時: 3週間前

Re: menuを自動生成するプログラム

#5

投稿記事 by しょしんしゃ » 1週間前

みけCAT さんが書きました:
1週間前
mvprintw(3) manページ
mvprintw
mvprintw - man pages section 3: Curses Library Functions

mvprintfw関数の第一引数と第二引数はy, xの順番であるのに、
誤ってx, yの順番で座標を渡してしまっているのが原因であると考えられます。
オフトピック
x, yと書いているサイトもあるので、引っかかってしまったのかな…?
ncursesの使い方
治りました!間違ってるサイトにひっかかってました。ありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る