繁体   English   中英

如何制作带有结构数组的菜单(将 lua 代码转换为 C++ 代码)

[英]How do I make a menu with structure array (transfering lua code to c++ code)

我使用了 lua 并编写了一个菜单,我想在 C++ 中做同样的事情

function printMenu( menu )
  for i = 1,#menu do
    if i == selectedItem then
     print(">> "..menu[i].text)
    else
     print("   "..menu[i].text)
    end
  end
end
-- Handler Method --
function onKeyPressed( key, menu )
    if key == keys.enter then
        onItemSelected(menu)
    elseif key == keys.up then
        if selectedItem > 1 then
        selectedItem = selectedItem - 1
        end
    elseif key == keys.down then
        if selectedItem < #menu then
        selectedItem = selectedItem + 1
        end
    end
end
function onItemSelected( menu )
    menu[selectedItem].handler()
end
-- Main Method --
function main()
    while inMainMenu do
        term.clear()
        term.setCursorPos(1,1)
        printMenu(mainMenu)

        event, key = os.pullEvent("key")
        onKeyPressed(key,mainMenu)
    end
end

数组如下

mainMenu = {
 [1] = { text = "Physics", handler = PhysicsMenu },
 [2] = { text = "Math [01-12]", handler = MathMenu1 },
 [3] = { text = "Math [12-24]", handler = MathMenu2 },
 [4] = { text = "Update", handler = Update },
 [5] = { text = "Exit", handler = Exit }
}

所以我基本上想把这段代码变成 C++,我尝试的内容如下

char* menuname[]
= { "calc", "internet", "painter", "movie", "update", "exit" };

void SelectItem(char* menu[])
{
    fflush(stdin);

    int key = _getch();

    if (key == 13)

    {
        system("CLS");

        switch (selecteditem)
        {
        case 1:Calcmenu(); break;
        case 2:CtoF(); wait(); break;
        case 3:painter(); break;
        case 4:printf("Work In Progress\n"); wait(); break;
        case 5:printf("Work In Progress\n"); wait(); break;
        case 6:exit(0); wait(); break;
        default: mainmenu(); break;
        }
    }

    switch (key)
    { 
        case 72: if(selecteditem > 1) selecteditem -= 1; break;
        case 80: if (selecteditem < 6) selecteditem += 1; break;
    }
}

void printmenu(char* menu[])
{
    gotoxy(20, 10);
    int menusize = strlen(*menu);

    for (int i = 0; i < menusize; i++)
    {
        if (i == selecteditem - 1)
        {
            gotoxy(30, 9 + i);
            printf(">>[%d]%s\n", i + 1, menu[i]);
        }
        else
        { 
            gotoxy(30, 9 + i);
            printf("  [%d]%s\n", i + 1, menu[i]);
        }
    }
}


void main()
{
    while (1)
    {
        system("CLS");
        printmenu(menuname);
        SelectItem(menuname);
    }

}

问题是在 lua 中,我能够创建一个数组并且只使用 3 个函数来创建任何菜单。 但在 C++ 中,我想我必须使用 struct 并像在 lua 中一样创建一个新数组。

你的编码非常好。 我的意思是,Lua。 经过一些练习,你也会成为一名优秀的 C 程序员。

下面是如何在 C 中做到这一点(它不是真正的 C++):

#include <stdio.h>

/* ---------------------- type -------------------------*/

/* Define type 'menu_item' as a menu item. */
typedef struct {
  char *text;
  void (*handler)();  /* a pointer to a function */
} menu_item;

/* --------------------- handlers ----------------------*/

void ItemCalc()
{
   printf("Launching the calculator...\n");
}

void ItemPainter()
{
   printf("Launching the painter...\n");
}

void ItemMovie()
{
   printf("Launching the movie...\n");
}

/* --------------------- data --------------------------*/

menu_item my_menu[] = {
  { "calc", ItemCalc },
  { "painter", ItemPainter },
  { "movie", ItemMovie },
};

int my_menu_size = sizeof(my_menu) / sizeof(menu_item);

int selecteditem = 1;

/* -------------------- I/O-----------------------------*/

/*
  Doing I/O is very platform-dependent. On my system there
  isn't _getch(). So to make it possible to run this program
  everywhere we simulate an I/O system:
*/

int _key = 0;

void simulate_key_press(int key)
{
    _key = key;
}

int read_key()
{
    return _key;
}

/* -----------------------------------------------------*/


void SelectItem(menu_item menu[], int menu_size)
{
    fflush(stdin);

    int key = read_key();

    if (key == 13)
    {
        printf("I'm executing item %d:\n", selecteditem);
        menu[selecteditem].handler();
    }
    else
    {
       int num = (key - '0'); // convert characters '1'..'9' to integers 1..9.

       if (num >= 1 && num <= menu_size) {
          selecteditem = num;
          printf("item %d selected.\n", num);
       }
       else
          printf("Invalid key. Either ENTER or digits are allowed\n");
    }
}

void printmenu(menu_item menu[], int menu_size)
{
    int i;

    for (i = 0; i < menu_size; i++)
    {
        if (i == selecteditem - 1)
        {
            printf(">>[%d]%s\n", i + 1, menu[i].text);
        }
        else
        { 
            printf("  [%d]%s\n", i + 1, menu[i].text);
        }
    }
}

void main()
{
    printmenu(my_menu, my_menu_size);
    simulate_key_press('2');
    SelectItem(my_menu, my_menu_size);
    printmenu(my_menu, my_menu_size);
    simulate_key_press(13);
    SelectItem(my_menu, my_menu_size);
}

至于使用数组:有两种方法可以计算出它们的大小。 上面我明确地告诉函数数组的大小。 另一种方法是使用“哨兵”值来标记数组的结尾:

menu_item my_menu[] = {
  { "calc", ItemCalc },
  { "painter", ItemPainter },
  { "movie", ItemMovie },
  { NULL, NULL },
};

然后在您的循环中,当您到达此元素时停止:

void printmenu(menu_item menu[])
{
    int i;

    for (i = 0; menu[i].text != NULL; i++)
    {

像 Lua 这样的“脚本”语言与像 C(或 C++)这样的低级语言之间存在很多差异。 我希望我的代码能激励你学习更多。 即使您最终不会使用 C,也值得学习它以了解机器的实际工作方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM