2

一开始我必须道歉,如果我做了第二个主题而不是坚持第一个主题,但我是stackoverflow的新手。

我在上一个问题中问过: 在预定义的结构上创建动态向量

并收到了很多关于我遇到的问题的有用信息。但是这个问题对我来说仍然不是很透明来解决它。

仍在工作@该结构:

typedef struct somestruct_s {
    int s;
    union {
        unsigned char *ptr;
        unsigned char l_ptr[sizeof(char *)];
    };
}somestruct_t; 

自从我上一个问题以来,我一直在编码并尽力找到解决方案。从那以后,这个问题对我来说变得更加清楚了。该程序的重​​点是创建一个动态且可扩展的映射,该映射将用于位操作。端点是一个映射,我们可以在其上设置一些位,例如:将映射的 260 索引上的位设置为 1。如果映射可以放入指向映射的指针所占用的内存中,那么我们可以将它放在那里,并且那个点这个联盟的。另一个问题是,如果有关于不适合地图的位的问题,则没有错误。我们简单地回答,有位 0。例如,如果我们在不适合该映射的位位置设置 0,我们不会扩展映射。地图扩展只应在地图外“我们需要将位设置为 1”的 1 种情况下进行。

AnatolyS 给了我一些破冰技巧:

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

unsigned char* somestruct_get_bitmap(somestruct_t* ths) {
    if( sizeof(char*) > ths->s ) 
        return ths->ptr;
    return ths->l_ptr;
}

以及对构造函数/析构函数的一些说明:

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;
    }
}

但我还是看的不够清楚。特别是我不太了解构造函数以及在扩展地图的情况下内存重新分配应该是什么样子。或者如何操作指针来设置和获取可扩展映射的值。

抱歉,我无法表达得更简单,但信息有限。据我所知;)

4

1 回答 1

0

如果我理解你想要做什么,你想要一大块相邻的字节,任何类型的数据,你将使用它来进行位操作,并且会动态地改变它的大小。

在那种情况下,这不是火箭科学。我完全不知道所有关于字符串的混乱和混乱的联合(它不会节省任何内存)有什么好处。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);
}
于 2013-03-27T14:57:03.940 回答