Peter пишет:но, как мне кажется, вы уходите от ответа на первоначалаьно заданный вопрос.
я на него уже ответил:
drBatty пишет:вангую, что вы как-то не правильно делаете, и добились UB.
анализ вашего кода это доказывает.
перечислять, что вы делаете неправильно, можно очень долго, даже в этом не сложном случае.
Peter пишет:Кроме того, не все ваши аргументы для меня убедительны.
отлично вас понимаю, я сам раньше так(плохо) писал.
Peter пишет:Конечно, бывают случаи, когда использование do{} while{} обязательно
не бывает. Необходимо и достаточно только if/goto, или while (без goto, как в brainfuck'е). Но зачем так себя ненавидеть?
Peter пишет:но вроде бы это в h-файлах
это вы путаете с жутким и не нужным костылём для подпорки другого костыля.
Peter пишет:Когда нужен const, то компилятор об этом скажет.
не скажет, увы. Для совместимости со старым кодом в сишке _можно_ не использовать const. Это если ваш код и так работает где угодно, а вас зовут "профессор Дональд Кнут", и вы умеете писать настолько крутые программы, которые работают на шестибитовых(или 36и битовых, причём сразу, без изменения кода и препроцессора) char'ах и int'ах любого размера.
Но вас зовут Пётр, а не Дональд Кнут. И ваш код не работает даже в убунте. Смиритесь.
Peter пишет:Например, он оказался необходим в функции prn_t().
из неконстанты всегда можно сделать константу, обратное невозможно. sendto хочет константу, но очевидно, вы можете ей и неконстанту подсунуть. Она сделает из неконстанты константу и не будет её трогать. Откуда вывод: этот аргумент портится внутри вашего кода, а не внутри sendto из убунты, т.к. sendto принимает константу. Т.е. это ВЫ функцию мусором кормите.
Peter пишет:Для меня нормальное завершение - это окончание программы по её желанию, а не вследствие краха.
т.е. если программа не смогла файл открыть, то это "её желание", да?
Peter пишет:И вот я не согласен с тем, как, по-вашему, надо передавать длину структуры. То вы советуете использовать переменную типа size_t,
то sizeof(), которая, по вашим же словам, вообще константа.
ох… Как же с вами тяжело-то! sizeof() это константа в рантайме, имеющая тип size_t. Но во время компиляции sizeof() эта переменная, т.к. мы не знаем, какой будет sizeof в той системе, где наш код будут собирать. В частности, мы не знаем sizeof(size_t).
Peter пишет:Никогда ещё не было проблем с передачей длины через переменную int.
УЖЕ есть. Если-бы у вас не было проблем, у вас-бы всё работало.
Peter пишет:Я думаю, что компилятор умеет обрабатывать все эти варианты. И я уже говорил, что приведение адреса к адресу sockaddr
требуется согласно man, так что ошибки я не вижу.
это приведение — кривой костыль. Для реализации в сишке полиморфизма, сходите по ссылке, и почитайте: https://ru.wikipedia.org/wiki/%D0%9F%D0 … A%D0%B0%29
Увы, в сишке нет полиморфизма, потому приходится такие вот нелепые, не очевидные, и ненадёжные хаки юзать. Даже в C++ с этим не очень хорошо(в c++11 вроде стало нормально, во всяком случае с т.з. практика).
Компилятор не умеет такое обрабатывать, и потому полагается на программиста, который ручками укажет точные размеры и точные типы. А компилятор эти вещи тупо передаст в функцию, как сказано, без проверок. Ну нет в сишке таой хорошей и кошерной штуки, как https://ru.wikipedia.org/wiki/Dynamic_cast Нужно всё вручную делать, причём очень внимательно, особенно, если функцию написали не вы сами.
Peter пишет:Каккой пример с sendto() - сейчас не могу сказать, какие-то встречались то ли в man'ах, то ли в книге. В книге точно через int.
Сколько лет назад написана эта книга? 30 лет? 40? Ваш int конечно скастуется без предупреждений, но сделано это лишь для совместимости со старым кодом.
Peter пишет:Я передаю стуктуру и указываю её же размер, опять же так и в примерах её использования. Я не встречал требования её
во что-то оборачивать, чтобы размер этого объекта был равен размеру sockaddr, хотя, возможно, это может требоваться.
Везде передаётся размер передаваемой структуры.
так вас не смущает, что вы передаёте одну структуру, указывая размер другой?
Вас вообще передача размера не смущает? Почему функция сама не может посчитать размер того, что ей передали? Это же не какой-то буфер, для которого вы передаёте только указатель на начало, это структура, и функция прекрасно знает, как эта структура устроена!
Зачем вы в какую-то магию верите?
Peter пишет:Так почему наличие gettimeofday() в тексте программы в Ubuntu влияет на работу sendto, а в Debian нет?
потому-что у вас что-то портится, если есть gettimeofday(). А в Debian у вас тоже наверное что-то портится, но на работу программы это не сказывается. Я же вам показывал код
804837e: 66 90 xchg ax,ax; NOP. Команда для выравнивания адреса. Цикл по адресу кратному 16 быстрее работает
помните? Что будет, если заменить эти байты на что угодно другое? Ничего не изменится. Т.ч. программа при UB вовсе не обязана зависнуть или ещё что-то не то сделать. Программа вполне может работать так, как вам этого хочется. Особенно в сишке. Потому-то сишку так ненавидят пионеры и школьники.
s.xbatob пишет:вы бы посмотрели отладчиком
зачем сразу "отладчиком", можно и objdump. Можно и здесь выложить то, что у Петра получается.
s.xbatob пишет:А то местные болтуны
мне что, Ubuntu устанавливать?
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)