printf文で変数のアドレスを表示することはできますか?

このQ&Aのポイント
  • H8S2368マイコンで変数のアドレスを確認する方法について教えてください。
  • printf文を使用してアドレスを表示する際に正しい値が表示されない理由を教えてください。
  • アドレスが正しく表示されない現象の原因と対処方法について教えてください。
回答を見る
  • ベストアンサー

printf文で変数のアドレスを表示することはできますか?

いま、H8S2368でプログラミングを行っていて、変数に入れたデータをprintf文でシリアルで出力して確認したいと思い、 BYTE cur; long addr; cur = TMR1.TCSR.BYTE; addr = (long)&cur; printf("data:%X add:%X\n\r",cur,addr); このようにプログラムしました。 curに入ったデータはH8S2368マイコンの0xFFFFB3番地のTCSR_1というアドレスなので、一応そのアドレス番地の値も表示したいと思い設定したのですが、 ”data:C0 add:FF” という表示が出てきます。 アドレスが0xFFFFB3と出てこないのはなぜなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

printf("data:%X add:%p\n\r", TMR1.TCSR.BYTE, (void*)&TMR1.TCSR.BYTE); なのでは? 一度変数に入れれば、その変数のアドレスになるので。

techhouse
質問者

お礼

回答頂きありがとうございました。 printf("data:%X addr:%p\n\r", TMR1.TCSR.BYTE,(void*)&TMR1.TCSR.BYTE); これでやってみたら、 data:C0 addr:ffffb3 このように表示されました。

