powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / fatal error C1061: compiler limit : blocks nested too deeply
11 сообщений из 11, страница 1 из 1
fatal error C1061: compiler limit : blocks nested too deeply
    #39040549
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е. был много лет такой тупой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
BOOL InternalBlock(PString sys_ID)
{
  if (sys_ID == "AAAAAAAA-AAAA") return TRUE; //Mr. AAAA
  else if (sys_ID == "BBBBBBBB-BBBB") return TRUE; //Mr. BBBB
  else if (sys_ID == "CCCCCCCC-CCCC") return TRUE; //Mr. CCCC
...
  else if (sys_ID == "XXXXXXXX-XXXX") return TRUE; //Mr. XXXX
  else return FALSE;
}

Время от времени линейно добавлял туда новые "ID".

Счас добавил пару десятков, при компиляции выдал:
Код: plaintext
1.
1>..\main_process.cxx(707) : fatal error C1061: compiler limit : blocks nested too deeply


Причина в принципе понятна: превышен лимит "вложенности".
Как правильно переписать?

Вариант 1: вообще убрать else if?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
BOOL InternalBlock(PString sys_ID)
{
  if (sys_ID == "AAAAAAAA-AAAA") return TRUE; //Mr. AAAA
  if (sys_ID == "BBBBBBBB-BBBB") return TRUE; //Mr. BBBB
  if (sys_ID == "CCCCCCCC-CCCC") return TRUE; //Mr. CCCC
...
  if (sys_ID == "XXXXXXXX-XXXX") return TRUE; //Mr. XXXX
  return FALSE;
}


Вариант 2: разбить на 2 блока, ну м.б. лет еще через 5 придется добавить 3-й.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
BOOL InternalBlock(PString sys_ID)
{
  if (sys_ID == "AAAAAAAA-AAAA") return TRUE; //Mr. AAAA
  else if (sys_ID == "BBBBBBBB-BBBB") return TRUE; //Mr. BBBB
  else if (sys_ID == "CCCCCCCC-CCCC") return TRUE; //Mr. CCCC
...
  else if (sys_ID == "XXXXXXXX-XXXX") return TRUE; //Mr. XXXX

  if (sys_ID == "00000000-0000") return TRUE; //Mr. 0000
  else if (sys_ID == "11111111-1111") return TRUE; //Mr. 1111
  else if (sys_ID == "22222222-2222") return TRUE; //Mr. 2222
...
  else if (sys_ID == "33333333-3333") return TRUE; //Mr. 3333
  else return FALSE;
}


Или пофиг? За эстетикой не гонюсь, тормозов в любом варианте при 100-200 проверок в C++ ждать неоткуда, а вот логическая ошибка критична. Смысл, жестко звпретить запуск проги на компьютерах с заданными ID.
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040588
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант 3
Код: plaintext
1.
2.
3.
4.
5.
return (sys_ID == "AAAAAAAA-AAAA"
      || sys_ID == "BBBBBBBB-BBBB"
      || sys_ID == "CCCCCCCC-CCCC"
...
      || sys_ID == "XXXXXXXX-XXXX") ? TRUE : FALSE;


В принципе вариант 1 тоже самое.
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040602
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

тогда наверно вариант 1, мне комментарии желательны, хотя в C/С++ вроде можно их писать между кодом в конце каждой физической строчки.

Т.е. else if категорически убрать, так?
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040604
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может поискать функцию которая даёт TRUE для набора строк. И минимизировать ее. Хорошо проканает если
быть уверенным что sys_ID имеет фиксированную разрядность.
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040606
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77тогда наверно вариант 1, мне комментарии желательны, хотя в C/С++ вроде можно их писать между кодом в конце каждой физической строчки.

Т.е. else if категорически убрать, так?
else if тут вообще не нужен. Комментарии вроде можно, проверить элементарно.
Вариант 1 из текущего быстрее всего сделать: автозаменой "else if" на "if"
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040630
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВариант 1 из текущего быстрее всего сделать: автозаменой "else if" на "if"
Угу. Так и сделал, чего мудрить то.
Thanks.
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040643
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
std::set/unordered_set и .count(sys_ID)?
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040817
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Код: plaintext
1.
2.
3.
4.
5.
6.
return (sys_ID == "AAAAAAAA-AAAA"
      || sys_ID == "BBBBBBBB-BBBB"
      || sys_ID == "CCCCCCCC-CCCC"
...
      || sys_ID == "XXXXXXXX-XXXX")
 ? TRUE : FALSE;


а это зачем? просто ретурна не достаточно, думаешь? ;)
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040842
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что if-else тоже имел-бы смысл если гистограмма входных значений sys_ID
была-бы близка к линейной. В этом случае мы могли-бы организовать нечто вроде
дихотомического поиска строк (насколько позволит вложенность if-else для компиллера).

А так код с Guard-expressions который "заворачивает" true наверх вполне себе эффективен
когда одни ключи очень частые а другие (пониже в коде) относительно реже.
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040849
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychDima T,
Код: plaintext
1.
2.
3.
return (sys_ID == "AAAAAAAA-AAAA"
      || sys_ID == "XXXXXXXX-XXXX")
 ? TRUE : FALSE;


а это зачем? просто ретурна не достаточно, думаешь? ;)
Не глубокий знаток С. Кто-то мне писал что логическими типами в С не все гладко, return <условие> имеет какие-то подводные камни и лучше дополнительно привести к TRUE/FALSE, поверил на слово, хуже точно не будет.
...
Рейтинг: 0 / 0
fatal error C1061: compiler limit : blocks nested too deeply
    #39040872
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Смысл, жестко звпретить запуск проги на компьютерах с заданными ID.А я бы сделал массив констант и циклом проверял.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / fatal error C1061: compiler limit : blocks nested too deeply
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]