[過去ログ]
C言語なら俺に聞け 160 (1002レス)
C言語なら俺に聞け 160 http://mevius.5ch.net/test/read.cgi/tech/1672191630/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
748: デフォルトの名無しさん [sage] 2023/03/18(土) 07:24:12.42 ID:pLAb7CSJ0 普通は関数の引数が型を指定してユーザはそれに従うところを とりあえずすべてアドレスで渡して、ユーザが自分で「そのアドレスは何を指しているか」を明示すると言うことだよ va_list ap; これの実体はただのアドレス void *p; みたいなものだね va_argの第二引数で型を指定しているが(int,double,char*)、その型のサイズに合わせてapを進めている 以下確認のコード printf("[0x%08X] " , *(int*)ap); でapの中身が va_argで指定した型のサイズ分だけ移動しているのが分かると思う http://mevius.5ch.net/test/read.cgi/tech/1672191630/748
749: デフォルトの名無しさん [sage] 2023/03/18(土) 07:24:33.20 ID:pLAb7CSJ0 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; } http://mevius.5ch.net/test/read.cgi/tech/1672191630/749
750: デフォルトの名無しさん [sage] 2023/03/18(土) 07:25:30.63 ID:pLAb7CSJ0 あ、__fastcall は見なかったことにして いつもの癖で…… http://mevius.5ch.net/test/read.cgi/tech/1672191630/750
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.045s