
|
 |
MAEC TOOL NEWS:
MAECT-M3T-NC308WA-011001D
M3T-NC308WA, M3T-NC30WA, M3T-NC79WA, M3T-NC77WA
ご使用上のお願い
|
CコンパイラM3T-NC308WA, M3T-NC30WA, M3T-NC79WA及びM3T-NC77WAの使用上の注意事項を連絡します。
- 整数型配列の初期値を設定する時の注意事項
- if文を使った浮動小数点の比較に関する注意事項
- 整数型配列の初期値を設定する時の注意事項
- 1.1 該当製品
| M16C/80シリーズ用Cコンパイラ |
: M3T-NC308WA V.2.00 Release 1 ~ V.3.10 Release 3 |
| M16C/60, M16C/20シリーズ用Cコンパイラ |
: M3T-NC30WA V.3.20 Release 1 ~ V.4.00 Release 2 |
| 7900シリーズ用Cコンパイラ | : M3T-NC79WA V.3.20 Release 1 ~ V.4.10 Release 1 |
| 77xxシリーズ用Cコンパイラ | : M3T-NC77WA V.5.20 Release 1 ~ V.5.20 Release 4 |
- 1.2 内容
- 整数型配列の初期値が、正しくコード生成されない場合があります。
- 1.3 発生条件
- 以下4点をすべて満たす場合に発生する可能性があります。
なお、条件をすべて満たす場合でも、C言語ソースプログラムの構文によっては問題が発生しない場合があります。
- (1) 「外部変数」 または 「関数内 static変数」 として配列を定義する時に、整数型配列の初期値を設定している。
- (2) (1)の配列初期値の第1要素に、演算子※を含んだ式が存在しない。
- (3) (1)の配列初期値の第2要素以降に、演算子※を含んだ式を記述している。
- (4) 「(3)の演算子を含んだ式」 の直後の値が、10進数で256以上 342以下の整定数である。
※ マイナス記号やキャスト等も含む
- 1.4 発生例
-------------------------------------------------------------
[例1]
int array1[] = {1,-5,302}; /* NG */
int array2[] = {-1,-5,302}; /* OK */
[例2]
int i;
unsigned long addr1[] = {0,(unsigned long)&i,308};/* NG */
unsigned long addr2[] = {(unsigned long)0,
(unsigned long)&i,308}; /* OK */
-------------------------------------------------------------
- 1.5 回避策
- 本現象が発生した場合には、配列初期値の第一要素にキャスト演算子を追加してください。
-------------------------------------------------------------
[発生例1の回避策]
int array1[] = {(int)1,-5,302}; /* キャスト演算子"int"を追加 */
[発生例2の回避策]
int i;
unsigned long addr1[] = {(unsigned long)0,
(unsigned long)&i,308};
/* キャスト演算子"unsigned long"を追加 */
-------------------------------------------------------------
- 1.6 恒久対策
- 次期バージョンアップ時に改修する予定です。
M3T-NC308WA, M3T-NC30WA, M3T-NC79WA, M3T-NC77WA ご使用上のお願い
MAECT-M3T-NC308WA-011001D
- if文を使った浮動小数点の比較に関する注意事項
- 2.1 該当製品
| M16C/80シリーズ用Cコンパイラ |
: M3T-NC308WA V.1.00 Release 1 ~ V.3.10 Release 3 |
| M16C/60, M16C/20シリーズ用Cコンパイラ |
: M3T-NC30WA V.2.00 Release 1 ~ V.4.00 Release 2 |
- 2.2 内容
- if文の条件式中で浮動小数点の比較を行なった時、不正なコードを生成する場合があります。
- 2.3 発生条件
- 以下4点の条件をすべて満たした場合に発生します。
- (1) -ORオプションを使用している
- (2) if ~ else文である
- (3) if文の条件式中で浮動小数点の比較演算 (>, >=, <, <=, ==, !=) を行なっている
- (4) ifおよびelseの両実行文中で、レジスタに割り当てられている同一変数に対して読み出しを行なっている
- 2.4 発生例
-------------------------------------------------------------
int gi;
void func(void)
{
float ff;
int ii=gi;
if(ff < 1.2F){ /* 発生条件(2),(3) */
ii++; /* 発生条件(4) */
}else{
ii--; /* 発生条件(4) */
}
}
-------------------------------------------------------------
- 2.5 回避策
- ifあるいはelseのどちらか一方の実行文中にダミーのasm関数を記述してください。asm関数は発生条件(4)の前に記述してください。
[例]
-------------------------------------------------------------
int gi;
void func(void)
{
float ff;
int ii=gi;
if(ff < 1.2F){
asm(); /* ダミーのasm関数を追加 */
ii++;
}else{
ii--;
}
}
-------------------------------------------------------------
- 2.6 恒久対策
- 次期バージョンアップ時に改修する予定です。
|