2017-03-09 3 views
-1

Ich bin neu in der Programmierung und verstehe diesen Fehler nicht.C Fehler C2660: 'Menü': Funktion akzeptiert nicht 3 Argumente

Ich habe die gleichen Argumente in der Funktion Menu() und wenn ich die gleiche Funktion in der Funktion menu_principal() aufrufen. In Funktion menu_principal(), ich möchte die switch-case-Anweisung durch die Funktion Menu() mit 'Option' Variable ausführen.

Können Sie bitte helfen?

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

Wenn Sie die Funktion 'menu_principal' in' main' aufrufen wollen, brauchen Sie nicht 'void', nur' menu_prinipal(); '. – bejado

+2

'void menu_principal();' teilt dem Compiler lediglich mit, dass irgendwo eine Funktion namens 'menu_principal' existiert, die keine Argumente annimmt und nichts zurückgibt. Dieses Konstrukt ruft nicht die Funktion auf, also macht Ihr gesamtes Programm praktisch nichts. – ForceBru

+1

Vorwärtsdeklaration der 'Menü' Funktion könnte helfen. Was ich damit meine, ist dieses 'int Menü (const char * title1, const char * options menu1 [], int n_options1);' über 'main'. Nicht IN Haupt, sondern darüber. Können Sie bestätigen, dass Sie das getan haben? – smac89

Antwort

1

Der Compiler liest das Programm von oben nach unten, so dass er sieht:

option = Menu(title, options_menu, n_options); 

Auf dieser Linie, rufen Sie eine bisher unbekannte Funktion, Menu.
Da die Funktion unbekannt ist, nimmt der Compiler an, dass es int Menu(void) sein wird. (Nimmt keine Parameter, gibt int zurück).

Diese Annahme unterscheidet sich offensichtlich davon, wie Menu schließlich deklariert wird.

Um dies zu beheben, die Funktion ordnungsgemäß in der Nähe des Anfangs der Datei deklarieren:

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

Dann, wenn der Compiler Ihren Funktionsaufruf trifft, wird es keine Erklärung annimmt, wird es die Erklärung verwenden Sie bereits bereitgestellt (benötigt 3 Parameter und gibt int zurück)

+0

Wenn es keinen Prototyp gäbe, sollte der Compiler * nicht * void Menu (void) annehmen ... aber aus obigen Kommentaren sieht es so aus, als hätte er 'int Menu(); 'als ein Prototyp. – Dmitri

+0

Warum sollte es Ihrer Meinung nach keine implizite Deklaration annehmen? C-Compiler bis zu den frühesten hatten implizite Deklarationen von Funktionen. Sie erstellen im Allgemeinen alle Warnungen zu impliziten Deklarationen, aber sie erlauben es immer noch. – abelenky

+0

Wenn es eine implizite Deklaration annimmt, sollte es annehmen, dass der Rückgabetyp "int" ist, und die Parametertypen basierend auf den übergebenen Argumenten schätzen ... nicht "void" return und keine Parameter annehmen. Obwohl für neuere Versionen des Standards eine Deklaration vor der Verwendung erforderlich sein sollte ... – Dmitri

Verwandte Themen