2

最初に、最初のトピックに固執するのではなく、2 番目のトピックを作成した場合は謝罪する必要がありますが、stackoverflow は初めてです。

私が持っていた前の質問で尋ねました: 事前定義された構造体で動的ベクトルを作成する

そして、私が抱えていた問題について多くの有用な情報を受け取りました. しかし、問題はまだ解決するのに完全に透明ではありません。

まだ@その構造で働いています:

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

最後の質問以来、私はコーディングを行い、解決策を見つけるために最善を尽くしてきました。それ以来、問題は私にとってより明確になりました。このプログラムのポイントは、ビット操作に使用される動的で拡張可能なマップ、マップを作成することです。エンドポイントは、次のようないくつかのビットを設定できるマップです: マップの 260 インデックスのビットを 1 に設定します。マップへのポインターによって占有されているメモリにマップが収まる場合は、そこに配置できます。この組合の。もう 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 に答える