как сделать свой тип в c++?

86
12 марта 2021, 21:40

Например я могу сделать в структуре или в классе вот так.

unsigned int ax:16;

Мне надо сделать al и ah, каждый по одному байту и ещё чтобы они были указателями. Такое вроде нельзя сделать, но всё же хочу уточнить. И ещё чтобы al и ah указывали на нужное смещение в ax.

Answer 1

Если вам нужны указатели, то например, так:

#include <stdio.h>
#include <stdint.h>
void
setalah (uint16_t *p, uint8_t **ppl, uint8_t **pph)
{
  uint8_t *pp = (uint8_t *)p;
  int v = 1;
  char *low = (char *)&v;
  if (*low) {  // dynamic check endianness (low or big-endian system)
    // well, may be better to do as #ifdef ??? It's your choice
    *ppl = pp;
    *pph = pp + 1;
  } else {
    *pph = pp;
    *ppl = pp + 1;
  }
}
#define ah (*pah)
#define al (*pal)
int
main (int ac, char *av[])
{
  // *****  вот этот фрагмент -- ответ на вопрос
  uint16_t a;
  uint8_t *pal, *pah;
  setalah(&a, &pal, &pah);
  // ***** конец фрагмента

  printf("&a: %p  pal: %p pah: %p\n",
     (void *)(&a), pal, pah);
  int v;
  while (scanf("%d", &v) == 1) {
    a = v;
    int vl = *pal, vh = *pah;
    printf("v: 0x%02x vl: 0x%02x vh: 0x%02x\n", v, vl, vh);
    printf("ah: %d al: %d\n", ah, al);
  }
}

А для доступа к памяти по указателю, как к переменной (по имени) всегда можно написать простые #define.

P.S.
gnu компилятор не сомневается, что это программа на С++

Answer 2

Создавать с помощью union нежелательно, так как компилятор может с оптимизировать и убрать весь код, который не нужен. Структура битовых полей тоже не очень удобна, так как адрес будет не доступен. Компилятор может создать реализацию на свой вкус. Проще сделать как делают все сишники:

# include<iostream>
class R{
public :
uint64_t volatile & rx(){return *(uint64_t volatile *)r;}
uint32_t volatile & ex(){return *(uint32_t volatile *)r;}
uint16_t volatile & x(){return *(uint16_t volatile *)r;}
uint8_t volatile & h(){return *(uint8_t volatile *)(r+1);}
uint8_t volatile & l(){return *(uint8_t volatile *)r;}
private:
volatile uint8_t r[8];
};
int main(){
    R r;
    r.l()=1;
    r.h()=1;
  std::cout<<"r.x="<<r.x()<<"\n"; }

итого:

$ ./a.out 
r.x=257
READ ALSO
Воспроизведение аудиофайла в Jquery

Воспроизведение аудиофайла в Jquery

Всем приветКак реализовать в Jquery, чтобы при каждом клике аудиофайл проигрывался всего один раз

114
Как передать table в textarea jQuery?

Как передать table в textarea jQuery?

Есть страница корзины, на странице товары и их параметры формируются в таблицу table

127
nav выходит за пределы div

nav выходит за пределы div

Всем приветПоявилась проблемка: nav выходит за пределы div при масштабирование окна браузера

111