- 締切済み
ポインタ演算がうまくできません
以下のソースを実行すると、直値でアドレスをしていするのは うまくアセンブラに展開され、意図するアドレスを取り出す ことが出来るのですが、変数でアドレス演算させると意図する アドレスが取得できません。 何か記述がおかしいのでしょうか? ご存知の方宜しくお願い致します。 char const test_tbl[] = { -3, -2, -1, 0, 1, 2, 3, 4, 5}; unsigned char *ptr; unsigned char work; #define STA_OFFSET (&test_tbl[3]) void main( void) { // 適切なポインタが取得できる ptr = (STA_OFFSET + 3); // ポインタが取得できない。 work = 3 ptr = (STA_OFFSET + work); }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
こういった質問は、 「~」という方法で確認したら、「~」という結果を意図したにもかかわらず、「~」という結果だったと、そこをはっきり書かないと、回答はかなり難しいと思います。 どういう「意図しない」結果だったかは、解決の大きなヒントになるわけですが。
- a-saitoh
- ベストアンサー率30% (524/1722)
興味深いですね.私の環境では再現しませんでした. 使っているコンパイラは何でしょうか? ざっとみて怪しいのは,wkがunsignedcharであること. ポインタに unsigned charを加えるときの自動型変換で トラブルが起きているのかも知れません.wkをintに変えたら 直りませんか?
- Trick--o--
- ベストアンサー率20% (413/2034)
同じものを表すときは、同じ型を使いましょう(特別な理由が無い限り) どうしても同じ型で宣言できないときは型キャストもしょうがないでしょう。 test_tblをconst unsigned charに、とptrをconst unsgned char *に変えたら動きましたよ。 確認:VC++6 typedef unsigned char BYTE; const BYTE test_tbl[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8'}; const BYTE *ptr; BYTE work; #define STA_OFFSET (&test_tbl[2]) int main(int argc, char *argv[]) { ptr = STA_OFFSET + 1; printf("%c\n",*ptr); work = 2; ptr = STA_OFFSET + work; printf("%c\n",*ptr); return 0; }
- Tacosan
- ベストアンサー率23% (3656/15482)
test_tbl を const char [] で定義してるんだから, ポインタの ptr は const char * じゃないと. 記述としておかしいのはそこだけ. それでもダメなら, アセンブラレベルでどうなっているかチェックするか, コンパイラのバグを疑うかですね.
- Trick--o--
- ベストアンサー率20% (413/2034)
・型が悪い? charは「文字型」です。整数を扱うなら「int」にしましょうか。 ・セミコロンが無い work=3 の行に;がありません。 ・const constの有無で弾かれます。STA_OFFSETを型キャストすれば通りましたが…… 確認環境:VC++6
補足
説明不足ですいません。 ・セミコロンが無いのは質問時に打ち直ししたためです。 実際はあります。書き間違いました。 ・型は1Byteデータのテーブルです。実際はunsigned charを 予定しています。 ・const は ROMに割り付けたいのでつけています。
補足
失礼しました。 >> ポインタの ptr は const char * じゃないと こちらも質問時の記載ミスです。 実際にはTypedefして使用しているのですが、 const char * と同様の宣言をしております。 使用しているコンパイラでは、記憶型指定子というものを つかって記述しています。