質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1849閲覧

可変長引数で文字の描画方法について

hikarhikar

総合スコア18

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/06 09:59

OpenGLを使用し可変長引数を用いて文字を描画するプログラミングを何回か書いてきましたが、
インターネットの説明でいろいろな記事を見ましたが、まだイメージが難しいところがあるので、質問させていただきました。

va_list・va_start・vswprintf_s・についてお聞きしたいのですが


va_list

可変長引数を扱ううえで必要な情報を保持する変数だといることはわかるのですが、
具体的にどのような情報を保持しているのでしょうか?


va_start

可変長引数リストの初期化
ネットの記事では[第2引数:指定した引数以降を引数リストに格納]と書いてあったのですが、
下の場合では、可変長引数リストformatに格納されている文字列を、va_listで定義したargListに格納するということでしょうか?
va_start(argList, format);

そして、
vswprintf_s

下の場合では、第3引数の型を基に第2引数が示す文字列を第1引数に格納する。でいいのでしょうか?
vswprintf_s(buf, format, argList);


va_startとvswprintf_sの関係性がいまいちイメージできませんでした。
どなたかわかる方教えていただければ幸いです。<(_ _)>

C++

1void font_Draw(const wchar_t* format, ...) { 2 va_list argList; 3 4 if (format == nullptr)return; 5 6 wchar_t buf[256]; 7 va_start(argList, format); 8 vswprintf_s(buf, format, argList); 9 va_end(argList); 10 11 int length = wcslen(buf);//ワイド文字列の長さ 12 int list = glGenLists(length);//連続した空のディスプレイ・リストを生成します 13 14 wchar_t fontType[] = { L"MS明朝" }; 15 HFONT Ofont = CreateFontW( 16 20, //_In_ int cHeight:論理フォントの高さ 17 0, //_In_ int cWidth:論理フォントのはば 18 0, //_In_ int cEscapement:文字の方向(左から右) 19 0, //_In_ int cOrientation 20 FW_REGULAR, //_In_ int cOrientation 21 FALSE, //_In_ DWORD bItalic 22 FALSE, //_In_ DWORD bUnderline 23 FALSE, //_In_ DWORD bStrikeOut 24 SHIFTJIS_CHARSET, //_In_ DWORD iCharSet 25 OUT_DEFAULT_PRECIS, //_In_ DWORD iOutPrecision 26 CLIP_DEFAULT_PRECIS, //_In_ DWORD iClipPrecision, 27 DEFAULT_QUALITY, //_In_ DWORD iQuality 28 FIXED_PITCH | FF_MODERN,//_In_ DWORD iPitchAndFamily 29 fontType); //_In_opt_ LPCWSTR pszFaceName 30 31 HDC Odc = wglGetCurrentDC(); 32 SelectObject(Odc, Ofont); 33 34 wchar_t* font = buf; 35 int i = 0; 36 for (; (*font != '\0') && (*font != '\n'); font++) { 37 wglUseFontBitmapsW( 38 Odc, // HDC 39 *font, // DWORD 40 1, // DWORD 41 list+(DWORD)i// DWORD 42 ); 43 i++; 44 } 45 glColor3f(0xff,0xff,0xff); 46 glPushMatrix(); 47 { 48 glRasterPos2i(100, 100); 49 for (int i = 0; i < length; i++) { 50 glCallList(list + i); 51 } 52 } 53 glPopMatrix(); 54 55 if (*font == '\n' || '\0') { 56 glDeleteLists(list, length); 57 list = 0; 58 length = 0; 59 60 font_Draw(++font); 61 } 62}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

va_list

具体的にどのような情報を保持しているのでしょうか?

関数を呼び出す際にスタックに積まれた引数リストへのポインタです。

下の場合では、可変長引数リストformatに格納されている文字列を、va_listで定義したargListに格納するということでしょうか?

va_start(argList, format);

formatの後の引数を指すようにargListを初期化しています。

下の場合では、第3引数の型を基に第2引数が示す文字列を第1引数に格納する。でいいのでしょうか?

vswprintf_s(buf, format, argList);

第2引数の書式文字列を元に、第3引数のポインタが指す先の値を文字列化して第1引数のバッファに格納しています。

va_arg, va_copy, va_end, va_start
vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l

投稿2020/05/06 10:22

編集2020/05/06 10:34
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問