関連するQ&A

  • H8S2368マイコンのTCSR_1レジスタの4ビット目が1のはずなのに0と表示される。

    いま、H8S2368マイコンのプログラムを作っているのですが、 TCSR_1レジスタの値を printf("data:%X addr:%p\n\r", TMR1.TCSR.BYTE,(void*)&TMR1.TCSR.BYTE); このプログラムでリードしてみて、UART通信で受信したところ ”data:C0 addr:ffffb3” このレジスタのデータが0xC0というのを確認しました。 このH8S2368マイコンのデータシートの502ページ目(rjj09b0162_h8s2368.pdf)では、このレジスタの4ビット目はリザーブビットで、リードすると必ず”1”が読み込まれると書かれているのですが、なぜかそのビットが”0”で帰ってきます。 ”0xD0”ならばわかるのですが、これはなぜなのでしょうか?

  • printfで0x600000番地の次の0x600001番地の値を出力したい。

    H8マイコンの0x600000番地につながるSRAMメモリの内容を見たくて、 #define SRAM_BASE_ADDR 0x600000 #define SRAM_TEST_ADDR *((volatile u8 *)SRAM_BASE_ADDR) printf("data:%X addr:%p\n\r", SRAM_TEST_ADDR,(void*)&SRAM_TEST_ADDR); このような形でアドレス0x600000番地のデータをprintf関数で出力してUARTで確認していたのですが、次の0x600001番地のデータをみたい場合はprintf関数をどのように書いたらよいのでしょうか?

  • 値を変数に代入してprintfで表示しようとしてもうまくいきません

    値を変数に代入して、printfで表示しようとしてもうまくいきません。 ソースのどこが悪いか教えていただけないでしょうか? 変数の値を1個ずつ表示する場合は、正常になります。 問題は、1行で表示する場合に1個目の値は出るのですが正常な表示にはなりません。 //ソース開始 #include <stdio.h> #include <windows.h> int main() { LARGE_INTEGER i64,h64; LONGLONG work,h,m,s; QueryPerformanceCounter(&i64); QueryPerformanceFrequency(&h64); //起動時間をミリ秒取得 work = i64.QuadPart*1000 / h64.QuadPart; //時間をhに入れる h = work / 1000 / 3600; //分をmに入れる m = (work / 1000 - h * 3600) / 60; //秒をsに入れる s = work / 1000 - h * 3600 - m * 60; //表示 printf("%d時間%02d分%02d秒\n",h,m,s); printf("%d時間\n",h); printf("%d分\n",m); printf("%d秒\n",s); printf("%d秒\n",work); return 0; } //ソースここまで //実行結果 289時間00分55秒 289時間 55分 54秒 1043754590秒 続行するには何かキーを押してください . . . //理想の表示結果 1行目が以下のようになってほしい 289時間55分54秒

  • 引数に"1"を設定したのに関数内の変数では"0"として扱われてしまう。

    引数に"1"を設定したのに関数内の変数では"0"として扱われてしまう。 今自分が持っているICカードをH8マイコンで読み取り、そこから取れたユニーク番号をフラッシュロムに書き込むという下の関数プログラムをつくっています。 void card_data_proc(WORD data,BYTE group,WORD num,BYTE add) { BYTE *pData; if(add == TRUE) pSCard->cad[group].data[num] = data; else pSCard->cad[group].data[num] = 0x0000; pData = (BYTE *)SRAM_CARD_BUF; pData[sizeof(CARD_DB) - 1] = env_crc(pData,sizeof(CARD_DB) - 1); //flash_fs_write((DWORD)FLASH_CARD_ADDR - (DWORD)FLASH_BASE,(BYTE *)pSCard,sizeof(CARD_DB)); flash_fs_write((DWORD)FLASH_CARD_ADDR,(BYTE *)pSCard,sizeof(CARD_DB)); } 困っているのが、この関数を WORD data; BYTE MenuCardGroup; int cardindex; card_data_proc(data,MenuCardGroup,cardindex,1); このプログラムで呼び出した行く時の動作をデバッガでおってみたところ、引数に”1”を渡したはずのaddの変数がなぜか”0"になってしまっていて、card_data_proc関数のif文でTRUEの条件に行かないのです。 なぜこのようになるのか御存じの方いらっしゃいませんでしょうか? このような現象に遭遇した場合はどのような点を確認していったらよいのでしょうか?

  • AVR studio6でeepromリードできない

    AVR studio6.1の環境をPCに入れてATmega88のプログラムを行っています。ATmega88に電源を投入直後に初期設定のために、あらかじめeeprom内に設定しているプリセット値を読み込むためにeeprom_read_byte関数を使用してデータを読み出したいと思っています。 テストとしてeepromの0x00番地のデータを読み出そうとしているのですが、データを読み出すことができず困っています。 volatile u8 test01; volatile u8 test02; volatile u8 test03; volatile u8 test04; volatile int addr; addr = 0x00; eeprom_busy_wait(); test01 = eeprom_read_byte(&addr); addr = 0x01; eeprom_busy_wait(); test02 = eeprom_read_byte(&addr); addr = 0x02; eeprom_busy_wait(); test03 = eeprom_read_byte(&addr); addr = 0x03; eeprom_busy_wait(); test04 = eeprom_read_byte(&addr); このようなプログラムを組んでAVR Studio6.1のシミュレーションモードで、eepromのアドレス0x00番地から順に0x00,0x01,0x02,0x03,0x04・・・・  このように設定してみたのですが、 実際にシミュレーションしてみるとeeprom_read_byteの戻り値に代入されたtest01,test02,test03,test04には0x00という値が代入されeeprom内からのデータの読み出しに失敗しているようです。 eepromデータの取り扱いに関するプログラムの書き方などご教示頂きますよう、お願い致します。

  • printfについて

    他サイトにて非常に興味の有るコードがあったのですが、そのサイトは訳合って見れなくなってしまったのでこちらで聞かせてください。 下記のprintfの中の、%.*sはどう解釈したら良いのですか? % . * s それぞれどういう意味が有るのですか? 始めて見るパターンなので分かりません。 #include <stdio.h> #include <stdlib.h> #include <locale.h> int main(void) { char a[] = "あいaう"; char *p; int len; setlocale(LC_CTYPE, ""); for (p = a; *p; p += len) { len = mblen(p, MB_CUR_MAX if (len <= 0) break; printf("%d: %.*s\n", len, len, p); } return 0; }

  • char型変数のアドレスを coutで表示するには

    #include <iostream> using namespace std; int main() { bool b; int i; short s; long l; float f; double d; char c; //上で宣言した変数のアドレスを表示 cout << "bool &b " << &b << endl; cout << "int &i " << &i << endl; cout << "short &s " << &s << endl; cout << "long &l " << &l << endl; cout << "float &f " << &f << endl; cout << "double &d " << &d << endl; cout << "char &c " << &c << endl; //「char &c 」とのみ表示される cout << '\n'; //char型のみ printf で再表示 printf("char &c %p\n", &c); //「char &c ********」と表示される return 0; } 上のプログラムを実行すると cout << "char &c " << &c << endl; のところだけ、アドレスが表示されません。 printfを使えば、char型の変数のアドレスも表示されるのですが…。 coutを使ってchar型のアドレスを表示させるにはどうすればいいのでしょうか。 よろしくお願いします。

  • printf による16進表示について

    C言語初心者です。 今作っているプログラムで、データを16進形式で表示しようとしています。 大体このような感じです。 /*入力時*/ char buf[5]={0x4e,0x94,0xa0,0x2b,0x78} /*出力時*/ for (i = 0; i < 5; i++) { printf("0x%02x\n",buf[i]) } 実際には入力後にある処理によってbufは更新されるのですが、printfの出力結果として、 0xffffff4e 0x94 0xffffffa0 0x2b 0x78 というように、'ffffff'が付加したものがいくつか出力されてしまいます。 これはどういった意味を持つのでしょうか? なんか初心者ならではの漠然とした質問ですいません。。。

  • ダンププログラムの結果表示で2バイトの場合

    ダンププログラムを作っています。 右のファイルの中身を表示する際に、16個目のデータが2バイト(漢字、全角文字など)だった場合、正しく表示されません。 改行前に2バイト目を表示したいのですがどうしたらよろしいでしょうか。 実行結果 /*----------------------- ..printf("ダンプ 表示するファイル 名を入力してくだ さい(ESC.キーで I了)\n");....... .printf("\n");.. ......scanf_s("% s",.fname);..... .if(error.=.fope n_s(&fp,.fname,. "rb").!=..0).{.. ...printf("ファ Cルがオープンで ォません\n");.... -----------------------*/ #include <stdio.h> #include <string.h> void DispData(void); FILE *fp; int main(void) { errno_t error; // エラーコード char fname[64] = { 0 }; // ファイル名 while(1) { printf("ダンプ表示するファイル名を入力してください(ESC キーで終了)\n"); printf("\n"); scanf_s("%s", fname); if(error = fopen_s(&fp, fname, "rb") != 0) { printf("ファイルがオープンできません\n"); } else { DispData(); break; } } printf("\n"); return 0; } void DispData(void) { int i = 0; int n; long addr = 0; unsigned char buf[16]; printf("ADRESS "); for(i=0; i<16; i++) { printf(" %02X", i); } printf(" DATA\n\n"); // ファイルの終了までファイルの内容をbufに1バイトサイズ、16要素で読み込む while( (n = fread(buf,sizeof(unsigned char),16,fp)) > 0) { //アドレスの表示 printf("%08lX ",addr); //読み込んだファイルの内容を16進数で表示 for(i = 0;i < n;i++){ printf("%02X ",buf[i]); } //16個に満たない分はスペースを表示 if(n < 16) { buf[i] = '\0'; for(;i < 16;i++){ printf(" "); } } printf(" "); for(i = 0;i < n; i++) { if((buf[i] >= 0x00) && (buf[i] <= 0x20) ) { putchar('.'); } else { putchar(buf[i]); } } printf("\n"); addr += 16; } }

  • MACアドレス C言語

    eclipseでインターネットにあるMACアドレスを取得するプログラムをコピペしました。 それでMACアドレスが正常に取得されているかどうかはどこでわかるのでしょうか? ソースコードを貼り付けさせて頂きます。(C言語で御座います。) #include <stdio.h> #include <string.h> #include <ifaddrs.h> #include <sys/socket.h> #include <net/if.h> #include <net/if_dl.h> #include <net/if_types.h> int main() { struct ifaddrs *ifa_list, *ifa; struct sockaddr_dl *dl; char name[12]; unsigned char *addr; if (getifaddrs(&ifa_list) < 0) { return 1; } for (ifa = ifa_list; ifa != NULL; ifa = ifa->ifa_next) { dl = (struct sockaddr_dl*)ifa->ifa_addr; if (dl->sdl_family == AF_LINK && dl->sdl_type == IFT_ETHER) { memcpy(name, dl->sdl_data, dl->sdl_nlen); name[dl->sdl_nlen] = '\0'; addr = LLADDR(dl); printf("%s: %02x:%02x:%02x:%02x:%02x:%02x\n", name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); } } freeifaddrs(ifa_list); return 0; } eclipseのコンソール画面には何も出ないので困っています。 非常に馬鹿ですがキーワードだけでも零してもらえると嬉しいです。

専門家に質問してみよう