К сожалению непонятна. Почему вы считаете, преобразование int -> void* компилятор может сделать правильно для данной платформы, а обратное преобразование void* -> int вызовет у него какие-то затруднения?
Еще раз - в условиях на С допустимы только целочисленные выражения (так как сравнение идет с целой константой 0). Если результат выражения не int осуществляется неявное преобразование в int (корректное для данной платформы). Если же исходить из вашей (буду считать ее _вашей_ пока не ткнете ссылкой на стандарт) логики, то и для выражений с плавающей точкой надо употреблять конструкции типа "if(a == 0.0)".
>Если же исходить из вашей (буду считать ее _вашей_ пока не ткнете ссылкой на стандарт) логики, то и для выражений с плавающей точкой надо употреблять конструкции типа "if(a == 0.0)".
man malloc не читали ?
В соответствии со стандартом ISO/IEC98999:1990
в случае ощибки он обязан возвращать NULL pointer, а не 0x0.
Речь идет исключительно об указателях.
Преобразование не
int -> void*
а
int* -> void*
На ряде архитектур int - 32 бита (сам CPU 32 битный), но шина адреса
может иметь 48 или 64 бита, отсюда int * - 48 или 64 бита.
и конструкция (void *)0 равна например 0xFFFFFFFE а не 0x0.
int *p = malloc(); malloc вернул NULL pointer- ошибка выделения памяти
выражение if (p) обрежет его до 32 бит и мы получим true, хотя была
ошибка.
Выражение if (p != (void*)0) вернет false
Поскольку компилер обязан сгенерить код в котором сравниваются не
32 битные регистры данных, а 48/64 битные регистры адреса.
Что то в этом роде.
В "Kernel Normal Form" на это обращается спец. внимание, поскольку
при портировании ядра на другую платформу может возникнуть ряд
неоднозначностей, связанных именно с представлением указателей.
> в случае ощибки он обязан возвращать NULL pointer, а не 0x0.
> Речь идет исключительно об указателях.
Читал и с _этим_ я не спорю. Хотя мне трудновато вас понять: 0x0 - это что за указатель?
> Преобразование не
> int -> void*
> а
> int* -> void*
Извините, но (void*)0 - это именно преобразование int (0) -> void*.
> На ряде архитектур int - 32 бита (сам CPU 32 битный), но шина адреса
> может иметь 48 или 64 бита, отсюда int * - 48 или 64 бита.
> и конструкция (void *)0 равна например 0xFFFFFFFE а не 0x0.
Опять же. Мне все равно как выглядит в битовом виде (void*)0. Мне (и if, while и т. д.) интересно значение (int)NULL. По моему - это 0 (если преобразования симметричные).
> int *p = malloc(); malloc вернул NULL pointer- ошибка выделения памяти
> выражение if (p) обрежет его до 32 бит и мы получим true, хотя была
ошибка.
Правильный компилятор ничего обрезать не станет, а сделает разумное преобразование NULL -> <void* to int> -> 0; Раз уж такая платформа.
> Выражение if (p != (void*)0) вернет false
> Поскольку компилер обязан сгенерить код в котором сравниваются не
> 32 битные регистры данных, а 48/64 битные регистры адреса.
> Что то в этом роде.
Очень сомнительно. Мне кажется, что условие будет срабатывать даже если p примет недопустимое значение. Ну как на этапе компиляции узнать в каком кольце будет работать программа, а значит как правильно преобразовать 0 ((void*)0) в инвалидный указатель? В итоге p _всегда_ будет не равен (void*)0.
> В "Kernel Normal Form" на это обращается спец. внимание, поскольку
> при портировании ядра на другую платформу может возникнуть ряд
> неоднозначностей, связанных именно с представлением указателей.
С базами работать на жабе не пробовали? Или еще с чем - 99% жаба библиотек вместо возвращения нула или кода ошибки или фолса кидают эксэпшны. И нету у тебя выбора - лови в все тут. Посмотрите для интереса на исходники любого жаба проекта - процентов 20 кода это трай/кэтч/файнали стэйтменты (причем пустые обычно).
>С базами работать на жабе не пробовали? Или еще с чем - 99% жаба
>библиотек вместо возвращения нула или кода ошибки или фолса кидают
>эксэпшны. И нету у тебя выбора - лови в все тут. Посмотрите для
>интереса на исходники любого жаба проекта - процентов 20 кода это
>трай/кэтч/файнали стэйтменты (причем пустые обычно).
В том то и прелесть, что вместо того, чтобы постоянно следить на null или кодами ошибок, можно просто определить действия на случай если при выполнении _блока_ действий произойдет ошибка, и обработать соответственно ошибке. ИМХО это более удобный способ и код становится более читаемым.
Смысл в том, чтобы отделять код отвечающий за работу от кода отвечающего за обработку ошибок. Попробуйте посмотреть на это с другой стороны, кодить станет гораздо легче.
А если я НЕ хочу ничего отделять и обрабатывать. В с++ сделано удобнее - хочешь проверяй на нул, хочешь трай/кэтч ставь. Свобода. А жаба ПРИНУЖДАЕТ... Я за свободу.
2IceD. Это уже не свобода, а анархия. Не охота ничего отделять и обрабатывать - ставь глобально try { } catch (Exception ex) {}
и твои волосы будут мягкими и шелковистыми. Вот только как можно будет тогда гарантировать, что программа работает правильно, без ошибок?
ИМХО Java НЕ ПРИНУЖДАЕТ, а ПРИУЧАЕТ писать корректный, нормальный код и это верно (особенно в свете так называемой свободы HTML кодинга).
Извините конечно, но засунте себе "Философию Явы" и все прочие "Thinking in Java" в жопу. Не имею охоты "думать" на яве и иметь проблемы со всеми остальными языками/платформами.
Откуда такой пессимизм? Если язык позволяет четко структурировать рабочий код и обработку исключительных ситуаций, то это, IMHO, можно только приветствовать. В чем я не прав?
>Откуда такой пессимизм? Если язык позволяет четко структурировать рабочий код и обработку исключительных ситуаций, то это, IMHO, можно только приветствовать. В чем я не прав?
Интересно, а почему нет книжек типа "Учимся думать на С" ?
Наверное, люди которые пишут на С, думают в терминах предметной
области, а не в рамках той модели языка которой ему предлагают.
Я понимаю, что есть предметно-ориентированные языки, со своей
философией. В рамках этих языков решаются задачи, которые
принципиально нельзя решить ни на С, ни на яве.
В отношении явы, я испытываю определенный скепсис, поскольку не вижу
задач которые можно решить на яве и нельзя решить на С, а вот обратное
Кстати, насчет 1С и Явы :) Может слышали про "Ил-2" от 1С:Maddox? Для тех, кто не в курсе - это игруха такая под винды. Так вот, этот самый "Ил-2" в основной своей части написан на Яве. На сях там только рендеринг и еще кой-какие низкоуровневые весчи. В WWII будет то же самое, поскольку движок - прямой наследник иловского. Вот так вот.
Пожалуйста, не объясняйте мне что может/не может C++. Я люблю оба эти языка и C++, и Java. Можно долго и горячо спорить о механизмах обратотки исключений, но стоит ли оно того? Боюсь, что мы не очень понимаем друг друга. :((
>Наверное, люди которые пишут на С, думают в терминах предметной
Угу. Может даже и согласен. Но при написании любого проекта и НАДО думать в терминах предметной области (например - пиша бух приложение - думаем в терминах проводок и прочей херотени, программируя кернел думаем в его предметной области). В случае явы нам еще необходимо наше мышление подстраивать под нее. Мешает сильно.
Да вот еще конкретный пример: Был у меня ява класс I18N со статическими методами setLocale(String locale) и i18n(String id). Т.е. использование такое:
I18N.setLocale("ru_RU"); // где-нибудь при ините
label.setText(I18N.i18n("hello_msg")); // в любом месте
Так вот. Наш мощный жабопрограммер увидев етот класс в проекте долго плевался, орал что так на яве не пишут и в итоге сделал класс Localization(!!) с НЕСТАТИЧЕСКИМИ методами setLocale(String locale) и getLocalizedString(String id) (!!!). Далее в головном классе проекта сделал СТАТИЧЕСКУЮ __ПРИВАТНУЮ__ переменную "Localization localization" и открытый статический метод getLocalization(). Что получилось:
И в принципе он прав: стандартные пакеты именно в этом стиле и написаны. Но я так писать _НЕ_ХОЧУ_
ЗЫ. Ничего не имею против различных технологий (как-то EJB & Co) - хочешь используй, хочешь нет. Я сильно против самого УБОЖЕСКОГО языка который НАВЯЗЫВАЕТ стиль программирования и дает кривые реализации тех самых технологий.
ЗЗЫ. С# даже чуть получше (вернее менее хуже) будет с моей точки зрения.
2IceD Объясни по русски что тебе надо от явы - ты уже просто запарил - то тебе не так и это тебе не так/ Если ТЫ НЕ УМЕЕШЬ
програмировать на ней ЧТО ОБЛИВАТЬ.??? Много народа тихо и
спокойно програмирует на нем и не пиндосит в чатах - ява суксь
потому что я не могу тото и тото/ Имхо это от твоей кривизны рук - не более. Никто тебе не навязывает програмировать на ней - НЕ НРАВИТСЯ НЕ ЕШЬ! Сиди на сях = великолепный язык! ТОЛЬКО ВОТ СРАВНИВАТЬ НЕ НАДО!
2алл - Люди не слушайте провокаторов - имхо они только издеваются
>Если ТЫ НЕ УМЕЕШЬ програмировать на ней ЧТО ОБЛИВАТЬ
Допустим умение вынимать пробку из бутылки поcредством ножа бывает полезным.
Но делать это (и пропогандировать этот способ) при наличии штопора по меньшей мере нецелесообразно:-)
>Имхо это от твоей кривизны рук
Относительно языка:-)
>ТОЛЬКО ВОТ СРАВНИВАТЬ НЕ НАДО
А почему, собственно?
>имхо они только издеваются
Вовсе нет. Пытаемся открыть вам(и себе заодно) глаза пошире:-) Правда, вы эту услугу не заказывали явно, но согласие неявно дается при попытке участия в обсуждении IMHO.
>Если ТЫ НЕ УМЕЕШЬ програмировать на ней ЧТО ОБЛИВАТЬ
Я то как раз умею и успешно пишу на том, что надо от текущего пректа. Меня просто выводят из себя крутые явапрограммеры которые ничего кроме явы не видели, не хотят видеть и орут что яву рулит __для__любых__проектов__ (есть естественно и исключения, но их слишком мало).
Да, еще возникают проблемы с выбором того, на чем писать - если проект довольно крупный и УДОБНЕЕ его писать на том же с++, чем на яве - приходится выбирать все же яву - так как у нас на конторе слишком мало народа, могущего писать на с++ (и явапрограммеры, как было сказано выше в сторону с++ смотреть не хотят даже. руки испачкать боятся)
Кто нибудь дайте комментарии на label.setText(ProjectMainClass.getLocalization().getLocalizedString("hello_ msg")) и label.setText(I18N.i18n("hello_msg")). И короткую и понятную функцию вывода MD5 в студию!
>имхо они только издеваются
Вернее бы сказал, что пар спускаю, который на работе накапливается.
>ТОЛЬКО ВОТ СРАВНИВАТЬ НЕ НАДО
Естественно. Все пишем на яве без права обсуждения и вперед к победе коммунизма. Слышали мы уже такие лозунги. Хватит.
Хмм.. почему? Потому что в этой книге как мне думается дано относительно полное и последовательное описание дизайна языка. Опять же, IMHO. Еще мне казалось, что человек испытывает те же проблемы что и я в свое время. Поймите меня правильно, есть вещи которые приходят из детства и которые непросто менять, для меня скажем такие как язык C или морзянка. Мне понадобилось приличное время, чтобы программирование на Java приносило мне не только результат, но и удовольствие. Cтереотипы мышления сказали свое слово, но догматизм не есть хорошо :)), и рано или поздно любой цепкий ум поймет почему что-то сделано в Java так, а не иначе. С++, он острый как бритва, легко пораниться, но результат радует, Java - мягкая, аккуратная, IMHO, не менее мощная, но я не хотел бы спорить здесь об инструментах. :))
IMHO, любая беседа может состоятся только если собеседники прислушиваются, стараются понять друг друга, а не спускают пар. Ifconfig уже выше говорил об этом. Такие дела..
Да будет больше инструментов, хороших и разных. :))
От себя хочу заметить - для IceD неплохо было бы познакомиться
с языком D ( www.digitalmars.com ) - в нем есть многие вещи, о
которых говорилось в треде - как вам, например, алиасы типов или
сборка мусора вкупе с комплексными числами 8). Если уж IceD
может позволить себе выбирать язык на основе критериев
простоты кода - это будет далеко не худший выбор.
Жаль только он сейчас только для i386 8(
Очень хотелось бы попробовать на SA11** -
подскажите плз кто с этим поборолся -
Патамущта соответствующие книги еще не переведены. Если, конечно, я правильно понял, и речь идет о "Thinking Java". Я знаю из этой серии еще "Thinking C++" и "Thinking Postscript".
Не провокации ради а интереса для ;) Задачка для java-программеров. Требуется: выполнить команду вида
xterm -e lftp -c "mget ftp://user:pass@host/filename(s)"
на перле (и, наверное, С) это выглядит так:
exec ("xterm -e lftp -c \"mget ftp\://user\:pass\@host/file*\"");
А на жабе ? Могу сказать, что наши штатные жаба программеры такую
задачу не смогли решить _вообще_, пришлось все делать за них.