Задать вопрос
  • Как именно гарантируется выделения n байт памяти библиотекой stdint.h?

    @res2001
    Developer, ex-admin
    В Си, да и в С++, стандартные целочисленные типы, поддерживаемые компилятором - это char, short, int, long long и их беззнаковые братья. Стандарт действительно не фиксирует размеры стандартных целочисленных типов. Это сделано потому что стандарт описывает абстрактный язык, который должен компилироваться для разных платформ.

    Компилятор же компилирует программу под конкретную платформу с конкретными соглашениями по типам. Ему заведомо известны размеры стандартных типов на данной конкретной платформе. Стандартная библиотека так же обычно пишется под конкретный компилятор и конкретную платформу.
    Так что (u)intX_t - это всегда define над стандартными типами. И ничего странного в этом нет.
    Ответ написан
    Комментировать
  • Как именно гарантируется выделения n байт памяти библиотекой stdint.h?

    Vindicar
    @Vindicar
    RTFM!
    Не претендую на глубокое знание плюсов, но...
    Модификаторы типа вроде long или short не гарантируют увеличение или сокращение выделяемой памяти под переменную, а результат зависит от компилятора, - так пишется во многих учебниках. В то же время типы intx_t, описанные в библиотеке stdint.h, якобы гарантируют размер переменной.

    Но ведь stdint.h идёт в комплекте с компилятором, а потому составлен с учётом особенностей этого компилятора.
    Ответ написан
    Комментировать
  • Как именно гарантируется выделения n байт памяти библиотекой stdint.h?

    @Mercury13
    Программист на «си с крестами» и не только
    В моей версии MinGW это сделано так.
    На уровне компилятора определяется макрос __INT64_TYPE__, который на данных настройках значит long long. Затем через жёсткую препроцессорную магию определяются и остальные типы и константы, связанные с int64.

    # include_next <stdint.h>  // то есть самого себя!
    
    . . .
    
    #ifdef __INT64_TYPE__
    # ifndef __int8_t_defined /* glibc sys/types.h also defines int64_t*/
    typedef __INT64_TYPE__ int64_t;
    # endif /* __int8_t_defined */
    typedef __UINT64_TYPE__ uint64_t;
    # undef __int_least64_t
    # define __int_least64_t int64_t
    # undef __uint_least64_t
    # define __uint_least64_t uint64_t
    # undef __int_least32_t
    # define __int_least32_t int64_t
    # undef __uint_least32_t
    # define __uint_least32_t uint64_t
    # undef __int_least16_t
    # define __int_least16_t int64_t
    # undef __uint_least16_t
    # define __uint_least16_t uint64_t
    # undef __int_least8_t
    # define __int_least8_t int64_t
    # undef __uint_least8_t
    # define __uint_least8_t uint64_t
    #endif /* __INT64_TYPE__ */


    Полагаю, это связано с тем, что компилятор и библиотека сильно кроссплатформенны и написаны в большом отрыве друг от друга. Решай мы более простую задачу — то есть связку «компилятор-библиотека» для конкретной ОС — можно было просто
    typedef long long int64_t;
    Ответ написан
    Комментировать
  • Почему работает DHCP у Mikrotik?

    @powerlift
    В RouterOS DHCP-пакеты попадают в DHCP-клиент и в DHCP-сервер до попадания в IP Firewall, если речь идёт об IPv4.
    Можно очень долго искать на форумах и в документации Mikrotik информацию про эту особенность, но не найти. Но выявляется эта особенность довольно легко на самом простом лабораторном стенде, что я и сделал во времена, когда только начинал администрировать оборудование Mikrotik.

    Выбранный вами в качестве решения ответ Victor вводит в заблуждение - Bridge Filter и IP Firewall не связаны между собой. Просто в случае когда DHCP-сервер/клиент находится на Bridge-интерфейсе, то есть DHCP-трафик проходит через Bridge, то появляются два возможных варианта фильтровать DHCP-пакеты в Bridge:
    1) использовать Bridge Filter для фильтрации
    2) включить прохождение всего трафика Bridge через IP Firewall /interface bridge settings set use-ip-firewall=yes , что позволит фильтровать DHCP-пакеты непосредственно в IP Firewall

    В IPv6 ситуация уже обстоит иначе - DHCPv6-пакеты сначала проходят через IPv6 Firewall прежде чем попасть в DHCP-клиент. С DHCP-сервером не проверял, но предполагаю, что аналогично.
    Ответ написан
    1 комментарий
  • Нужно ли писать суффиксы литералов?

    GavriKos
    @GavriKos
    У вас сильно простые примеры.
    Если это где то внутри сложной формулы - то лучше явно задать тип, чтобы вызывался соответствующий оператор.

    А если еще и перегрузка операторов используется - то вообще без вариантов.
    В общем тут дело не в эстетике, а в логике кода. Т.е. есть ситуации когда НУЖНО задавать явно
    Ответ написан
    3 комментария
  • Нужно ли писать суффиксы литералов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Во всех случаях мы описали тип слева. Тоесть задача типизации - выполнена.
    float a = 1.0f;
    unsigned int a = 10u;

    Я думаю что ничего дополнительно указывать не надо. В противном случае у code-reviewer
    это вызывает удивление и очередной WTF. Тоесть вам придется объяснять своему коллеге
    ДЛЯ ЧЕГО вы ввели в исходные код дополнительную информацию.

    Нужно писать так чтобы у коллег к вашему коду вообще не возникало вопросов.
    Ответ написан
    Комментировать
  • Нужно ли писать суффиксы литералов?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    При инициализации переменных это обычно не используют. Ну, происходит тут преобразование типа - ошибки быть не может. Это лишь немного снижает читабельность кода и все.

    Вот когда вы константы передаете в какие-то перегруженные функции, где имеет значение unsigned ли ей передан или signed, или есть разница между float и double, то тогда - да, надо писать.
    Ответ написан
    4 комментария
  • Нужно ли писать суффиксы литералов?

    @res2001
    Developer, ex-admin
    Однако с точки зрения оптимизации, эстетики и/или стандартов, как писать все-таки лучше

    Как хотите.

    На самом деле опциями компилятора можно задать выдавать предупреждения (или даже ошибку) на подобное не явное приведение типов. Тогда это будет "не красиво" или даже вообще ошибка компиляции, и тут вам придется исправлять ситуацию добавив суффикс.
    Но подобные опции используют не часто. На сколько помню для gcc это опции -Wsign-conversion и/или -Wconversion но могу ошибаться. И, по моему, они даже не включаются через -Wall -Wextra -pedantic - обычно используют этот набор опций, когда хотят заставить компилятор выполнять больше проверок кода.
    Немного модифицировав опции можно добиться не предупреждения, а ошибки.

    Если вы пишите исполняемый файл, то вы контролируете опции сборки в makefile (или чем вы там пользуетесь) и вас этот вопрос может не парить вообще.
    Если вы пишете библиотеку, которую распространяете в исходниках, то есть вероятность, что пользователь при сборке захочет добавить своих опций и тогда ошибки/предупреждения могут проявится. Можете расставить суффиксы для обхода потенциальных проблем, а можете забить и оставить на усмотрение конечного пользователя библиотеки.
    Ответ написан
    Комментировать
  • В чем суть приватных IP адресов, если можно выдавать любые IP и затем их Натить?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Однако я не могу понять, что нам мешает раздавать любые айпи адреса в подсети, так как при выходе в глобальную сеть они натятся и заменяются публичным(и).

    Применение сети немного больше чем чья-то одинокая локалка. Так дикари обычно считают - "мы все человечество".
    Вот например я произвожу видеокамеры (на самом деле вовсе не видеокамеры). Я вписываю в каждую адрес "по умолчанию" 192.168.1.1 и особо не грею голову, что камера куда-то полезет сраду после включения.

    А если бы у нее стоял 200.200.200.1 (адрес принадлежит бразильской телекоммуникационной компании Embratel и находится в Рио-де-Жанейро - именно там, где все негры в белых штанах :)) - она как знать, могла бы и подключиться :)
    Ответ написан
    Комментировать
  • В чем суть приватных IP адресов, если можно выдавать любые IP и затем их Натить?

    @Drno
    Когда тебе понадобится зайти на белый IP из этой подсети, ты на него не попадешь, т.к. он будет искаться в первую очередь у тебя в локалке
    Ответ написан
    1 комментарий
  • Почему работает DHCP у Mikrotik?

    @victor_skoblin
    Всё это происходит внутри бриджа, скорее всего. Значит, надо эти же правила ставить в bridge - filter. Без дополнительных настроек фаервол не действует на бридж.
    Ответ написан
    1 комментарий
  • Как настроить Mikrotik с CAPSMAN и в режиме Wifi AP Bridge?

    ArteMoon
    @ArteMoon
    Развиваюсь
    Если на mikrotik3 только 1 радиомодуль то никак
    Ответ написан
    Комментировать
  • Частное облако и дата-центр, отличия?

    saboteur_kiev
    @saboteur_kiev Куратор тега Компьютерные сети
    software engineer
    Облако - означает, что вы точно не знаете на каком именно железе крутится ваш сервис.
    Ранее, для каждой виртуалки явно назначали на каком физическом сервере эта виртуалка будет жить. С приходом понятия "облако", железки объединяются в некий кластер, и уже контроллер этого кластера-облака выбирает где запустить вашу виртуалку, или в случае кубера ваш контейнер.

    Таким образом в ДЦ можно просто поставить сервера и четко размапить на каком сервере что крутится, или в ДЦ можно поставить сервера и настроить на них "облако".
    Ответ написан
    Комментировать
  • Частное облако и дата-центр, отличия?

    @Drno
    Дц - это физический объект.

    Облако - обобщеный способ разворачивания софта
    Ответ написан
    Комментировать
  • Частное облако и дата-центр, отличия?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    ДЦ - здание с большими серверными где расположено туева куча серверов
    Облако - понятие виртуальной инфраструктуры
    Колокейшен - размещение собственного сервера (оборудования) в ДЦ (настраиваем и отвечаем за свой сервер полностью сами)
    Дедикейшен - аренда физического сервера у провайдера (настраиваем ОС и гипервизор сами, за железо отвечает провайдер)
    Частное облако - аренда физического сервера (серверов), иногда вместе с коммутаторами доступа, у провайдера с настроенным на нем гипервизором и сетью (сами настраиваем только ВМ)
    Публичное облако - аренда виртуальной машины на общих серверах
    Ответ написан
    Комментировать
  • Почему работает DHCP у Mikrotik?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    70-C9-4E-54-03-2F, Загляните в Tools -> Packet Sniffer. Впишите туда "UDP" и 67-ой порт, и смотрите, какие пакеты откуда-куда приходят-уходят. Если правила работают - то будет логирован только приход пакетов на физический интерфейс, но не ответы на них... Поможет найти "мокрый пол".

    P.S. Ну и логирование работы DHCP Server, тоже полезно видеть.

    P.P.S. DHCP рассылаются броадкастом, может на них отвечает кто-то другой?
    Ответ написан
    6 комментариев
  • Задача по теме ARP от Cisco - опечатка?

    @dronmaxman
    VoIP Administrator
    MAC адрес работает в L2 сегменте сети. Свичи это L2 устройства, RTA это L3 устройство к которому подключены две сети L2. Соответственно между ПК-Свич-RTA это одна L2 сеть, RTA -Свич-Сервер это вторая L2 сеть. Что бы пройти L3 устройство в пакете должен произойти подмена MAC адреса. Что бы RTA понял что пакет предназначен ему, в пакете от ПК в поле destination должен стоять его мак. Если в пакете будет стоять МАК сервера, то пакет дойдет до RTA и будет отброшен, до сервера пакет вообще не дойдет т.к. ARP не может проходить в другую L2 сеть, а RTA не перебрасывает ARP пакеты между L2 сетями.

    В пакете есть IP и MAC.
    MAC подменяется при переходе через L3 устройства, IP и MAC одновременно подменяются при переходе через NAT.
    Ответ написан
    1 комментарий
  • Почему большая задержка на собственный локальный ip?

    @Drno
    Это скорее всего не твой IP. А адрес роутера.
    Судя по всему вифи у тебя не очень работает, вот и всё
    Ответ написан
  • Зачем нужен signed в Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    по умолчанию int является signed

    А вот о char этого сказать нельзя, знаковость char зависит от реализации. Вдобавок, в стандарте есть следующая сноска (https://www.open-std.org/JTC1/SC22/WG14/www/docs/n... 6.2.5:15):
    Irrespective of the choice made, char is a separate type from the 
    other two and is not compatible with either.


    signed char -- это, пожалуй, единственное не вызывающее вопросов применение ключевого слова signed в C-коде написанном человеком. В остальных случаях роль signed -- чисто декоративная.
    Ответ написан
    Комментировать
  • Указатели в языке Си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Вмешалась ОС? Но если так, то почему?

    Потому что классическая ошибка - использование неинициализированного указателя. Ты обьявил a указателем на целое, но не присвоил ему никакого значения (через malloc(), calloc() или функции, возвращающие указатель). Обьявленная переменная была выделена в куче и получила какое-то мусорное значение, доступное твоей программе (вполне может быть указатель на часть кода, например, на ядро, на общие функции). Ты его прочитал.
    При попытке записать по данному адресу поймал SIGSEGV, потому что данный адрес твоей программе по записи недоступен. Все, как должно быть.
    могу ли я указателю дать ссылку на конкретную ячейку в памяти?

    Теоретически можешь, но практически ось тебе сразу выдаст SIGSEGV, потому что писать ты можешь только в те области памяти, которые тебе доступны по записи.
    warning: initialization of 'int *' from 'int' makes pointer from integer without a cast

    Ну правильно говорит - инициализация делается без приведения типа. Такой финт ушами часто делают со строками - по умолчанию выставляя там указатель на NULL (что обычно означает, что строке еще не выделялась память), напрмер
    char *str = (char *) NULL;
    Ответ написан
    Комментировать