December 7th, 2014

Кодю тут, на досуге (2)

Нашёл причину странного сбоя компилятора. Как оказалось, 32-битные компиляторы дают работоспособный код, 64-битные - нет. Начал искать внимательно и таки да, дело в разрядности указателя: я забыл подключить заголовочный файл, в котором описан прототип функции evaluate. И компилер, наткнувшись на неё и НЕ зная ещё о том, что она возвращает указатель, посчитал, что возвращаемое значение - просто целое число (при отсутствии явного прототипа он предполагается). Соотв., для 32-битного компилера длина указателя равна длине обычного int, а вот 64-битный указатель тупо режется и в возвращаемое значение попадает только младшая его часть (ибо для 64-битных систем длина int по-прежнему 32-бита)! Вот и выходило, что когда именно эта функция возвращает наверх своё значение, оно где-то ломалось и передавалось обратно уже в бессмысленном виде.

Подключил заголовочный файл, компилер увидел прототип функции и сгенерил таки правильный код.

Хех. Проблема нашлась бы раньше, если бы я сразу обратил внимание на странное предупреждение, что "присваивание делает указатель из целого без явного преобразования".

Так-то.

Collapse )