2017-03-09 110 views
-1

我是編程新手,不理解此錯誤。C錯誤C2660:'菜單':函數不需要3個參數

我在Menu()函數中以及在menu_principal()函數中調用相同函數時具有相同的參數。 在函數menu_principal()中,我想通過函數Menu()和'option'變量來執行switch-case語句。

你能幫忙嗎?

int main() 
{ 
    void menu_principal(); 
    return 0; 

} 

void menu_principal() 
{ 

    bool stop = true; 
    int option; 

    const char *title = "MENU PRINCIPAL"; 
    const char *options_menu[] = { "ARTIGOS", "CLIENTES", "ORCAMENTOS", "SAIR" }; 
    int n_options = 4; 

    do 
    { 
     option = Menu(title, options_menu, n_options); 

     switch (option) 
     { 
     case 1: 
      Menu_Item(); 
      break; 
     case 2: 
      Menu_Client(); 
      break; 
     case 3: 
      Menu_Billing(); 
      break; 
     case 4: 

      stop = false; 
      break; 

     } 
    } while (stop); 

} 



int Menu(const char *title1, const char *options_menu1[], int n_options1) 
{ 

    int OptionSelected= 1; 
    int key; 
    bool stop = true; 

    do 
    { 
     system("cls"); 

     gotoxy(5, 3 + OptionSelected); printf(">>"); 

     gotoxy(15, 2); printf("%s", title1); 


     for (int i = 0; i < n_options1; i++) 
     { 
      gotoxy(10, 4 + i); 
      printf("%s ", options_menu1[i]); 
     } 

     do 
     { 
      key = _getch(); 
     } while (key != KEY_UP && key != KEY_DOWN && key != KEY_ENTER); 


     switch (key) 
     { 

     case KEY_UP: 

      OptionSelected--; 

      if (OptionSelected < 1) 
      { 
       OptionSelected = n_options1; 
      } 
      break; 

     case KEY_DOWN: 
      OptionSelected--; 
      if (OptionSelected > n_options1) 
      { 
       OptionSelected = 1; 
      } 
      break; 

     case KEY_ENTER: 
      stop = false; 
      break; 
     } 

    } while (stop); 


    return OptionSelected; 


} 
+0

如果你想調用'main'中的'menu_principal'函數,你不需要'void',只需'menu_prinipal();'。 – bejado

+2

'void menu_principal();'只是告訴編譯器某處存在一個叫做'menu_principal'的函數,它不接受任何參數並且什麼都不返回。這個構造函數不會調用函數,所以,你的整個程序實際上什麼都不做。 – ForceBru

+1

「菜單」功能的前向聲明可能有所幫助。我的意思是把這個'int Menu(const char * title1,const char * options_menu1 [],int n_options1);''main'上面'。不是主要的,但高於它。你能證實你已經做到了嗎? – smac89

回答

1

編譯器將讀取你的程序從上到下,所以它認爲:

option = Menu(title, options_menu, n_options); 

在這一行,你叫一個先前未知的功能,Menu
由於該函數未知,因此編譯器假定它將是int Menu(void)。 (不帶參數,返回int)。

這個假設與Menu最終得到聲明的方式明顯不同。

爲了解決這個問題,正確聲明函數靠近你的文件的頂部:

int Menu(const char *title1, const char *options_menu1[], int n_options1); 

然後,當編譯器遇到你的函數調用,也不會承擔的聲明,它將使用聲明你已經提供了(需要3個參數,並返回一個int

+0

如果沒有原型,編譯器應該*不*假設'void Menu(void)'...但是從上面的註釋看起來他可能有'int菜單();'作爲原型。 – Dmitri

+0

你爲什麼認爲它不應該假設一個隱式聲明? C編譯器回到最早的那些函數都有隱式聲明。他們現在通常都會對隱式聲明創建警告,但他們仍然允許。 – abelenky

+0

如果它假設一個隱式聲明,它應該假設返回類型是'int',並根據傳遞的參數猜測參數類型...不假定'void'返回並且沒有參數。雖然對於標準的更新版本,聲明應該在使用前需要... – Dmitri

相關問題