dポイントプレゼントキャンペーン実施中!

教えて頂きたいです。

ある符号無し1byteの配列[○○]を宣言しビルドした際、
RAM領域不足の為エラーが発生しました。

そこで1byteで無くビットフィールドにて
変数テーブルを作成しようと考えています。
○○のようにビット数を可変する方法はありますでしょうか?
○○値は外部入力でいつでも設定できるようにしたい為です。

ex)
------------------------------------------------------
#define TEST_NUM 10
unsigned char a[TEST_NUM]
// TEST_NUMを可変し配列数を可変

↓↓

struct test{
unsigned char a:10;
unsigned char b:12;
};
//10又は12等を可変可能?
------------------------------------------------------

初歩的な質問で申し訳ございませんが、
宜しくお願い致します。

質問者からの補足コメント

  • 早速の回答感謝致します。

    >・実行させるのは、パソコンなのか、小さなマイコンなのか
    >・メモリはどれくらいあるのか
    >・どれくらいの大きさを宣言しようとしたのか

    ⇒[コードフラッシュ]2KB、[RAM]256Bの小さなマイコンで動かします。
     既に初期値なし変数のセクションが190B程使用されていた事を確認せずに
     100B程の大きさを宣言しようとした事が原因かと思われます。

    >また、可変とはどんな意味で使っていますか?
    >マクロで指定することは可能ですが、変数は指定できません。

    ⇒イメージ的には通信で取得した値を大域変数Aに格納し、
     Aの数だけビット数を確保したいと考えております。

    説明不足で申し訳ありません。
    宜しくお願い致します。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/09/28 09:02

A 回答 (3件)

ビットフィールドなんて、滅多に使わないので、色々と忘れてました。



・C言語の規格では、unsinged int と int しか使えない(C99以降で_Boolが追加)
 独自に、他の型に対応していることもある

・「指定した型から、特定のビット数だけ使う」というイメージで、指定した型以上のビット数は使えない
unsigned char a:10; としても10ビットにならない

・(使えたとしても)「10ビットの整数」なので、1ビットずつ使うには、ビット演算が必要
1ビットずつ使うなら
 unsigned int b0:1;
 unsigned int b1:1;
 unsigned int b2:1;
  ...
といった書き方が必要
ただ、これだと
s.b0=1;
s.b1=1;
s.b2=0;
...
などと書く必要があり、ループ中に順番に格納、といったことはできない

・期待通りにビットを詰めてくれるかどうかわからない。

・構造体のサイズが、指定したビット数と同じになるとは限らない



○配列は unsigned char で用意する
○ nビット目の値を読み書きできるような関数を用意する
nビット→ 配列の[n/8]の n%8 ビット に対応

とするのが、いいのではないでしょうか。

あるいは、
やり方そのものを見直して、全部保存しなくても済むようにするか、
もっとメモリの大きなものに変えるか。
    • good
    • 0
この回答へのお礼

対策方法をいろいろ検討して頂きありがとうございました。

記載頂いた通りビットフィールドは難しそうでしたので、
コードを見直しROM領域を無理やり40B程確保する事ができました。
なのでとりあえず配列で行おうと思います。

それでも要求を満たせない場合は、
メモリの大きいマイコンにグレードアップさせようと思います。

ありがとうございました。

お礼日時:2017/09/29 17:30

>○○のようにビット数を可変する方法はありますでしょうか?


実行時に可変にする良い方法はないと思います。
できたとしても、プログラムサイズが大きくなり動作も遅くなると思います。

しかし、ビット数が決まった状態で再度コンパイルして実行ファイルを作成すれば、
実質、状況に応じたビット数が確保された実行ファイルが手にはいると思います。
    • good
    • 0

> ある符号無し1byteの配列[○○]を宣言しビルドした際、


> RAM領域不足の為エラーが発生しました。

ここをもう少し正確に。
・実行させるのは、パソコンなのか、小さなマイコンなのか
・メモリはどれくらいあるのか
・どれくらいの大きさを宣言しようとしたのか

PCで使っている場合、
unsiged char a[1000000] ;
とかして、実行時にエラーになる場合、よほど大きな値でなければ、 mallocで動的に確保したりできるはずです。


また、可変とはどんな意味で使っていますか?
マクロで指定することは可能ですが、変数は指定できません。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!