Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / нельзя указать кол-во бит и инициализировать их в новом стандарте / 24 сообщений из 24, страница 1 из 1
19.03.2016, 16:26
    #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
19.03.2016, 16:31
    #39196065
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нельзя указать кол-во бит и инициализировать их в новом стандарте
Обычные in_addr/in6_addr тбя не устраивают чем?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.03.2016, 16:45
    #39196073
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нельзя указать кол-во бит и инициализировать их в новом стандарте
Dimitry SibiryakovОбычные in_addr/in6_addr тбя не устраивают чем?да, что-то о них не подумал, наверное все равно в них придется преобразовывать, чтобы куда-нибудь передать.. я не хотел их юзать - эти сишные структуры будут поялвятся потом везде, где будет влючен этот файл.

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

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

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



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

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


К стандартам С++ это не имеет отношения.
Инициализировать поля прямо в структуре или классе нельзя было с самого начала.
Ну и в С тоже естественно.
Потом начиная с С++11 стало можно в большинстве случаев.
Но про битовые поля - я не в курсе.
...
Рейтинг: 0 / 0
20.03.2016, 14:22
    #39196422
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нельзя указать кол-во бит и инициализировать их в новом стандарте
Инлайновые инициализаторы для битовых полей не поддерживаются (см. ссылку выше)
Но можно инициализировать как прочие поля в конструкторе.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct S {
    unsigned bits:3;
    S()
        : bits(5)
    {
    }
};
...
Рейтинг: 0 / 0
20.03.2016, 14:26
    #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
20.03.2016, 19:51
    #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
20.03.2016, 20:17
    #39196575
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нельзя указать кол-во бит и инициализировать их в новом стандарте
Забей ты на битовые поля. Не нужны они тут. Допустим есть:
Код: plaintext
1.
uint16_t addr[8];


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


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

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

вобще я что-то подзабыл про эти std::uintXX_t :) их же в c++11 добавили в стандрат, до этого я так понимаю просто из c были..
...
Рейтинг: 0 / 0
20.03.2016, 20:29
    #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
20.03.2016, 20:34
    #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
20.03.2016, 20:36
    #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
20.03.2016, 23:08
    #39196641
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нельзя указать кол-во бит и инициализировать их в новом стандарте
Dima TВообще-то просто сократили количество букавна сколько я понимаю, эти типы гарантируют свою длину по стандарту. то есть если какой-то компилятор решит сделать short не двумя байтами, то uint16_t должен остаться двумя..
вот например андройд - они там намудрили со стандартом (там вроде char и wchar - один байт), а это должно работать..
...
Рейтинг: 0 / 0
20.03.2016, 23:21
    #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
21.03.2016, 06:16
    #39196716
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нельзя указать кол-во бит и инициализировать их в новом стандарте
а если битовые поля объединить union-ом с "полноценными" переменным и их заинициализировать в описании класса?
...
Рейтинг: 0 / 0
21.03.2016, 07:50
    #39196724
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нельзя указать кол-во бит и инициализировать их в новом стандарте
Пётр СедовDima Tunsigned short это и есть ровно 16 бит.Это где такое написано? Раньше было так:
количество бит в unsigned short = sizeof(unsigned short) * CHAR_BIT
CHAR_BIT -- количество бит в байте, стандартная константа из limits.h. Были экзотические платформы с необычными размерами встроенных типов...
В том и дело что когда-то были, но сегодня их уже нет и не ожидается. Какой смысл на них оглядываться?
По факту сегодня везде 1 байт = 8 бит. И нет смыла на экзотику закладываться.
...
Рейтинг: 0 / 0
21.03.2016, 14:53
    #39197204
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нельзя указать кол-во бит и инициализировать их в новом стандарте
CEMbа если битовые поля объединить union-ом с "полноценными" переменным и их заинициализировать в описании класса?а кстати, должно сработаьт.. сча посмортим
...
Рейтинг: 0 / 0
22.03.2016, 00:54
    #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
24.03.2016, 11:46
    #39199429
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нельзя указать кол-во бит и инициализировать их в новом стандарте
Пётр Седов,

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


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