powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / нельзя указать кол-во бит и инициализировать их в новом стандарте
24 сообщений из 24, страница 1 из 1
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196062
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
снова я :)
затеят тут создать класс для ip - погуглил и ничего не нашел. думаю запихать все в числа, создать преобразователь в строку и из строки, парсер, проверку, также опции компиляции, чтобы это все можно было отключить если что.

сразу встало несколько вопрсов. но вот самая большая неприятность (со времени выхода новых стандартов не писал никоуровневых классов, а теперь растроился): вот так написать оказалось нельзя
Код: plaintext
1.
2.
private:
  unsigned int some:16=0;

а что делать тогда? ведь для ipv6 мне нужно выделить 16 байт.. я думал разбить их на части по 2 байта (указать 16), но тогда их нельзя будет инициализировать.. попробовал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private:
    struct ip_data {
        unsigned short a:16;
        unsigned short b:16;
        unsigned short c:16;
        unsigned short d:16; // end of ipv4 size
        unsigned short e:16;
        unsigned short f:16;
        unsigned short g:16;
        unsigned short h:16;
    };
    ip_data ip_=0;

но так тоже нельзя инициализировать :) говорит, что не может прировнять это. получается только если конструктор делать у этой структуры.. я правильно понимаю, что в стандарте по этому поводу ни слова?
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196065
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычные in_addr/in6_addr тбя не устраивают чем?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196073
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОбычные in_addr/in6_addr тбя не устраивают чем?да, что-то о них не подумал, наверное все равно в них придется преобразовывать, чтобы куда-нибудь передать.. я не хотел их юзать - эти сишные структуры будут поялвятся потом везде, где будет влючен этот файл.

но даже если использовать их, там не указана версия и порт, то есть придется делать структуру где указать эту инфу и юнинон в ней с in_addr/in6_addr .. то есть та же проблема - порт не инициализирован и они тоже.
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196084
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackно даже если использовать их, там не указана версия и порт, то есть
придется делать структуру где указать эту инфу и юнинон в ней
Всё уже украдено до тебя: sockaddr_in/sockaddr_in6. Всё равно же преобразовывать для
использования.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196187
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackснова я :)
затеят тут создать класс для ip - погуглил и ничего не нашел. думаю запихать все в числа, создать преобразователь в строку и из строки, парсер, проверку, также опции компиляции, чтобы это все можно было отключить если что.

сразу встало несколько вопрсов. но вот самая большая неприятность (со времени выхода новых стандартов не писал никоуровневых классов, а теперь растроился): вот так написать оказалось нельзя
Код: plaintext
1.
2.
private:
  unsigned int some:16=0;

а что делать тогда?



Битовые поля С++ не поддерживает. Тебе нужно сделать ОДИН модуль на чистом С из данных и интерфесов к ним (функций, обрабатывающих), а остальное можно делать на C++.
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196290
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivБитовые поля С++ не поддерживает.Разве?
// http://en.cppreference.com/w/cpp/language/bit_field
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196323
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,

ну ок, может и так, но не в классах, только в POD структурах.
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196324
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в любом случае от автора нужен полный код, а не обрывки.
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196418
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackсразу встало несколько вопрсов. но вот самая большая неприятность (со времени выхода новых стандартов не писал никоуровневых классов, а теперь растроился): вот так написать оказалось нельзя
Код: plaintext
1.
2.
private:
  unsigned int some:16=0;


К стандартам С++ это не имеет отношения.
Инициализировать поля прямо в структуре или классе нельзя было с самого начала.
Ну и в С тоже естественно.
Потом начиная с С++11 стало можно в большинстве случаев.
Но про битовые поля - я не в курсе.
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196422
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Инлайновые инициализаторы для битовых полей не поддерживаются (см. ссылку выше)
Но можно инициализировать как прочие поля в конструкторе.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct S {
    unsigned bits:3;
    S()
        : bits(5)
    {
    }
};
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196424
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_black
Код: plaintext
1.
unsigned short a:16;


unsigned short это и есть ровно 16 бит. Зачем тут с битами что-то городить?
Только непонятно зачем тут unsigned short:
IPv4 = 4 байта, т.е. ровно uint32_t или uint8_t[4]
IPv6 = 16 байт, т.е. ровно uint32_t[4] или uint8_t[16]

unsigned short разве что для номера порта сгодится.

