-
- Уже было сказано, что после case должно стоять константное выражение. Но от себя добавлю, что компилируется switch в виде двух массивов (обычно помещаемых по flash!): в одном из них перечислены case-константы, а во-втором соответствующий им список Ксения(388 знак., 20.10.2013 02:21)
- на разных платформах, разные компиляторы, разные уровни оптимизации - реализация разная. Совсем не обязательно табличная - koyodza(20.10.2013 10:35)
- не интересовался кишками, видимо массив констант компилятором сортируется по возрастанию, а затем производится двоичный поиск? ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA - инженегр(20.10.2013 09:59, )
- браузер планшета глючит на этом сообщении, пока не повернешь. мир катится в бездну - Vladimir Ljaschko(20.10.2013 10:27)
- Объявите cmd_vals, как static (тем самым зафиксировав ее место в памяти), тогда, возможно, switch воспримет выражение &cmd_vals.en, как константу :) - Ксения(20.10.2013 03:04)
- Ошибка выдается, потому, что по стандарту языка после "case" должно следовать константное выражение. Да, и по смыслу: обратите внимание , что после "case constant-expression" ставится двоеточие, поскольку это - метка, а метки в ЯВУ - определяются Палыч(172 знак., 20.10.2013 02:03)
- выражение как раз константное - указатели на константы. Возможно, линкер не видит ? - zeleny(20.10.2013 02:36)
- действительно странно. У меня аналогичная по смыслу конструкция работает нормально koyodza(563 знак., 20.10.2013 10:39)
- А что тут странного? Что такое, например, ADC2 как не константа. Или нет? - Bill(20.10.2013 13:11)
- здесь это адрес регистра. У топикстартера адрес переменной, это тоже константа, если переменная статическая. Если же она не статическая, то он сам себе злобный буратино - koyodza(20.10.2013 13:16)
- Еще раз: для компилятора адрес не является константой! Чему этот адрес равен: 1, 100, 1000? - Bill(20.10.2013 13:18)
- адрес статической переменной элементарно может выступать в роли константы. Может не во всех случаях, но по крайней мере для switch подходит, если выполнить приведение типов - koyodza(20.10.2013 13:20)
- Чему конкретно равен этот адрес: 1, 10, 20? - Bill(20.10.2013 13:24)
- вычисляется на этапе линковки - koyodza(20.10.2013 13:28)
- Вот именно!!! На этапе компиляции это значение неизвестно и, стало быть, не является константой! - Bill(20.10.2013 13:31)
- ну компилятор может вычислить что адреса ссылаются на разные объекты, а линкер заполнит их при линковке - zeleny(21.10.2013 00:20)
- ну и что? - koyodza(20.10.2013 14:30)
- а как поведёт себя программа, если два выражения в case окажутся одинаковыми после линковки? - инженегр(20.10.2013 14:39, )
- Да дело даже не в этом. Компилятор просто не сможет отсортировать значения case. - Bill(20.10.2013 14:45)
- Теоретически компилятор может заниматься "тупым перебором" при невозможности отсортировать на этапе компиляции, но вот предсказуемости от такой программы ждать не следует. - инженегр(20.10.2013 15:58, )
- В том-то и дело, что в соответствии со стандартом все значения case должны быть константами или константными выражениями, вычисляемыми на этапе компиляции. - Bill(20.10.2013 16:09)
- Теоретически компилятор может заниматься "тупым перебором" при невозможности отсортировать на этапе компиляции, но вот предсказуемости от такой программы ждать не следует. - инженегр(20.10.2013 15:58, )
- Да дело даже не в этом. Компилятор просто не сможет отсортировать значения case. - Bill(20.10.2013 14:45)
- Ну а значение case должно быть константой. Поэтому программа и не компилируется. - Bill(20.10.2013 14:34)
- а как поведёт себя программа, если два выражения в case окажутся одинаковыми после линковки? - инженегр(20.10.2013 14:39, )
- Вот именно!!! На этапе компиляции это значение неизвестно и, стало быть, не является константой! - Bill(20.10.2013 13:31)
- вычисляется на этапе линковки - koyodza(20.10.2013 13:28)
- Чему конкретно равен этот адрес: 1, 10, 20? - Bill(20.10.2013 13:24)
- адрес статической переменной элементарно может выступать в роли константы. Может не во всех случаях, но по крайней мере для switch подходит, если выполнить приведение типов - koyodza(20.10.2013 13:20)
- Еще раз: для компилятора адрес не является константой! Чему этот адрес равен: 1, 100, 1000? - Bill(20.10.2013 13:18)
- здесь это адрес регистра. У топикстартера адрес переменной, это тоже константа, если переменная статическая. Если же она не статическая, то он сам себе злобный буратино - koyodza(20.10.2013 13:16)
- А что тут странного? Что такое, например, ADC2 как не константа. Или нет? - Bill(20.10.2013 13:11)
- А что толку сравнивать адреса/указатели между собой, если они таковы, как их в памяти расположил компилятор? Т.е. от хранящихся по этим адресам величин независимых. - Ксения(20.10.2013 02:39)
- эти указатели известны на этапе компиляции (по кр.мере линкеру). Не пойму чем switch отличается от if. - zeleny(20.10.2013 02:43)
- На этапе компиляции как раз значение указателя неизвестно. А линкер - это уже совсем другая история. Или нет7 - Bill(20.10.2013 10:25)
- if сравнивает не указатели, а числовые значения, в том числе и вычисляемые с обеих сторон от знака двойного равенства. Тогда как switch может вычислять и сравнивать switch-выражение только с набором case-констант. Сравнивать между собой адреса Ксения(87 знак., 20.10.2013 02:53 - 02:57)
- эти указатели известны на этапе компиляции (по кр.мере линкеру). Не пойму чем switch отличается от if. - zeleny(20.10.2013 02:43)
- действительно странно. У меня аналогичная по смыслу конструкция работает нормально koyodza(563 знак., 20.10.2013 10:39)
- выражение как раз константное - указатели на константы. Возможно, линкер не видит ? - zeleny(20.10.2013 02:36)
- Уже было сказано, что после case должно стоять константное выражение. Но от себя добавлю, что компилируется switch в виде двух массивов (обычно помещаемых по flash!): в одном из них перечислены case-константы, а во-втором соответствующий им список Ксения(388 знак., 20.10.2013 02:21)