2013年7月3日水曜日

PIC C18 メモ( Warning 2066 )

-----------------------------
ROM から RAM へ文字列のコピーで、Warning 2066
-----------------------------
固定文字列をROMから読み出して加工したい場合、一旦RAMへコピーする。これに使う関数 strcpypgm2ram で、ハマった。自前の関数では出てこないのに標準ライブラリの関数を使うとワーニングが出る。
strcpypgm2ram(dest, src );
とすると、Warning [2066] type qualifier mismatch in assignment
とワーニングのメッセージ。解決策は、
strcpypgm2ram(dest, (const far rom char *) src );
と明示的に型を指定するとよい。
-----------------------------
メモリモデル
-----------------------------
ライブラリのプロトタイプには
char * strcpypgm2ram( char *dest, const rom char *src );
とある。
  • char *dest RAMを指す
  • char *src はROMのアドレスを要求しているが
  • ここにメモリモデルの情報( far 修飾子 )を加えてやる必要がある(説明書には無く、Q&Aにあった)
  • memcpypgm2ram 関数等も同じ
-----------------------------
リテラルで書いた場合
-----------------------------
strcpypgm2ram( dest,( const far rom char *)"MONDAY");
strcpypgm2ram( dest,( far rom char *)"MONDAY");
strcpypgm2ram( dest,( const rom char *)"MONDAY"); //[W2066]
strcpypgm2ram( dest,( rom char * )"MONDAY");      //[W2066]
strcpypgm2ram( dest,"MONDAY");                    //[W2066]


[W2066]:Warning [2066] ポインタの型が合わないので警告が出る(正常に動かない)

2010.02 - 2013.07.05