chernenko 0 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба так писали про 6.4 Я понимаю. Я написал для статистики, что результат свойственен последней версии и в одной из предыдущих все работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба Таки глюк компилятора... PS: Как действовать автору топика в подобных ситуациях наглядно продемонстрировал KRS. =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба а новый компилер 6.40.4 (кажется) кто нибудь использует? надо бы в ЯР код послать, если не исправили еще Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sagittarius 0 4 октября, 2012 Опубликовано 4 октября, 2012 · Жалоба а новый компилер 6.40.4 IAR C/C++ Compiler for ARM 6.40.4.24170 (6.40.4.24170) C:\Program Files (x86)\IARM64\arm\bin\iccarm.exe 13/Sep/2012 05:19:20, 27336704 bytes все еще бажит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 4 октября, 2012 Опубликовано 4 октября, 2012 (изменено) · Жалоба Глючат именно циклы с предусловием (и не только циклы с goto тоже самое) но с проверкой условия в начале. Причем независимо от управляющей переменной! из этих функций нормально компилируются только нечетные! void test_bug4(uint8_t *buf) { unsigned i; unsigned j; j=100; i=0; while(i<10){ buf[i++]=j; j-=2; } buf[i]=0; } void test_bug5(uint8_t *buf) { unsigned i; unsigned j; j=100; i=0; do { buf[i++]=j; j-=2; } while(i<10); buf[i]=0; } void test_bug6(uint8_t *buf) { unsigned i; unsigned j; j=100; i=0; while(j>0){ buf[i++]=j; j-=2; } buf[i]=0; } void test_bug7(uint8_t *buf) { unsigned i; unsigned j; j=100; i=0; do { buf[i++]=j; j-=2; }while(j >0); buf[i]=0; } void test_bug8(uint8_t *buf) { unsigned i; unsigned j; j=100; i=0; loop: if (i < 10) { buf[i++]=j; j-=2; goto loop; } buf[i]=0; } void test_bug9(uint8_t *buf) { unsigned i; unsigned j; j=100; i=0; loop: buf[i++]=j; j-=2; if (i < 10) goto loop; buf[i]=0; } Изменено 4 октября, 2012 пользователем IgorKossak [codebox] для длинного кода!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VslavX 0 4 октября, 2012 Опубликовано 4 октября, 2012 · Жалоба Версия 5.41 - генерирует нормально. Мда, никак оно на 6.x перейти не получается, серьезно будем рассматривать GCC от CodeSourcery/Mentor. Глючат именно циклы с предусловием Что-то с тестированием в ЯР плоховато. Такие косяки можно автоматическими тестами выловить. Скомпилируй и запусти на реальном железе - все быстро вылезет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grisha_scorpion 0 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба Используйте квалификатор volatile. И будет вам счастье. Справка: Квалификатор volatile указывает компилятору на то, что значение переменной может измениться независимо от программы, т.е. вследствие воздействия еще чего-либо, не являющегося оператором программы. Например, адрес глобальной переменной можно передать в подпрограмму операционной системы, следящей за временем, и тогда эта переменная будет содержать системное время. В этом случае значение переменной будет изменяться без участия какого-либо оператора программы. Знание таких подробностей важно потому, что большинство компиляторов С автоматически оптимизируют некоторые выражения, предполагая при этом неизменность переменной, если она не встречается в левой части оператора присваивания. В этом случае при очередной ссылке на переменную может использоваться ее предыдущее значение. Некоторые компиляторы изменяют порядок вычислений в выражениях, что может привести к ошибке, если в выражении присутствует переменная, вычисляемая вне программы. Квалификатор volatile предотвращает такие изменения программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба Используйте квалификатор volatile. И будет вам счастье.В данном случае он абсолютно не нужен, ибо "воздействия еще чего-либо, не являющегося оператором программы" тут нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grisha_scorpion 0 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба В данном случае он абсолютно не нужен, ибо "воздействия еще чего-либо, не являющегося оператором программы" тут нет. Компилятор не знает есть внешнее воздействие или нет. Он не будет оптимизировать код где используются переменные с квалификатором volatile Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба Компилятор не знает есть внешнее воздействие или нет. Он не будет оптимизировать код где используются переменные с квалификатором volatile Как способ обойти баг компилятора это, возможно, и сработает. Но автор уже обошёл его, поэтому ваше предложение не очень-то интересно. А пафос темы именно в том, что в компиляторе присутствует баг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба Компилятор не знает есть внешнее воздействие или нет.Программист знает. Бага компилятора не является внешним воздействием, а других влияний на эти переменные нет. Прочитайте свою же справку и покажите, какая из перечисленных там причин подходит для этого кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба кстати с volatile тоже не все в порядке! при цикле в 100 байт и присваивание 0. IAR сообразил что это очистка памяти и вызвал ___aaeabi_memclr дальше не копал, но что то я сомневаюсь что эта функция будет по байтам 0 писать! А все таки раз уж volatile то менять байтовый доступ на словный не совсем корректно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба кстати с volatile тоже не все в порядке! Чем дальше в лес, тем толще партизаны! Да уж, ЯР отжигает. Им пора "горячую линию" по поводу своих багов открывать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alecsej 0 11 октября, 2012 Опубликовано 11 октября, 2012 · Жалоба а что уже можно тип не указывать? только unsigned? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 11 октября, 2012 Опубликовано 11 октября, 2012 · Жалоба а что уже можно тип не указывать? только unsigned? Всегда можно было. Читайте учебники. K&R, к примеру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться