Мои детишки пишут свои проги на Visual C++ от известной компании. У факультета есть какая-то забавная лицензия, позволяющая раздавать этот продукт студентам бесплатно, чем они и пользуются. Я сразу как пришел на факультет, поставил на свою офисную машину Slackware, а студентам сказал, что проекты они мне будут сдавать в виде исходников, которые я буду компилировать сам. Мы изучаем OpenGL, поэтому если писать на стандартном C++ используя GLUT, исходники будут прекрасно переносимы между системами. Написание переносимого кода было даже указано в качестве одной из целей курса.
И тут-то началось самое интересное…
Программы моих студентов сегфолтятся или вообще отказываются компилироваться со странными ошибками. Сначало было просто
main() must return int — Visual C++ проглатывает void main() в С++шной проге запросто.
for(int k=0;k<10;k++)
{cout << k << endl;};
int a = k;
Переменная k не определена снаружи цикла, тем не менее, такой код компилится на Visual C++ и исполняется на Винде!
int a[2];
int b = a[5];
Компилируется (что не удивительно) и исполняется на Винде. У меня, конечно, segfault.
int *arr = new int[5];
<..>
delete [5] arr;
-- компилируется и исполняется на Винде!
vector < vector > doubleArray(0);
doubleArray.resize(3);
double bubble = doubleArray[1][1] + doubleArray[1][2] + doubleArray[1][3];
-- компилируется и исполняется на Винде! У меня заняло полдня найти эту ошибку в пятистах линиях кода…
Я установил Линух на одну машину в лабе, сделал аккаунты всем своим студентам, глава департмента пообещал выдать еще три под Линух и Фрю — для студентов. Посвятил вчерашнюю лекцию объяснениям, как компилить проги на Линухе, как дебагить и редактировать. Сказал, что больше не буду принимать объяснения, что их проги работают под Виндой, а у меня сегфолтятся или не компилятся.
Но как-то криво они на меня поглядывают… Что б вы делали на моем месте? Я ж учить их должен правильному программированию, а не приколам одного IDE…
Good Luck,
UT
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Мне бы такого учителя как Вы!
Абсолютно Полностью Вас поддерживаю.
Противоположный пример — у нас препод игнорирует любые warnings, которые вызывает компилятор и даже не удосуживается их объяснить, просто говорит «забейте на них и все», а в лине такое не пройдет, и это, ИМХО, гуд.
Так что ДОЛОЙ КРИВОЕ ПРОГРАММИРОВАНИЕ В ВИНДЕ, ПИШИТЕ В *nix!! :))
Я тут как адвокат Дьявола (-: Еще ни кто не забыл?
Да, действительно, MSVC++ мягко говоря странноватый компилятор…
Но ведь вы не знаете, КАК он обходит вышеупомянутые проблемы? То ли он глотает баг как есть и оставляет дыру с возможностью сегфолта впоследствии, то ли он ее лотает своими средствами (что мне кажеться более правдоподобным). А вообще, есть под винду замечательное ИДЕ Dev-C++ называеться. Юзает MinGW (Minimalist GNU for Windows). Включает в себя gcc и базовые проги для компиляции и дебага. (Именно MinGW используеться для разработки ReactOS. Благодаря этому она одинаково хорошо компилиться как в винде, так и в Линуксе.)
Рекомендую студентам подсунуть. Проблем с компиляцией не будет, и косо смотреть перестанут.
Фтопку такого препода… Мало ли какие бывают варнинги…
Наш, пока все варнинги не истрибишь, проект не принимает.
На «ДОЛОЙ КРИВОЕ ПРОГРАММИРОВАНИЕ» можно было остановиться, винда тут не при чем.
Кстати такой вот вопрос к Uncle Theodore. Через какой период времени после начала обучения С++, Вы даете студентам понятие базового класса, производного класса….
А! так ведь проблема не в том, КАК он их обходит! А в том, что он ни слова не говорит, что вот тут ему пришлось обойти проблему! Если б они писали для себя или для друзей, гори оно огнем, это IDE. Задача ведь в том, чтобы научить студента правильному использованию стандартов языка. У нас стабильное число выпускников (5 — 10) идут работать программистами в организации, занимающиеся научным моделированием на мейнфреймах, на юниксовых рабочих станциях, на черт знает еще каких системах с разными архитектурами и компиляторами. Я пытаюсь внушить им, что строгое следование стандартам языка позволит им работать на любых машинах. Не говоря уж о том, что выработка правильных навыков программирования невозможна без строгого следования этим стандартам.
Я, кстати, еще гляну, как VC++ обходит нелегальное обращение с памятью. У меня сейчас VC++ нет, в понедельник на работе посмотрю.
Мне коллега сказал, что когда-то давно у них уже была такая проблема с Борландовым C++ом — проги, которые студенты скомпилили на VC++ не хотели компилиться на Борланде. Тогда был другой глава факультета, он и придумал бесплатно раздавать студентам VC++, морда козлячая… Наш теперешний руководитель хочет создать в лабе зоопарк различных ОСей, так что хоть здесь мне повезло… :-)
Спасибо, я посмотрю. Хотя косяки все равно будут. :-) С точки зрения студента, как это выглядит? Все было хорошо, потом пришел какой-то дядька с Линухом под мышкой, и все ему не так. Дали вот такую конфетку в виде компилятора от самого Мелкософта, так вот Биллу Гейтсу мой код нравится, а этому пингвинисту, видите ли — нет… :-)
При чем. Может, программировать на Винде и хорошо, а вот учить программированию — напряг…
Good Luck,
UT
Я не учу их языку, язык они к моим лекциям уже знают (в основном, это четверокурсники). А вообще, это одна из больших проблем сейчас на факультете. Computer Science I и II основаны на Java, соотвественно, первая прога, которую студенты пишут, начинается со слов public static class… И они до второго семестра не имеют не малейшего представления, что это такое…
Я убедил главу департмента, и со следующего года мы введем стандартный обязательный начальный курс по C++ во втором семестре. Кроме того, я буду читать курс по Software Design в следующем семестре, его переименуют в Computer Science III и сделают обязательным. Там я сделаю упор на иерархическую структуру софтверного проекта и использование объектно-ориентированной структуры языков (вместо рассчета стоимости проектов, как это делается сейчас).
Хороший мужик этот новый глава департмента… Он, кстати, доктор технических наук, не программист формально. Но шарит сурово. :-) Чья б корова мычала, да? :-)
Good Luck,
UT
@То ли он глотает баг как есть и оставляет дыру с возможностью сегфолта впоследствии, то ли он ее лотает своими средствами (что мне кажеться более правдоподобным).@
вероятней всего первое — что легко проверить!
Так-так. Интересно! (-:
Проверьте и нам скажете. Я склоняюсь ко второму варианту, ибо Микрософт опираеться на простоту во всем. Хорошо это или плохо, зависит от конкретного случая. В недавнем прошлом, по должности программиста в родном универе, был вынужден писать далеко не маленький проект на VBA с завязкой на Excell/Access. Дак вот там, простота кодирования оправдана. Там действительно, ЗАВЕДОМО НЕРАБОЧИЙ код, интерпретируеться и работает. И работает правильно! А сделано это для того, что бы на VBA смог ла писать даже девица-секретарь, не то, что без высшего технического, с незаконченым средним образованием.
Когда речь идет о разработке полноценного ПО, а не приплюха к базе данных, такое упрощение недопустимо. Видимо Микрософт думает по-другому. Хотя… Как известно Си — язык для ленивых, но внимаетльных программистов. Базовый компилятор Си проглатывал такое вот:
Запросто. И писал вот это 10 в черте-какую память.
Так же и все нормальные компиляторы.
Язык Си требует от программиста внимания.
Это нормально. Сейчас, нормальные компиляторы (gcc) пишут варнинги. Это то же нормально. Но Микрософт, видимо, решила, что знает лучше программиста, что он хотел сказать. То, что компилятор обломит процесс при обнаружении подобного рода «ошибки» то же не есть тру. Ибо это может быть не ошибка а хитрый план программиста.
В принципе, стандартный компилятор MSVC соответсвует ANSI, а то, что при исполнении кривого кода ничто не падает в кору — заслуга Windows. А то, что при компиляции кривого кода нет варнингов — грех VC++.
Наш учитель инфы (который кстати неплохой кодер на Дельфях и вобще умный мужик) — так он даже не смотрит на всякие ворнинги, а сам проверяет код. Если он нерационален по его мнению) — то программу он не принимает.
Когда у меня был базовый курс программирования на C, препод проверял наш код в Intel C++ Compiler 7.0 и считал его эталонным для x86. Я с ним согласен, хотя считаю компилятор MSVC достаточно хорошим. То что он не выкидывает варнинги и (наверное)лечит кривой код, впервом случае наверняка настраивается, а во втором заслуга компилятора. Прежде чем хаить рекомендую ознакомится с ключами компилятора. Там опций ни чуть не меньше чем у gcc, который я считаю не слишком оптимизирующим компилятором и качественным.
Э-э, батенька, ты ври, да не завирайся. Первые две ошибки в моих примерах синтаксические. И ворнинги тут не при чем, компилятор не *имеет* права исправлять синтаксические ошибки самостоятельно, с ворнингами или без, поскольку он не знает, чтО именно хотел здесь написать программист! К тому же классу относится и
int *arr = new int[5];
<..>
delete [5] arr;
Ты, вроде, не один хелло ворлд в своей жизни написал, так что понимаешь это не хуже меня. А как VC++ «лечит» ошибки памяти, я завтра посмотрю, но тот же самый аргумент будет работать и здесь, так что лучше для репутации VC++, если бы он их не лечил совсем, чем подставлял свой код вместо написанного программистом.
Good Luck,
UT
PS Почитай вот эту статейку http://oakroadsystems.com/tech/msvc.htm
Там и про ключики есть, и про MSовские хедеры.
Еще один прикол, кстати. После практики написания Сяшного кода в IDEях типа тра-ля-ляC++ у студентов складывается впечатление, что С и С++ это один и тот же язык. Это не есть сермяжная правда. Скомпилируйте вот этот код
#include
int main()
{
printf(«%s\n», (sizeof(’a') == sizeof(char)) ? «C++» : «C»);
return 0;
}
как С прогу и как С++ прогу, прогоните — узнаете кое-то интересное…
Good Luck,
UT
прикольно :)
А где это я соврал? В том, что он не выкидывает варнинги? Или в том что он (*наверное*) лечит кривой код?(передача массива по сслыке без проверки длинны и соответственно попытка записать в n+1 элемент при n размерном массиве) Или в том, что ключей у компилятора мало?
Hаз уж пошел оффтоп, ловите камень в огород c++:
<<C>>
<<C++>>
Все понимают, что проекты делают одно и то же.
no comments.
c++ далеко не идеальный язык программирования. И лишние, да именно лишние классы из iostream.h никуда не деваються. Это только пример. c++ более удобный и, может быть, более гибкий чем c или objective c. Но непомерно расточительный.
К тому же я не понимаю, что тебе не нравится. Было бы грустно, если бы MSVC не компилил правильный код(ANSI), а только свой. Но раз он компилит и привильный и кривой(додумывая сам) так в чем проблема. Убеди студентов писать правильный код. MSVC тут не причем, это называется гибкость, и видимо студентам (и очень многим людям насрать на переносимость и сандарты), потому что если вруг MS выкинет свой c run-time lib совместимую с ANSI, 95% населения насрет на ANSI.
Так что вариант один- убедить писать правильный код, гарантируя, что код сделат именно то, что ты написал, а не попытается что-то исправлять. например автоматом приводя void main() к int main() и так в таком духе.
Более того, я полагаю,что где-то в глубине MSVC++ есть список самых распространнеых ошибок(типа как запись в int array[n]; array[n]=q;)и варианты их лечения.
единственный способ научить студента, например меня, писать ПРАВИЛЬНЫЙ код, это как минимум, показывать все мои ошибки!
«Убеди студентов писать правильный код.» Одно дело убедить, и совсем другое дело показать на практике, что это не правильно — так не работает!
Оп-па!!!!
А почему так???????
printf(«%d\n», sizeof(’a') );
говорит 1.
и
printf(«%d\n», sizeof(char) );
говорит тоже 1.
У него что, 1 не равно 1??!??!?!?!
ТАПАК, НАХ ТЕБЕ iostream если ты не пользуешь тут никаких классов и пр. из него??!????!
кроме того есть strip, который вроде выкидывает лишнюю хрень их бинаря
В Сяшной проге должно быть
sizeof(’a') == 4
sizeof(char) == 1
а в С++шной
1 и 1 соответственно. Какой у тебя компилятор?
Good Luck,
UT
Здесь:
И в своем ответе я написал, почему компилятор (особенно такого языка как С) не должен пытаться молча исправлять код по своему усмотрению. Потому что он не знает, что именно имелось в виду. Может получиться такой баг, что никаким тестингом не отловишь, а в самый критический момент всему придет 3,14здец.
И как я его буду убеждать, студента-то? Он говорит, «У меня все работает, а у тебя — нет, значит проблема у тебя» А когда я его тыкаю носом в синтаксическую ошибку, говорит «А откуда я должен был знать что это ошибка? Все время так писал, все хорошо было!» И что? Воспетый тобой VC++ привил человеку неверные навыки программирования. Потом он идет программировать на мейнфрейм, а ты удивляешься, почему синоптики погоду правильно предсказать не могут, к примеру. Или почему самолеты на голову падают. Все еще думаешь, это хорошо, что добренький компилятор втихую ошибки правит?
Good Luck,
UT
А вот это уже не есть правильно! В Т И Х У Ю означает «потихоньку», а не то, что цензура подумала… Долой цензуру! Даёшь свободу слова для народного русского мата! :-) Шутю.
Good Luck,
UT
Ну добавь сюда printf(..) и cout << … соответственно. Что-то измениться?
Да, есть приблуды. Но это именно приблуды, а не штатные средства компилятора. Что огорчает.
Так оно, не должон компилятор править «ошибки» сам.
Или хотя бы должон об этом говорить.
а почему так?
я все книжки свои перерыл, никак понять не могу зачем 'a' четыре байта
afair. sizeof(’a')==sizeof(int) :)
посему,
не всегда соответствует истине… ;))))
потому, что можно сделать
ну вообще-то в проге на С++ int тоже 4 байта, однако 'a' всего один байт
кури ман. gcc умеет при указании флага ( вроде -s) прогонять бинарь через strip
2LONGOBARD:
$ cat corcpp1.c
#include
int main()
{
printf(«%s %d\n», «Size of a is », sizeof(’a') );
printf(«%s %d\n», «Size of char is », sizeof(char) );
return 0;
}
$ /usr/bin/gcc-3.3.4 corcpp1.c -o corcpp1
$ corcpp1
Size of a is 4
Size of char is 1
$ /usr/local/gcc-3.4.2/bin/gcc corcpp1.c -o corcpp1
$ corcpp1
Size of a is 4
Size of char is 1
Хм… Чей-то тута не тово-то… А! Понял! 4 байта на 'a' отводит С, а не С++, при чем здесь g++?
Good Luck,
UT
.
18.10.2004 23:39
..
18.10.2004 23:39 217 600 c++.exe
18.10.2004 23:39 5 120 c.exe
17.10.2004 21:07 121 main.c
17.10.2004 21:07 146 main.cpp
4 файлов 222 987 байт
2 папок 832 352 256 байт свободно
[E:\dev\cppdoesntrule]:>
(-: Моя плакаль.
Н ХЗ, во многих makefile я видел пользование stip ;)
ну так почему 'a' в С — это 4 байта, а в С++ 1 байт? :)))
я уже всех знакомых достал
Видимо я что-то не понимаю, но на IA-32 char должен быть 4 байта т.е. два слова. Поскольку у нас слово — два байта, полагаю что компилятор C++(g++) нихрена не char пользует, а нечто иное.
// MSDN все-таки хорошая вещь :)
PRB: Sizeof Constant Character Returns Different Values
ID: Q150380
——————————————————————————--
The information in this article applies to:
The Microsoft C/C++ Compiler (CL.EXE)
Microsoft Visual C++ 32-bit Edition, versions 4.0, 4.1
——————————————————————————--
SYMPTOMS
The sizeof(’x') or sizeof(L’x') constants do not return expected results. In C, the return value is 4 for the sizeof character constant and 2 for the sizeof multicharacter constant. In C++, the return value is 1 for the sizeof character constant and 2 for the sizeof multicharacter constant.
CAUSE
The specification on this point is different for C from what it is for C++. In C, a character constant is of type int. In C++, a character constant is of type char. Multicharacter constants are implementation dependent.
RESOLUTION
When using C, do not use sizeof to determine the width of a character constant. Use sizeof(«») to give the width of one character in both C and C++.
STATUS
This behavior is by design.
REFERENCES
For more information, see «The Annotated C++ Reference Manual» by Margaret Ellis and Bjarne Stroustrup, Section 2.5.2.
Additional query words: 2.00 2.10 2.20 4.00 4.10
Keywords : kbCompiler kbCRT kbVC
Version :
Platform : NT WINDOWS
Issue type :
Last Reviewed: January 14, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.