Что означает эта ошибка SWITCH? - PullRequest
5 голосов
/ 11 марта 2012

Я получаю эту ошибку для моего CASE 5/6/7 / 8.

Я уверен, что это что-то очевидное, так как оно работало до того, как я начал добавлять вызовы дополнительных функций в CASE 4.

Что означает ошибка?

ошибка: метка регистра в области действия идентификатора с изменяемым типом, не содержащая оператора switch

 switch(menu_selection())
    {
        case 0 :    i = find_empty_record(data_record);       //New record
                    if (i!=-99)
                    {
                        printf("\n\nRecord #%d found to be empty...\n\n",i);
                        data_entry(&data_record[i],i,&array_flag);
                    }
        break;

        case 1  :                                             //Edit
                i=record_selection(array_flag);
                data_entry(&data_record[i],i,&array_flag);
        break;

        case 2  :   display_single(data_record,array_flag);  //Display single record

        break;

        case 3  :                                           //Display all records
                for (i=0;i<30;i++)
                    {
                        print_2_screen(&data_record[i],i,array_flag);
                    }
        break;

        case 4  :   rec_cnt = get_text_file_size(import_file_name); //Import Text File
                    student_record data_record[rec_cnt];
                    import_text_file(data_record,import_file_name,array_flag,rec_cnt);
        break;


        case 5  :   //  Import Binary File
        break;


        case 6  :
                export_text(data_record,rec_cnt,array_flag);//  Save to Text File
        break;

        case 7  :   //  Save to Binary File
        break;

        default :
        break;
    }

}
return 0;

Ответы [ 3 ]

9 голосов
/ 11 марта 2012
student_record data_record[rec_cnt];

Вы не можете объявить вещи внутри коммутатора.

  • Сделай это до выключателя
  • Сделать это в блоке:

    case 4:
    {
        student_record data_record[rec_cnt];
        /* ... */
    }
    
1 голос
/ 11 марта 2012

В случае 4 у вас есть объявление массива: student_record data_record[rec_cnt];

Создать дополнительный блок:

case 4:   
  {
    rec_cnt = get_text_file_size(import_file_name); //Import Text File
    student_record data_record[rec_cnt];
    import_text_file(data_record,import_file_name,array_flag,rec_cnt);
  }
  break;
0 голосов
/ 11 марта 2012

В случае 4: вы объявили новую переменную, которая затем остается в области действия до конца коммутатора.Это действительно только в C99 и C ++, но обычно генерирует предупреждение (а не ошибку) даже тогда.Решение состоит в том, чтобы добавить {...} вокруг тела кейса, чтобы ограничить область применения любых объявленных переменных:

    case 4  :
    {
      rec_cnt = get_text_file_size(import_file_name); //Import Text File
                student_record data_record[rec_cnt];
                import_text_file(data_record,import_file_name,array_flag,rec_cnt);
    }
    break;

Лично я обычно использую эту форму во всех конструкциях switch / case, поскольку это упрощает обслуживание.*

...