Здравствуйте. Судя по всему, ошибка у Вас как раз в htons(). Из-за различных размеров типа Integer в разных режимах компилятора, htons() возвращает неправильное значение.
Объясню. В обоих случаях (и -Sd и S2) размер Integer - 32 бита, а функции lo() и hi() у Вас возвращают *word* (не byte), из переданного Integer.
Например, при lo(7878) = 7878 и hi(7878) = 0 htons вернет 2016768, что в общем-то неправильно =)
Кстати, компиляция с -St или вообще без параметра Вашу проблему решают.
Однако, я понятия не имею, почему код компилируется и работает в одном режиме, а в другом нет. Попробуйте использовать -ghl для получения большей информации о месте ошибки.
Вообще, я Вам рекомендую в Вашем коде использовать исключительно типы Integer, которые автоматически маппятся в типы с такими же значениями диапазонов, не зависимо от режима компилятора. Это действительно поможет Вам избежат подобных проблем в дальнейшем...
Вот код для htons():
| Код |
|---|
function htons(i : Word) : Word;
begin
htons := lo(i) shl 8 or hi(i);
end;
|
Потому что тип "Word" всегда имеет размер 16 bit unsigned в любых режимах FPC и всех поддерживаемых им платформах ^_^