[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: