Re: Программирование на функциональных языках - как научить?
Hello!
On Friday 21 August 2009 18:15:41 Stanislav Maslovski wrote:
> В том и дело, что результат сдвига при mask = 0 в правой части
> undefined. На моей архитектуре значение всего выражения получается
> 0xffffffff, но на другой архитектуре это выражение может запросто дать
> 0x00000000. Я уже устал повторять, в чем там загвоздка. Читай мои
> письма.
Да, теперь дошло, что сдвиг на 0 бит допустим, а на 32 - нет. Уже нашел
в сети, что даже в gcc при разных флагах оптимизации результат разный
получается.
> > Теперь переписал вычисление маски, чтобы с /32 работало без доп.
> > проверки, т.е.
> > mask = (u_int32_t)-1 << ( 32 - mask );
>
> Новое выражение при mask = 0 в правой части имеет ту же проблему с
> undefined result. Но так как ты проверку на 0 уже добавил...
>
> А при mask = 32, имхо, и старое выражение работало - давало
> 0xffffffff.
Работало, но оно такое сложное было исключительно ради обработки
маски /0 и /32, а только /32 обрабатывается намного проще. Но, как
оказалось, лучше бы я сделал явную проверку, раз уж /0 разрешал.
> atoi() не возвращает ошибку, strtol() -- возвращает. Ты хочешь,
> чтобы работа твоего кода зависела от значения, которое возвращает
> atoi() при невозможности сконвертировать строку в число? Твое дело,
> код твой, тебе его поддерживать.
atoi() в случае ошибки всегда возвращает 0. Собственно, других
возможностей просто нет. Т.к. нас не интересует причина некорректности
адреса и/или маски, этого достаточно. А маску /0 мы запретили.
Возможно, имеет смысл использовать встроенный в эскулайт функции
конвертации (именно из соображений переносимости они и встроены).
Но функции работы с сетевыми адресами все равно менее переносимы,
нежели atoi()
Best regards, Alexey Pechnikov.
http://pechnikov.tel/
Reply to: