C 基于并集结构的可扩展映射向量

C 基于并集结构的可扩展映射向量,c,pointers,vector,struct,C,Pointers,Vector,Struct,一开始,如果我没有坚持第一个主题,而是选择了第二个主题,我必须道歉,但我对stackoverflow还不熟悉 我在上一个问题中问过: 收到了很多关于我遇到的问题的有用信息。但是这个问题对我来说还不是很清楚 该结构仍在运行: typedef struct somestruct_s { int s; union { unsigned char *ptr; unsigned char l_ptr[sizeof(char *)]; }; }som

一开始,如果我没有坚持第一个主题,而是选择了第二个主题,我必须道歉,但我对stackoverflow还不熟悉

我在上一个问题中问过:

收到了很多关于我遇到的问题的有用信息。但是这个问题对我来说还不是很清楚

该结构仍在运行:

typedef struct somestruct_s {
    int s;
    union {
        unsigned char *ptr;
        unsigned char l_ptr[sizeof(char *)];
    };
}somestruct_t; 
自从我的上一个问题以来,我一直在编写代码并尽最大努力找到解决方案。从那时起,这个问题对我来说就清楚多了。这个程序的要点是创建一个动态的、可扩展的映射,映射将用于位操作。端点是一个映射,我们可以在上面设置一些位,比如:将映射的260索引上的位设置为1。如果map可以放入指向map的指针所占用的内存中,那么我们可以将它放在那里,这就是这个并集的点。另一个问题是,如果有一个关于位图中不适合的位的问题,则没有错误。我们简单地回答,有位0。例如,如果我们在不适合该映射的位上设置0,我们就不会扩展该映射。地图扩展只能在地图外“我们需要将位设置为1”的情况下进行

安纳托利斯给了我一些破冰秘诀:

一个函数,如果我理解得很好,它会根据大小返回指针或映射:

还有一点关于构造函数/析构函数的澄清:

unsigned char* somestruct_init(somestruct_t* ths, unsigned char* ptr) {
    ths->s = strlen(ptr) + 1;
    if( sizeof(char*) > ths->s )  {
       ths->ptr = strdup(ptr);
       return;
    }
    strcpy(ths->l_ptr, ptr);
}

unsigned char* somestruct_destroy(somestruct_t* ths) {
    if( sizeof(char*) > ths->s )  {
        free(ths->ptr);
        return;
    }
}
但我还是看得不够清楚。特别是我不太了解构造函数,以及在扩展映射的情况下内存realloc应该是什么样子。 或者如何操作指针来设置和获取可扩展映射的值


很抱歉,我不能表达得那么简单,但信息有限。据我所知;)

如果我理解您要做的事情,您需要一大块相邻字节,任何类型的数据,用于位操作,并动态更改其大小

在这种情况下,这不是火箭科学。我完全不知道那些关于字符串的杂乱和混乱的结合(这并不能保存任何记忆)对什么有好处。sizeof指针代码也没有任何意义

只要这样做:

#include <stdint.h>
#include <stdbool.h>

typedef struct
{
  uint8_t* data;
  size_t   size;
} bitmap_t;


bool bitmap_create (bitmap_t* bm, size_t size)
{
  bm->size = size;
  bm->data = malloc(size);
  return bm->data != NULL;  // return false if allocation failed, otherwise true
}

void bitmap_delete (bitmap_t* bm)
{
  free(bm->data);
}

bool bitmap_resize (bitmap_t* bm, size_t new_size)
{
  bm->size = new_size;
  bm->data = realloc(new_size);
  return bm->data != NULL;
}

void bitmap_set_bit (bitmap_t* bm, size_t byte_n, uint8_t bit_n)
{
  if(byte_n >= bm->size || bit_n > 7)
  {
    halt_and_catch_fire();
  }

  bm->data[byte_n] |= 1u << bit_n;
}

void bitmap_clear_bit (bitmap_t* bm, size_t byte_n, uint8_t bit_n)
{
  if(byte_n >= bm->size || bit_n > 7)
  {
    halt_and_catch_fire();
  }

  bm->data[byte_n] &= ~(1u << bit_n);
}
#包括
#包括
类型定义结构
{
uint8_t*数据;
大小;
}位图;
bool位图创建(位图*bm,大小)
{
bm->size=size;
bm->data=malloc(大小);
return bm->data!=NULL;//如果分配失败则返回false,否则返回true
}
无效位图_删除(位图_t*bm)
{
免费(bm->数据);
}
bool位图大小(位图大小*bm,大小\u新大小)
{
bm->size=新尺寸;
bm->data=realloc(新尺寸);
返回bm->data!=NULL;
}
无效位图设置位(位图*bm,大小字节,uint8位)
{
如果(字节_n>=bm->大小| |位_n>7)
{
停下来,然后着火;
}
bm->data[byte_n]|=1u=bm->size | | bit_n>7)
{
停下来,然后着火;
}

bm->data[byte_n]&=~(1u您应该编辑原始问题,而不是再次提问。请澄清是否所有需要的数据都相邻地分配为一大块数据(例如,如果它表示屏幕上的像素,或其他一些硬件内存表示),或者只为每个索引分配不同的独立数据块就足够了。答案将在很大程度上取决于这两种情况中哪一种适用。@luser droog,因为现在我将始终编辑,我的错误:/。@Lundin作为一个大数据块,以前我们使用固定长度,现在可扩展。我不是那么苛刻的意思,它只是我自己的意见是肯定的。但是问一个新问题会让旧问题成为一个沉重的负担。我已经投票决定关闭旧问题,作为这个问题的复制品;它应该在这里转发答案。@user2207495?不,不是,那完全是胡说八道。你现在的工会是这样运作的:"为指针分配空间,或者为指针分配空间,以防指针大小与其自身大小不一样。然后给我机会通过调用未定义的行为访问此指针的部分字节,这样我的程序可能会崩溃。此外,如果可能,请给我额外的填充字节,以便我可能会因为我的结合而消耗更多的记忆。”正如你所希望的那样,以上所有的一切都是胡说八道。
#include <stdint.h>
#include <stdbool.h>

typedef struct
{
  uint8_t* data;
  size_t   size;
} bitmap_t;


bool bitmap_create (bitmap_t* bm, size_t size)
{
  bm->size = size;
  bm->data = malloc(size);
  return bm->data != NULL;  // return false if allocation failed, otherwise true
}

void bitmap_delete (bitmap_t* bm)
{
  free(bm->data);
}

bool bitmap_resize (bitmap_t* bm, size_t new_size)
{
  bm->size = new_size;
  bm->data = realloc(new_size);
  return bm->data != NULL;
}

void bitmap_set_bit (bitmap_t* bm, size_t byte_n, uint8_t bit_n)
{
  if(byte_n >= bm->size || bit_n > 7)
  {
    halt_and_catch_fire();
  }

  bm->data[byte_n] |= 1u << bit_n;
}

void bitmap_clear_bit (bitmap_t* bm, size_t byte_n, uint8_t bit_n)
{
  if(byte_n >= bm->size || bit_n > 7)
  {
    halt_and_catch_fire();
  }

  bm->data[byte_n] &= ~(1u << bit_n);
}