MC9S12C32マイクロコントローラ用の埋め込みCコードでは、静的サイズのバイト配列とキューの前後に2つの "ポインタ"を使用して循環キュー(別名循環バッファ)実際にはキューの配列のインデックスにすぎません。 trear
が後部要素の実際の指標であるが、tfront
は、前部要素(コースの16を法とする被験者)の実際の屈折率よりも小さいものであることC unsigned modulusによってコンパイラの警告が発生する
// call unsigned chars bytes
typedef unsigned char byte;
byte trear = 0; // SCI transmit display buffer IN index
byte tfront = 0; // SCI transmit display buffer OUT index
byte tsize = 16; // size of transmit buffer
byte tbuf[16]= {0};// SCI transmit display buffer
注意。だから私のバッファが「こんにちは」含まれている場合(空スロットがガベージ値である)、例えば、それは次のようになります。
:それはキューからバイトを削除する時が来たとき_________________________________
| | |h|e|l|l|o| | | | | | | | | |
^ ^
front rear
、私はこれを行います
// increment front index
tfront++;
// wrap front index if it exceeded bounds
tfront %= tsize; // (A)
// get character to transmit
byte outputChar = tbuf[tfront];
これはすべて問題なく動作します。少なくとも、私のプログラムではこのフラグメントに関するバグはありませんでした。私はこのプログラムをコンパイルするときしかし、私のコンパイラがラインについて私に警告文句、上記の断片で(A)
をマーク:
を警告:C2705:データ
main.cのライン損失の可能性402
行402は行(A)です。私はgccなどを使用していないことに注意してください。私はFreescaleのCodeWarrior IDEでコンパイルしています。これは、時には他にも幾分不思議な警告を与えています。警告を取り除くための試みで、私は、上記のようフラグメントを書き直し:
// increment front index mod tsize
tfront = (tfront + 1 >= tsize) ? 0 : tfront + 1; // (B)
// get character to transmit
byte outputChar = tbuf[tfront];
しかし、私のコンパイラは、まだ、ライン(B)
については、この時間を同じ警告を発します。コンパイラが、文の中で(tfront + 1 >= tsize)
、tfront
が実行前に255であり、オーバーフローしている可能性があります。もちろん、私はこれが起こらないことを知っていますが、私のコンパイラはしません。
この場合、なぜ(A)
という行が問題になったのですか?基本的に、私はコンパイラが何を不幸にしているか知りたい。
私の質問を入力して以来、私は、プリプロセッサの定義(すなわち、#define TSIZE 16
)に変数の型からtsize
を変更することによってそれを解決してきました。私の質問はまだ立っている。
いくつかの関連質問:
unsigned overflow with modulus operator in C
modulus operator with unsigned chars
注キャストなしのこの警告。したがって、16要素のバッファに対しては、 'tfront%= 16'ではなく' tfront | = 0x0f'となります。一般的には、2の累乗である 'tsize 'があれば、必要なmod-maskは' tsize - 1'です。 – Clifford
@Clifford警告が、 'lval = expr;' lval'型が 'byte'型で' expr'型が 'int'型に拡張されていることによって引き起こされる警告の場合、ビットマスクを使用しても、 'tfront&mask;'は 'tfront%t'が(C99 6.3.1.1:2と6.3.1.8:1)と同じ理由で' tfront = tfront & mask; 'に展開し、' tfront&mask'は 'int '型を持ちます。整数昇格は両方のオペランドで実行されます) ")。 –
@Cliffordさらに、ビットごとの演算子を正しく取得する必要があります。あなたは '&'を意味しましたか? –