dポイントプレゼントキャンペーン実施中!

以下のソースを実行すると、直値でアドレスをしていするのは
うまくアセンブラに展開され、意図するアドレスを取り出す
ことが出来るのですが、変数でアドレス演算させると意図する
アドレスが取得できません。
 何か記述がおかしいのでしょうか?
ご存知の方宜しくお願い致します。




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);

}

A 回答 (5件)

こういった質問は、


「~」という方法で確認したら、「~」という結果を意図したにもかかわらず、「~」という結果だったと、そこをはっきり書かないと、回答はかなり難しいと思います。

どういう「意図しない」結果だったかは、解決の大きなヒントになるわけですが。
    • good
    • 0

興味深いですね.私の環境では再現しませんでした.


使っているコンパイラは何でしょうか?

ざっとみて怪しいのは,wkがunsignedcharであること.
ポインタに unsigned charを加えるときの自動型変換で
トラブルが起きているのかも知れません.wkをintに変えたら
直りませんか?
    • good
    • 0

同じものを表すときは、同じ型を使いましょう(特別な理由が無い限り)


どうしても同じ型で宣言できないときは型キャストもしょうがないでしょう。
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;
}
    • good
    • 0

test_tbl を const char [] で定義してるんだから, ポインタの ptr は const char * じゃないと.


記述としておかしいのはそこだけ. それでもダメなら, アセンブラレベルでどうなっているかチェックするか, コンパイラのバグを疑うかですね.

この回答への補足

失礼しました。
>> ポインタの ptr は const char * じゃないと
こちらも質問時の記載ミスです。
実際にはTypedefして使用しているのですが、 const char *
と同様の宣言をしております。
使用しているコンパイラでは、記憶型指定子というものを
つかって記述しています。

補足日時:2006/04/07 13:54
    • good
    • 0

・型が悪い?


charは「文字型」です。整数を扱うなら「int」にしましょうか。

・セミコロンが無い
work=3 の行に;がありません。

・const
constの有無で弾かれます。STA_OFFSETを型キャストすれば通りましたが……

確認環境:VC++6

この回答への補足

説明不足ですいません。
・セミコロンが無いのは質問時に打ち直ししたためです。
実際はあります。書き間違いました。

・型は1Byteデータのテーブルです。実際はunsigned charを
予定しています。

・const は ROMに割り付けたいのでつけています。

補足日時:2006/04/07 11:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!