C言語なら俺に聞け 160at TECHC言語なら俺に聞け 160 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト754:デフォルトの名無しさん 23/03/18 06:00:42.41 l7CGioJ10.net >>745 va_argマクロの実装を読むとわかるぞ ちとしんどいが頑張るんだ 755:デフォルトの名無しさん 23/03/18 06:46:59.63 zRF+ruu+d.net 745です >>746 ありがとうございます あとで確認してみます 756:デフォルトの名無しさん 23/03/18 07:24:12.42 pLAb7CSJ0.net 普通は関数の引数が型を指定してユーザはそれに従うところを とりあえずすべてアドレスで渡して、ユーザが自分で「そのアドレスは何を指しているか」を明示すると言うことだよ va_list ap; これの実体はただのアドレス void *p; みたいなものだね va_argの第二引数で型を指定しているが(int,double,char*)、その型のサイズに合わせてapを進めている 以下確認のコード printf("[0x%08X] " , *(int*)ap); でapの中身が va_argで指定した型のサイズ分だけ移動しているのが分かると思う 757:デフォルトの名無しさん 23/03/18 07:24:33.20 pLAb7CSJ0.net void __fastcall PrintBuffer(va_list *ap) { int i; char *buf = (char*)ap; int len=sizeof(va_list); for(i=0;i<len;i++) printf("%02X ", buf[i] & 0xFF); printf("[0x%08X] " , *(int*)ap); } /* fmt内容 → i:int値表示 d:double値表示 s:文字列表示 */ void unidisp(char *fmt, ...) { va_list ap; // 構造体オブジェクトを確保 va_start(ap,fmt); // 最終引数を指定してapを設定 while (*fmt) { PrintBuffer(&ap); if (*fmt == 'i') printf("%d sizeof(int) = %d\n", va_arg(ap, int) , sizeof(int)); // int値表示 if (*fmt == 'd') printf("%f sizeof(double) = %d\n", va_arg(ap, double) , sizeof(double)); // double値表示 if (*fmt == 's') printf("%s sizeof(char *) = %d\n", va_arg(ap, char *) , sizeof(char *)); // 文字列表示 ++fmt; } va_end(ap); // 後処理 } int main(void) { unidisp("iii",100, 200, 300); printf("\r\n"); // 3つのデータ表示 unidisp("idsids", 11, 22.22, "aaaa", 33, 44.44, "bbbbb"); // 6つのデータ表示 return 0; } 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch