|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 27, 2003 09:54:54 Запусти да посмотри. У тебя же 2002/2003 точно есть :) Но не на работе, Здесь только VS 6 + Fortran + Masm32 + PHP + Perl %))) Да и хватит вам пепел сыпать на С++ это нормальное явление. В каждом языке есть подобный БАГ. Что поделать, за высокою сложность ОПТИМИЗАТОРА нужно как-то платить. Поймите это :) Лучше напишите письмо разработчикам :) |
|
|
Дата: Сен 27, 2003 21:04:43 Вот, ещё один баг, который проявляется даже без оптимизации:
simpleStack P; // <- абстрактный стек для int
P.push(5);
P.push(4);
P.push(3); // теперь в стеке "хвост"<-5<-4<-3
printf("P: %d %d %d", P.pop(), P.pop(), P.pop());
А теперь так:
simpleStack P; // <- абстрактный стек для int
P.push(5);
P.push(4);
P.push(3); // теперь в стеке "хвост"<-5<-4<-3
printf("P: %d ", P.pop());
printf("%d ", P.pop());
printf("%d", P.pop());
В первом случае получается дамп стека наоборот, что вполне объяснимо для ассемблерщика, но как это объяснить студентам, пишущим на С и асма не ведающим? Ведь с точки зрения С первый вариант тоже верен. |
|
|
Дата: Сен 28, 2003 17:12:39 Я, например, не считаю это багом... скорее недосмотр программиста. Это обычный 'side effect' - каких много. Пример: #define MINIMUM(var,n1,n2) \ if (n1 < n2) var = n1; \ else var = n2; int i1=45; int i2=47; int minVar; MINIMUM (minVar, i1++, i2++) |
|
|
Дата: Сен 28, 2003 19:23:20 AsmGuru62 А в чём же баг? У меня правильно выдаёт: 46. |
|
|
Дата: Сен 29, 2003 17:51:24 · Поправил: AsmGuru62 Я к тому, что параметры макро используются несколько раз и пост-инкремент тоже должен повториться столько же раз. Таким образом, оригинальные значения параметров i1,i1 будут не такими, как ожидается. P.S. Я послал это в Microsoft. |
|
|
Дата: Сен 29, 2003 18:46:26 · Поправил: Quantum AsmGuru62 параметры макро используются несколько раз и пост-инкремент тоже должен повториться столько же раз Ясно. Вспомнил такой казус... В C следующий код возвращает значение "6": int i = 5; i = i++; return i;Зато в Java он возвращает "5"! Это был супер-баг когда я переводил С-код на Java. |
|
|
Дата: Сен 29, 2003 20:41:23 · Поправил: rst Это блин мелочи... в МС компилерах есть гораздо больше недочетов и багов а так же Not Implemented, которые действительно мешают жить... И совсем не связанные со сложностью реализации оптимайзера. Вспомним хотя бы отсутсвие спецификации исключений. И у меня где-то были прикольные примеры с шаблонами, где Cl валился со словами - "мне что-то стало плохо, правда почему мне плохо - х.з." . Самый маленький занимал 3 строчки.. -)) |
|
|
Дата: Сен 30, 2003 06:53:20 rst Это блин мелочи... Разве?! Из-за подобных мелочей проекты не компилятся! Самый маленький занимал 3 строчки Так поделись этими примерами. Думаю, многим будет интересно. |
|
|
Дата: Сен 30, 2003 11:39:08 Quantum В C следующий код возвращает значение "6" Если бы он возвращало что нибудь другое это было бы багом, на самом деле эта ситуация соответствует спецификации ANSI C к примеру
Записано На самом деле
i = i++ * 3 i = i*3
i++
i = i++ i = i
i++ |
|
|
Дата: Сен 30, 2003 12:37:55 По поводу моего предидущего поста: Посмотрел ANSI C к сожалению там по этому поводу говориться очень мутно. Так что лучше избегать таких конструкций, а то будете получать компиляторно-зависимый код. |
|
|
Дата: Сен 30, 2003 13:52:29 Посмотрел ANSI C к сожалению там по этому поводу говориться очень мутно. Так что лучше избегать таких конструкций, а то будете получать компиляторно-зависимый код. Да нет, как раз в стандарте этот момент хорошо описывается. Есть операция i++, а есть операция ++i. Эффект, понятное дело несколько отличается. P.S. Прежде чем ругать VS 6.0 навесьте на него хотя бы последний сервис пак. :-) P.P.S. VS 2002 ругать можно. :-)) |
|
|
Дата: Сен 30, 2003 15:44:42 >Разве?! Из-за подобных мелочей проекты не компилятся! Да , это сложный баг в принципе и его сложно найти, НО это мелочь. Есть более досадные вещи в С++. Пример - вызвать как callback функцию, функцию, являющуюся нестатическим членом класса, с привязкой к конкретному экземпляру. В С++ этого почти нет. Можно через mem_fun нужно посмотреть свой старый код. А можно как это в WTL реализовано. Мне приходилось писать thiscall_adapter который делал push this;jmp fun. Вот это действительно начинает превращаться в проблему - когда язык в принципе не предназначен для такого, и средств для реализации - не особо есть. И тогда стоишь перед trade-off - либо писать с геморром, но на "языке программирования" либо превращать его в свою реализацию вот такими ассемблерными вставками-хелперами. А по поводу примера как заставить в 3 строчки упасть компилер от MSVC - сейчас нет доступа к помойке с моими старыми проектами - как доберусь - сразу запощу. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.089 |