web-dev-qa-db-fra.com

Comment puis-je résoudre cette erreur: le saut à l'étiquette de cas croise l'initialisation

J'ai l'erreur suivante dans mon code de calculatrice et je ne comprends pas comment la corriger. S'il vous plaît, tout conseil serait utile.

ERREUR: erreur: passer à l'étiquette de casse [-fpermissive] | erreur: traverse l'initialisation de 'int sum' | erreur: 'exit' n'a pas été déclaré dans cette étendue |

CODE:

#include <iostream>
#include <cmath>
using namespace std;         
void display_menu(); 
int get_menu_choice();
void get_two_numbers(int &a, int &b);
int add(int a, int b);
int subtract(int a, int b);


int main()
 {
 int choice;

  do
   {
    display_menu();
    choice = get_menu_choice();
    int x, y;
    switch (choice)
    {
        case 1: get_two_numbers(x, y);
                int sum = add(x, y);
                cout << x << " + " << y << " = " <<  sum << endl;
                break;
        case 2: get_two_numbers(x, y);
                int diff = subtract(x, y);
                cout << x << " - " << y << " = " <<  diff << endl;
                break;
        default:;
    }

     } while (choice != 3);

     cout << "Good bye...now." << endl;

     return 0;
       }


 void display_menu()
  {
   cout << endl;
   cout << "Simple Calculator Menu" << endl;
   cout << "----------------------" << endl;
   cout << " 1. Addition (+) " << endl;
   cout << " 2. Subtraction (-) " << endl;
   cout << " 3. Quit to exit the program" << endl;
   cout << endl;
  }

 int get_menu_choice()
  {
   int choice;
   cout << "Enter your selection (1, 2, or 3): ";
   cin >> choice;

  while(((choice < 1) || (choice > 3)) && (!cin.fail()))
   {
    cout << "Try again (1, 2, or 3): ";
    cin >> choice;
    }
  if (cin.fail())
    {
      cout << "Error: exiting now ... " << endl;
      exit(1);
     }
   return choice;
    }

 void get_two_numbers(int &a, int &b)
  {
    cout << "Enter two integer numbers: ";
    cin >> a >> b;
  }


 int add(int a, int b)
  {
   return (a + b);
  }

 int subtract(int a, int b)
  {
    return (a - b);
  }
31
user3555274

Vous déclarez de nouvelles variables dans une instruction case sans créer de portée englobante:

switch (choice)
{
    case 1: get_two_numbers(x, y);
            //* vv here vv *
            int sum = add(x, y);
            //* ^^ here ^^ */
            cout << x << " + " << y << " = " <<  sum << endl;
            break;
    case 2: get_two_numbers(x, y);
            //* vv here vv */
            int diff = subtract(x, y);
            //* ^^ here ^^ */
            cout << x << " - " << y << " = " <<  diff << endl;
            break;
    default:;
}

Voici comment y remédier:

switch (choice)
{
    case 1:
        {
            get_two_numbers(x, y);
            int sum = add(x, y);
            cout << x << " + " << y << " = " <<  sum << endl;
        }
        break;
    case 2:
        {
            get_two_numbers(x, y);
            int diff = subtract(x, y);
            cout << x << " - " << y << " = " <<  diff << endl;
        }
        break;
    default:
        break;
}

Bien entendu, le formatage exact des crochets et de l’indentation dépend de vous.

56
kfsone

Un "cas" de commutateur ne crée pas d'étendue, ainsi, comme le dit l'erreur, vous sautez l'initialisation de "somme" si le choix n'est pas 1.

Vous devez soit déclarer la somme et le diff en dehors du commutateur, soit créer des blocs avec {} pour chacun des cas.

20

Vous devriez déclarer des variables en dehors de l'instruction switch et non à l'intérieur d'un cas. sum et diff sont particulièrement problématiques dans votre code. Une fois ces variables initialisées en dehors de l'instruction switch, vous pouvez définir leurs valeurs.

4
Nassim