Текст: ...В языке С++ введена ещё одна возможность привеления типов, которую обеспечивает функциональная форма преобразования типа: имя_типа(операнд). Используется, когда тип имеет простое(несоставное)обозначение: long(2) - внутреннее представление - 4 байта, double(2) - внутр. представ-ние - 8 байт. Недопустимо: unsigned long (2) // Ошибка !!! Двойка в скобках - это число, тип которого устанавливается ? Почему unsigned long (2) - ошибка ? Прокомментируйте, пожалуйста. Кстати, пока писал вопрос, почти понял сам. Bob Johnson прав про значительную долю ответа в вопросе :))) ...
Доброе время суток, Challenger! Да, Bob Johnson, прав: ты сам сможешь найти ответ в своем вопросе: Используется, когда тип имеет простое(несоставное)обозначение... Да прибудет с тобой Велика Сила! Ответ отправлен: 13.06.2003, 23:04 Отправитель: BOLT Отвечает Yuri Gordienko
Добрый день, Challenger! Используй u_long(2). Просто unsigned long(2) интерпретируется компилятором как функция long(2) с непонятной хренотенью "unsigned" перед названием функции. Успехов Ответ отправлен: 13.06.2003, 11:10 Отправитель: Yuri Gordienko Отвечает baldr
Доброе время суток, Challenger! Да, в скобках - пишется число, тип которого устанавливается. Или, наоборот, можно написать так: (long)2 - это будет то же самое, что и long(2) . А unsigned long нельзя потому, что тут уже два слова используются, а это уже некоторая неопределенность. В некоторых компиляторах присутствует модификатор ulong вместо этого (вариант: ULONG).
Ответ отправлен: 13.06.2003, 23:07 Отправитель: baldr Отвечает Hayk
Доброе время суток, Challenger! В дополнение к прозвучавшим ответам прибавлю, что компилер MSVC 6.0 понимает этот трюк. Ответ отправлен: 16.06.2003, 13:15 Отправитель: Hayk
Вопрос № 856
Взгляните на код в приложении. При выполнении происходит ошибка, пишется Debug Assertion Failed. Ну я догадался второй delete i закомментировать (уже в приложении), всё прошло нормально. Почему нельзя ещё раз удалить высвобождённое место, потому что его уже нет ? :)) В книжке написано, всё будет нормально, просто вернётся NULL, хотя вероятно Виктор прав, книжка та писана для TС++ 3.x. А у меня MS C++ 6.0.
Доброе время суток, Challenger! Работать с указателем после применения delete преступно, т.к. по этому адресу может быть что угодно. Повторный вызов delete к необнуленному указателю - это тоже преступление, т.к. так можно и винт форматнуть (образно говоря). Повторное вызов delete для обнуленного указателя допустим (т.к. delete проверяет указатель на равенство нулю), но выглядит до безобразия глупо!!! Успехов
Ответ отправлен: 13.06.2003, 13:06 Отправитель: Yuri Gordienko Отвечает BOLT
Доброе время суток, Challenger! Ты сам ответил на свой вопрос.Вообще-то, если я не ошибаюсь, повторное высвобождение памяти чревато крахом ОС, т.к. указатель принимает случайное значение.Современный менеджеры памяти более "хитрые" и предупреждают об этой ошибке. Да прибудет с тобой Велика Сила! Ответ отправлен: 13.06.2003, 23:03 Отправитель: BOLT Отвечает vitya
Добрый день, Challenger! Память просто нельзя удалять два раза. Но например следующий код работает int i = new int[5]; ... delete [] i; i = NULL; delete [] i; delete i; Так как нулевой указатель удалять можно. Далее. В программе ошибки: после того, как для переменной выделена память в первый раз ее никто не удаляет, а потом в ту же переменную снова выделяется память. Соответственно происходит утечка памяти. 3. после delete i - cout << *i; работать не должен и должен возбуждать исключение.
Ответ отправлен: 13.06.2003, 11:38 Отправитель: vitya Отвечает baldr
Добрый день, Challenger! Не знаю, что у тебя за книжка, но я тебе посоветую с указателями так не шутить... Ты создаешь динамически переменную с указателем i, а потом перезаписываешь указатель уже другим числом - надо сначала удалить предыдущее (delete). Причем, это ты делаешь неоднократно. Это не есть хорошо, ибо возникают неосвобожденные элементы памяти. Под виндой, возможно, и есть какой-нибудь garbage collector (или как он там...), но не факт. Короче, удаляй за собой мусор! И далее - ошибка возникает, видимо, там где ты, после удаления элемента (delete) пытаешься вывести его в поток (вывод *i в cout). Элемента уже нет и i, скорее всего, указывает на NULL. И разыменовывать его нельзя. Так что надо удалять уже после вывода или выводить просто значение указателя, а не разыменовывать его. Также, полезно почаще делать проверку на NULL
в разных частях программы (если она большая) и присваивать указателю NULL принудительно после удаления его памяти с помощью delete - так ты избавишь себя от кучи проблем в случае разного понимания текста программы тобою и компилятором. :)
Ответ отправлен: 13.06.2003, 23:08 Отправитель: baldr Отвечает Vdr
Добрый день, Challenger! По идее, когда ты вызвал второй раз new, ты потерял память выделенную для него изначально. После delete память освободилась и считается, что указатель никуда не указывает, поэтому второй раз удалить его нельзя. Операции с i все еще возможны, потому, что это все таки переменная которая никуда ни делась. Удачи! Ответ отправлен: 16.06.2003, 10:45 Отправитель: Vdr Отвечает Avl2k
Доброе время суток, Challenger! По стандарту оператору delete надо передавать или указатель на объект, выделенный по new, или NULL. В противном случае (что и происходит, когда память уже освобождена и указатель "смотрит" на освобожденное место) поведение не определено (т.е. зависит от реализации, и завязываться на него ни в коем случае нельзя - для переносимости). Вообще, повторное освобождение выделенной памяти говорит об ошибке в программе, поэтому в MSVC++ в debug'е и выдается сообщение об ошибке. С уважением, Avl2k. Ответ отправлен: 16.06.2003, 12:31 Отправитель: Avl2k
Вопрос № 857
Умоляю дайте пример как создать на Вин32АПИ (компилятор VC++ 6)простейшее приложение, которое выводит два окна и не завершается, пока не закроют оба окна??? В книжке сказано, мол создайте два класса окна и не посылайте сообщение WM_QUIT, пока не закроются оба окна, но как это сделать??? Перепробовал кучу вариантов, но толку никакого (в приложении один из последних вариантов (абсолютно дурацкий, так как уже об стену головой бьюсь), при котором окна хоть и закрываются, но организовываем Ctrl+alt+del -> программа зависла...). Под Вин начал учиться писать буквально говоря вчера, и по крайней мере пока практически ничего в этом деле не понимаю (особенно со всякими сообщениями, вызовами обработчиков событий и тому подобного), а следовательно, очень хочется получить именно работоспособный пример. Пожалуйстааааааааааааааааааааа.........................................
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.