Я бы добавил еще 1 байт: тип адреса IPv4/IPv6. Т.е. так
Код: plaintext
1.
2.
3.
4.
5.
struct my_ip_addr {
   uint8_t type;
   uint16_t port;
   uint32_t[4] addr;
}


Именно в таком порядке, т.к. type и port после выравнивания займут 4 байта.
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196567
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

да про эти short написано в стандарте, что не меньше 16..
для типа я сделал перечисление
Код: plaintext
1.
enum ver {INVALID=0,V4=4,V6=6}

invalid - тоже важно, потому что это дает способ узнать, что ip не 0.0.0.0 а просто не был инициализирован например.

кода пока нет. я начал его писать, и вот воткнулся в эти битовые поля. я сделал обертку над libuv + h2o (новые такой сервер). но при старте и вобще в процессе работы, нужно иметь возможность открывать порты и слушать другие ip. для этого использую функцию uv_ipv[4,6]_addr (чтобы распарсить строку от пользователя). вот получилось, что сейчас у меня в интерфейс пользователя передается std::string с адресом и enum с версией. меня это как бы не устраивает, во-вервых потому что нужно передвать два параметра, вместо одного, во-вторых потому что нет защиты от ошибок да и вобще не ооп.

вот вариат просто првоерить, пока не занялся вполтную этим вопросом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
#include <string>
#include <ostream>

class ip;
std::ostream& operator << (std::ostream& out, const ip& i);

class ip final{
    friend std::ostream& operator << (std::ostream& out, const ip& i);
public:
    enum ver {INVALID=0,V4=4,V6=6};
    ip(){}
    ip(const std::string& i); ///< create form string and detect version
    ip(ver v, const std::string& i); ///< create from string and check version
    ip(ver v, unsigned int i); ///< create from interger, don't check anything
    ip(ver v, unsigned short int p, const std::string& i);
    ip(ver v, unsigned short int p, unsigned int i);

    ip(ip&& other);
    ip(const ip& other);
    ip& operator = (ip&& other);
    ip& operator = (const ip& other);
    ~ip() noexcept {}

    /// is current object state valid
    bool is_valid() const {return (ver)ip_.v == INVALID;}
    /// get current version or invalid if any
    ver version() const {return (ver)ip_.v;}

    template<class C>
    std::basic_string<C> to_string() const {
    }

    unsigned short int port() const {return ip_.port;}
    void port(unsigned short int p) {ip_.port=p;}

    /// read string with ip without version
    template<class C>
    void from_string(const std::basic_string<C>& i) {
    }
private:
#pragma pack(push,1)
    struct ip_data {
        ip_data() : v(0),port(0),a(0),b(0),c(0),d(0),e(0),f(0),g(0),h(0){}
        unsigned short v:3; // version number
        unsigned short port:16; // port number
        unsigned short a:16;
        unsigned short b:16;
        unsigned short c:16;
        unsigned short d:16;
        unsigned short e:16;
        unsigned short f:16;
        unsigned short g:16;
        unsigned short h:16;
    } ip_;
#pragma pack(pop)
};

uint16_t[8] addr; может макароны a-h заменить :) по памяти то же самое получается (если делать uint32_t то не удобно получится, ведь ipv6 рабиты по два байта, а не по 4).
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196575
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забей ты на битовые поля. Не нужны они тут. Допустим есть:
Код: plaintext
1.
uint16_t addr[8];


можно так с ним поработать
Код: plaintext
1.
2.
uint32_t* ipv4 = addr;
дальше использовать *ipv4 


можно просто union использовать
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196577
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

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

вобще я что-то подзабыл про эти std::uintXX_t :) их же в c++11 добавили в стандрат, до этого я так понимаю просто из c были..
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196578
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это не плюсы, а просто С.
Можно так
Код: plaintext
1.
2.
uint8_t* ipv4 = (uint8_t*)addr;
printf("%d.%d.%d.%d", ipv4[0], ipv4[1], ipv4[2], ipv4[3]);
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196579
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tэто не плюсы, а просто С.
Можно так
Код: plaintext
1.
2.
uint8_t* ipv4 = (uint8_t*)addr;
printf("%d.%d.%d.%d", ipv4[0], ipv4[1], ipv4[2], ipv4[3]);



гы, а я-то уже собрался через маски делать ))) точно, как-то си у меня хромает :)

