C99:動的割り当てなしで抽象データ型を設計することは可能ですか?

マーカス

抽象データ型を設計する必要がありますが、動的割り当てを使用することは許可されていません。少しトリッキーなようです...

私が現在持っているもの:

adt.cの場合:

struct adt
{
  bool b;
};

const size_t adtSize = sizeof( struct adt );

// Initialisation of the adt
void Adt_New( struct adt* anAdt, bool b )
{
  // No calloc allowed...
  anAdt->b = b;
}

adt.hでは、醜い部分があります:

struct adt; // adt structure

extern const size_t adtSize;

// Bear with me...    
#define ADT_DATA( NAME ) uint8_t NAME ## _storage[ adtSize ]; \
    memset( &NAME ## _storage , 0 , adtSize ); \
    struct adt* NAME = (adt*) & NAME ## _storage;

今、私はそれをこのように使うことができます:

void TestAdt()
{
  ADT_DATA( a );

  Adt_New( a, true );
}

プロ側では、不透明(OPAQUE)型を使用しているため、動的割り当てを使用する必要はありません。

反対に、これは醜いです。また、関数内からではなく(グローバルになど)ADT_DATA(...)を呼び出そうとすると、エラーメッセージが表示されます。

これを改善することは可能ですか?現在、私の唯一の選択肢は、データ型を公開することです...

あなたのアイデアのためのTIA!

ルンディン

uint8_t無関係な目的でそのバッファを使い始めるとすぐに、厳密なエイリアシングに違反するため、このアプローチはまったく機能しません実際、それはあなたがここでやっていることです:struct adt* NAME = (adt*) & NAME ## _storage;それは未定義の動作です。

通常、(平均的な組み込みシステムのように)mallocにアクセスできないことは、ADT内に独自のメモリプールを作成することで解決されます。メモリプールは、不透明な構造体タイプのXオブジェクトの配列です。不透明なポインタを使用した例を次に示します。

ヘッダーファイル:

typedef struct adt adt;

Cファイル:

struct adt
{
  // stuff
};


static adt mempool [X];
static size_t mempool_size;    

adt* adt_alloc (/* stuff */)
{
  adt* new_obj;

  new_obj = &mempool[mempool_size];

  mempool_size++;
  if(mempool_size == MAX)
  { /* handle error */ }

  new_obj->this = 123;
  new_obj->that = 456;
  ...

  return new_obj;
}

この方法は、より複雑なADTに最も適しています。より単純なものの場合、必要なオーバーヘッドはそれだけの価値がない可能性があり、そのような場合は構造体全体を公開することを検討する必要があります。

他の方法もありますが、不透明(OPAQUE)型の静的割り当てをすべて読むことを強くお勧めします素敵なヒントとコツがたくさん。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

実行時に不明な変数にデータ型を割り当てることは可能ですか?

分類Dev

配列から値を取得してajaxでデータ名を割り当てることは可能ですか?

分類Dev

プレーン「c」で「void *」ポインタなしで一般的なデータ構造を設計することは可能ですか?

分類Dev

Javaで抽象データ型(ADT)を設計する方法は?

分類Dev

Golangを利用して動的な名前でPostgreSQLデータベースを作成することは可能ですか?

分類Dev

動的変数にバイト値を割り当てると、c#のバイトデータ型に動的に変更されるのはなぜですか?

分類Dev

それはJavaで列挙型に浮動小数点値を割り当てることは可能ですか?

分類Dev

calloc()を1回使用して、cに2次元配列を動的に割り当てることは可能ですか?

分類Dev

共有ポインターを使用して C++ でネットワークをモデル化することは、まともな設計ですか?

分類Dev

gccコンパイラがデータ型を指定せずに値を割り当てることを許可したのはなぜですか?

分類Dev

Javaで列挙型に数値を割り当てることは可能ですか?

分類Dev

null がデータ型の場合、null 型の変数を割り当てることができないのはなぜですか?

分類Dev

フィールドタイプを動的に割り当てることは可能ですか?Djangoフォーム?

分類Dev

JavaScriptで新しいデータ型を作成することは可能ですか?

分類Dev

"Omitempty" jsonタグをデフォルトの動作として設定することは可能ですか?

分類Dev

PostgreSQLでデータ型timeの列のデフォルト値として現在の時刻を設定することは可能ですか?

分類Dev

Goでldflagsを使用して未割り当ての整数を設定することは可能ですか?

分類Dev

C99は常に `int64_t`タイプが利用可能であることを義務付けていますか?

分類Dev

C99でforループ本体の外側にカウンターを宣言することに何か利点はありますか?

分類Dev

配列は静的データ構造です。では、どのようにしてメモリを動的に割り当てることができますか?

分類Dev

GCCでstd = c99をデフォルトとして設定できますか?

分類Dev

応答を返す前にデータに対して計算を実行することは可能ですか?

分類Dev

抽象型でデータを保存する方法は?データをsql_variantデータ型として保存するのは正しいですか?

分類Dev

データ駆動型ノードまたは関係ラベルを使用してマージすることは可能ですか?

分類Dev

エイリアスを作成しないことが確実である限り、uint8_t *をuint32_t *またはuint64_t *にキャストすることはC99で明確に定義されていますか?

分類Dev

大規模なデータセットの列名ではなく列番号を使用してdata.tableを集計することは可能ですか?

分類Dev

Androidで長いデータ型要素のEdittextにsetTextを設定することは可能ですか?

分類Dev

データを失うことなく、cassandraクラスターをシャットダウンして再起動することは可能ですか?

分類Dev

TensorFlowで計算グラフを拡張せずに、モデルパラメータの値を手動で設定することは可能ですか?

Related 関連記事

  1. 1

    実行時に不明な変数にデータ型を割り当てることは可能ですか?

  2. 2

    配列から値を取得してajaxでデータ名を割り当てることは可能ですか?

  3. 3

    プレーン「c」で「void *」ポインタなしで一般的なデータ構造を設計することは可能ですか?

  4. 4

    Javaで抽象データ型(ADT)を設計する方法は?

  5. 5

    Golangを利用して動的な名前でPostgreSQLデータベースを作成することは可能ですか?

  6. 6

    動的変数にバイト値を割り当てると、c#のバイトデータ型に動的に変更されるのはなぜですか?

  7. 7

    それはJavaで列挙型に浮動小数点値を割り当てることは可能ですか?

  8. 8

    calloc()を1回使用して、cに2次元配列を動的に割り当てることは可能ですか?

  9. 9

    共有ポインターを使用して C++ でネットワークをモデル化することは、まともな設計ですか?

  10. 10

    gccコンパイラがデータ型を指定せずに値を割り当てることを許可したのはなぜですか?

  11. 11

    Javaで列挙型に数値を割り当てることは可能ですか?

  12. 12

    null がデータ型の場合、null 型の変数を割り当てることができないのはなぜですか?

  13. 13

    フィールドタイプを動的に割り当てることは可能ですか?Djangoフォーム?

  14. 14

    JavaScriptで新しいデータ型を作成することは可能ですか?

  15. 15

    "Omitempty" jsonタグをデフォルトの動作として設定することは可能ですか?

  16. 16

    PostgreSQLでデータ型timeの列のデフォルト値として現在の時刻を設定することは可能ですか?

  17. 17

    Goでldflagsを使用して未割り当ての整数を設定することは可能ですか?

  18. 18

    C99は常に `int64_t`タイプが利用可能であることを義務付けていますか?

  19. 19

    C99でforループ本体の外側にカウンターを宣言することに何か利点はありますか?

  20. 20

    配列は静的データ構造です。では、どのようにしてメモリを動的に割り当てることができますか?

  21. 21

    GCCでstd = c99をデフォルトとして設定できますか?

  22. 22

    応答を返す前にデータに対して計算を実行することは可能ですか?

  23. 23

    抽象型でデータを保存する方法は?データをsql_variantデータ型として保存するのは正しいですか?

  24. 24

    データ駆動型ノードまたは関係ラベルを使用してマージすることは可能ですか?

  25. 25

    エイリアスを作成しないことが確実である限り、uint8_t *をuint32_t *またはuint64_t *にキャストすることはC99で明確に定義されていますか?

  26. 26

    大規模なデータセットの列名ではなく列番号を使用してdata.tableを集計することは可能ですか?

  27. 27

    Androidで長いデータ型要素のEdittextにsetTextを設定することは可能ですか?

  28. 28

    データを失うことなく、cassandraクラスターをシャットダウンして再起動することは可能ですか?

  29. 29

    TensorFlowで計算グラフを拡張せずに、モデルパラメータの値を手動で設定することは可能ですか?

ホットタグ

アーカイブ