
教えて頂きたいです。
ある符号無し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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
C言語 ファイルの指定された行...
-
配列の要素数に変数を入れたい...
-
c言語
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C言語 数値の連続入力について
-
fclose()でセグメンテーション違反
-
C言語において、 配列要素をひ...
-
コンボボックスでデフォルト値...
-
C言語の課題が出たのですが自力...
-
Cのエラー
-
MFCのCArrayを使った二次元配列
-
構造体のextern方法
-
構造体を引数とする関数について
-
このプログラム見てもらえますか?
-
AfxBeginThread の引数について
-
C言語についてです 5人のテスト...
-
VB.NETにおける構造体の初期化
-
[C++]const int と配列
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語 ファイルの指定された行...
-
C言語において、 配列要素をひ...
-
C言語の課題が出たのですが自力...
-
C#で配列が空かを判定するには?
-
構造体のextern方法
-
C言語の配列のコピーについて
-
c言語 構造体
-
C言語 数値の連続入力について
-
MFC - ダイアログボックスのPic...
-
C++DLLからC#へのコールバック...
-
配列のアドレス部
-
要素数・要素の値が未定の配列...
-
C言語についてです 5人のテスト...
-
.NET C++で、構造体の配列をnew...
-
2番目の最大値を求める
おすすめ情報
早速の回答感謝致します。
>・実行させるのは、パソコンなのか、小さなマイコンなのか
>・メモリはどれくらいあるのか
>・どれくらいの大きさを宣言しようとしたのか
⇒[コードフラッシュ]2KB、[RAM]256Bの小さなマイコンで動かします。
既に初期値なし変数のセクションが190B程使用されていた事を確認せずに
100B程の大きさを宣言しようとした事が原因かと思われます。
>また、可変とはどんな意味で使っていますか?
>マクロで指定することは可能ですが、変数は指定できません。
⇒イメージ的には通信で取得した値を大域変数Aに格納し、
Aの数だけビット数を確保したいと考えております。
説明不足で申し訳ありません。
宜しくお願い致します。