2016-05-15 6 views
-1

ncoursesとmenu.hを使用して対話型メニューを作成したい 現在のディレクトリの内容を印刷してから、メニューを作成したいとします。私は現在、thisチュートリアル対話型UIの作成

で行くと、コード

#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) 
#define CTRLD 4 

を試してみましたが、私はプログラムを実行すると、それはそれが必要ファイルの一覧を印刷しないのです。しかし、作品のような静的配列を使用しています。

どうしたのですか?私は間違いを見落としましたか?

vector<char *> choices; 

    DIR *dir; 
    dirent *pdir; 
    dir=opendir("."); 

    while((pdir=readdir(dir))) 
    { 
     choices.push_back(pdir->d_name); 
    } 
    closedir(dir); 

ITEM **my_items; 
    int c;    
    MENU *my_menu; 
    int n_choices, i; 
    ITEM *cur_item; 


    initscr(); 
    cbreak(); 
    noecho(); 
    keypad(stdscr, TRUE); 


    n_choices = ARRAY_SIZE(choices); 
    my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *)); 

    for(i = 0; i < n_choices; ++i) 
      my_items[i] = new_item(choices[i], choices[i]); 
    my_items[n_choices] = (ITEM *)NULL; 

    my_menu = new_menu((ITEM **)my_items); 
    mvprintw(LINES - 2, 0, "F1 to Exit"); 
    post_menu(my_menu); 
    refresh(); 

    while((c = getch()) != KEY_F(1)) 
    { switch(c) 
     { case KEY_DOWN: 
       menu_driver(my_menu, REQ_DOWN_ITEM); 
       break; 
      case KEY_UP: 
       menu_driver(my_menu, REQ_UP_ITEM); 
       break; 
     } 
    } 

    free_item(my_items[0]); 
    free_item(my_items[1]); 
    free_menu(my_menu); 
    endwin(); 
+0

'choices.push_back(pdir-> d_name);は、ループのたびに内容が変化するchar配列のアドレスを' choices'ベクトルにプッシュします。 'ベクトルの選択;を'ベクトルの選択;に変更し、コンパイルエラーを修正してみてください。あなたはまた、この質問にタグを付けました。C++ので、キャストやmalloc、callocなどへの直接呼び出しを取り除きましょう。 –

+0

menu.hは文字列を認識しないCライブラリであるため、char *を文字列に変換できませんか? – Johnyb

+0

割り当て例: 'char const * pszChars =" qwer "; std :: string str = pszChars; ' –

答えて

0

ARRAY_SIZEマクロは配列に対してのみ機能します。 sizeofを使用しますが、ベクトルオブジェクトのサイズは要素の数に依存しません。これは、すべてのベクトルで同じ一定値です。要素は動的に割り当てられます。 std::vectorの要素の数が必要な場合は、そのためのメンバー関数があります。

+0

私はそれを試しましたが、まだ出力はありません。 – Johnyb