http://en.cppreference.com/w/cpp/types/integer
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196582
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackвобще я что-то подзабыл про эти std::uintXX_t :) их же в c++11 добавили в стандрат, до этого я так понимаю просто из c были..
Вообще-то просто сократили количество букав:
uint8_t = unsigned char
uint16_t = unsigned short
uint32_t = unsigned int
uint64_t = unsigned long long
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196641
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВообще-то просто сократили количество букавна сколько я понимаю, эти типы гарантируют свою длину по стандарту. то есть если какой-то компилятор решит сделать short не двумя байтами, то uint16_t должен остаться двумя..
вот например андройд - они там намудрили со стандартом (там вроде char и wchar - один байт), а это должно работать..
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196648
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivну ок, может и так, но не в классах, только в POD структурах.В ATL например bit field-ы используются в классах (виртуальный деструктор => не POD):
atlctl.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
class ATL_NO_VTABLE CComControlBase
{
	...
	virtual ~CComControlBase()
	{
		...
	}
	...
	int m_nFreezeEvents; // count of freezes versus thaws
	unsigned m_bNegotiatedWnd:1;
	unsigned m_bWndLess:1;
	unsigned m_bInPlaceActive:1;
	unsigned m_bUIActive:1;
	unsigned m_bUsingWindowRgn:1;
	unsigned m_bInPlaceSiteEx:1;
	unsigned m_bWindowOnly:1;
	unsigned m_bRequiresSave:1;
	unsigned m_bWasOnceWindowless:1;
	unsigned m_bAutoSize:1; //SetExtent fails if size doesn't match existing
	unsigned m_bRecomposeOnResize:1; //implies OLEMISC_RECOMPOSEONRESIZE
	unsigned m_bResizeNatural:1;  //resize natural extent on SetExtent
	unsigned m_bDrawFromNatural:1; //instead of m_sizeExtent
	unsigned m_bDrawGetDataInHimetric:1; //instead of pixels
	...
};


Но если это в коде ATL, то это ещё не значит, что это соответствует стандарту. Microsoft-у стандарт не писан :).

Dima Tunsigned short это и есть ровно 16 бит.Это где такое написано? Раньше было так:
количество бит в unsigned short = sizeof(unsigned short) * CHAR_BIT
CHAR_BIT -- количество бит в байте, стандартная константа из limits.h. Были экзотические платформы с необычными размерами встроенных типов. Книжка М. И. Болски «Язык программирования Си»:
3.7. Размер данных
Следующая таблица даёт размер в битах основных типов данных для различных ЭВМ.
...
Основные типы данныхHONEYWELL 6000 ...IBM 360/370 ...INTERDATA 8/32 ...char988int363232short361616long363232............
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196716
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если битовые поля объединить union-ом с "полноценными" переменным и их заинициализировать в описании класса?
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39196724
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовDima Tunsigned short это и есть ровно 16 бит.Это где такое написано? Раньше было так:
количество бит в unsigned short = sizeof(unsigned short) * CHAR_BIT
CHAR_BIT -- количество бит в байте, стандартная константа из limits.h. Были экзотические платформы с необычными размерами встроенных типов...
В том и дело что когда-то были, но сегодня их уже нет и не ожидается. Какой смысл на них оглядываться?
По факту сегодня везде 1 байт = 8 бит. И нет смыла на экзотику закладываться.
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39197204
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbа если битовые поля объединить union-ом с "полноценными" переменным и их заинициализировать в описании класса?а кстати, должно сработаьт.. сча посмортим
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39197558
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПётр Седов Были экзотические платформы с необычными размерами встроенных типов...
В том и дело что когда-то были, но сегодня их уже нет и не ожидается.Как ни странно, существуют до сих пор:
// https://en.wikipedia.org/wiki/36-bit some 36-bit computer systems are still sold as of 2014, e.g., the Unisys ClearPath Dorado series, which is the continuation of the UNIVAC 1100/2200 series of mainframe computers.
Dima TПо факту сегодня везде 1 байт = 8 бит.Да, почти везде. Архитектуры x86 и ARM подмяли под себя почти всё, а остальные архитектуры либо вымерли, либо занимают очень узкие ниши (embedded, mainframe), и большинство программистов с ними никогда не столкнётся.
...
Рейтинг: 0 / 0
нельзя указать кол-во бит и инициализировать их в новом стандарте
    #39199429
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,

ну да.. просто получается, что код, расчитанный строго на 8 бит в байте загнется только из-за этого.. с одной стороны никто не будет его компилить для таких процов, а с другой.. как бы обдино :)
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / нельзя указать кол-во бит и инициализировать их в новом стандарте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]