
教えて頂きたいです。
ある符号無し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等を可変可能?
------------------------------------------------------
初歩的な質問で申し訳ございませんが、
宜しくお願い致します。
No.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 ビット に対応
とするのが、いいのではないでしょうか。
あるいは、
やり方そのものを見直して、全部保存しなくても済むようにするか、
もっとメモリの大きなものに変えるか。
対策方法をいろいろ検討して頂きありがとうございました。
記載頂いた通りビットフィールドは難しそうでしたので、
コードを見直しROM領域を無理やり40B程確保する事ができました。
なのでとりあえず配列で行おうと思います。
それでも要求を満たせない場合は、
メモリの大きいマイコンにグレードアップさせようと思います。
ありがとうございました。
No.2
- 回答日時:
>○○のようにビット数を可変する方法はありますでしょうか?
実行時に可変にする良い方法はないと思います。
できたとしても、プログラムサイズが大きくなり動作も遅くなると思います。
しかし、ビット数が決まった状態で再度コンパイルして実行ファイルを作成すれば、
実質、状況に応じたビット数が確保された実行ファイルが手にはいると思います。
No.1
- 回答日時:
> ある符号無し1byteの配列[○○]を宣言しビルドした際、
> RAM領域不足の為エラーが発生しました。
ここをもう少し正確に。
・実行させるのは、パソコンなのか、小さなマイコンなのか
・メモリはどれくらいあるのか
・どれくらいの大きさを宣言しようとしたのか
PCで使っている場合、
unsiged char a[1000000] ;
とかして、実行時にエラーになる場合、よほど大きな値でなければ、 mallocで動的に確保したりできるはずです。
また、可変とはどんな意味で使っていますか?
マクロで指定することは可能ですが、変数は指定できません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
c言語
-
C言語において、 配列要素をひ...
-
C#で配列が空かを判定するには?
-
define で 配列
-
C言語で重複組合せを全列挙
-
MFCのCArrayを使った二次元配列
-
コンボボックスでデフォルト値...
-
C言語 数値の連続入力について
-
2番目の最大値を求める
-
C#で構造体の配列を持った構造...
-
配列の要素数に変数を入れたい...
-
構造体を引数とする関数について
-
C言語の課題が出たのですが自力...
-
二次元配列による文字列の配列...
-
bmpやImageの配列を関数の引数...
-
callocで二次元配列を作成する...
-
C言語の2次元配列 容量が大き...
-
C言語 構造体でつまずいています
-
二次元配列について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
c言語
-
C言語 ファイルの指定された行...
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C言語の課題が出たのですが自力...
-
char型配列をint型に代入するには
-
C#で配列が空かを判定するには?
-
MFCのCArrayを使った二次元配列
-
コンボボックスでデフォルト値...
-
MFC - ダイアログボックスのPic...
-
c言語 構造体
-
2番目の最大値を求める
-
C言語から質問です。
-
Cのエラー
-
プログラミングに関する問題が...
-
C言語の2次元配列 容量が大き...
-
Visual C++を 用いたテキストフ...
おすすめ情報
早速の回答感謝致します。
>・実行させるのは、パソコンなのか、小さなマイコンなのか
>・メモリはどれくらいあるのか
>・どれくらいの大きさを宣言しようとしたのか
⇒[コードフラッシュ]2KB、[RAM]256Bの小さなマイコンで動かします。
既に初期値なし変数のセクションが190B程使用されていた事を確認せずに
100B程の大きさを宣言しようとした事が原因かと思われます。
>また、可変とはどんな意味で使っていますか?
>マクロで指定することは可能ですが、変数は指定できません。
⇒イメージ的には通信で取得した値を大域変数Aに格納し、
Aの数だけビット数を確保したいと考えております。
説明不足で申し訳ありません。
宜しくお願い致します。