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

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

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

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

Q&A

解決済

4回答

979閲覧

可変長引数は関数化出来ないのか?void f(const char* str ,...)

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2021/06/23 10:18

編集2021/06/24 06:58

提示コードですがReFormatString();関数の可変長引数で取得した文字列を下部のgetTexture();関数の可変長引数に代入したいのですが

int a = 0; ReFormatString("font.ttf",10,"%d",a);

となった時に画面に表示される文字がおかしくなります。1と表示されます。数値は関係なく

##やりたいこと
可変長引数を取る関数の中でその可変長引数を引数に取る関数を正常に動作させる方法が知りたい。

cpp

1// ##################################### 固定文字列を変更 ##################################### 2void FrameWork::Text::ReFormatString(const char* font, int size, const char* str, ...) 3{ 4 //フォントサイズ変更 5 if (fontSize != size) 6 { 7 fontSize = size; 8 FT_Set_Pixel_Sizes(face, 0, fontSize); //ピクセルサイズを指定 9 } 10 11 if ( (fontName != std::string(font)) && (font != NULL) ) 12 { 13 fontName = std::string(font); //フォント変更 14 std::cout << fontName << std::endl; 15 //フェイス作成 16 if (FT_New_Face(ft, fontName.c_str(), 0, &face) != 0) 17 { 18 std::cerr << "FreeType フォントを読み込めません。" << std::endl; 19 assert(0); 20 } 21 22 FT_Set_Pixel_Sizes(face, 0, fontSize); //ピクセルサイズを指定 23 24 25 fixationText->clear(); 26 *fixationText = getTexture(str); 27 28 } 29}

cpp

1std::vector<Character> getTexture(const char* str,...) 2{ 3///テクスチャを生成 4}

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

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

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

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

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

episteme

2021/06/23 10:39

> 引数の%d,a等が上手く数値かされておらず関数化出来ないではと思い なにがどううまくいかんのか説明を求む。
kaina

2021/06/23 11:40

>以前 (const char *str ,..) という引数をとる関数getWchar_t();関数を作成したのですが >引数のvoid f("%d",a)等の処理で上手く数値かされておらず関数化出来ないではと思い いやいや、思うだけじゃなくてテストしようよ。 テストした上でNGパターンがあれば改修した上で、再テストしないとダメでしょ。 プログラムは作ってなんとなく動いたねで終わりじゃないですよ。
退会済みユーザー

退会済みユーザー

2021/06/24 06:58

文章を修正
guest

回答4

0

ベストアンサー

cpp

1void FrameWork::Text::ReFormatString(const char* font, int size, const char* str, 2...) { 3 ... 4 *fixationText = getTexture(str);

可変長引数を getTexture() に渡していないのですから、まともに動くはずないですよね。


「可変長引数を持つ関数 ReFormatString(font, size, const char* format, ...) の中で、可変長引数を持つ別の関数 getTexture(const char* format, ...) を呼ぶことはできるか?」という問題であるなら、私の記憶が確かならまともな方法では不可能だった気がします。

そういう場合は、getTexture() の引数を getTexture(const char* format, va_list) に変更すれば良いです。
どうしても getTexture(const char* format, ...) も必要な場合は、両方定義して getTexture(const char* format, ...) から getTexture(const char* format, va_list) を呼べばよいのです。

投稿2021/06/23 13:07

編集2021/06/24 08:46
int32_t

総合スコア21695

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

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

0

これはたぶん、たとえばすでにstd::string f( const char *, ...)があると仮定して、
std::wstring g( const char *, ...)を作りたいときに、gからfをどう呼べばいいか、という話だとおもうな。
Cの範囲では「できない」が回答で、fを分割してstd::string vf( const char *, va_list)をつくってfもgはvfを呼ぶ、という話になるのかな。
C++なら?Variadic Templatesを使えば出来る(やるべきかは別の話)。template <class... Args> std::wstring g(const char *fmt, Args... args)みたいな定義にして、gのなかでf(fmt, args...);を呼ぶみたいな話。

投稿2021/06/23 13:02

matukeso

総合スコア1681

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

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

0

...こんなやつ? フツーにできるけど。

C++

1#include <string> 2#include <cstdarg> 3#include <cstdio> 4 5std::string format(const char* str, ...) { 6 va_list args; 7 va_start(args, str); 8 std::string buff; 9 buff.resize(vsnprintf(nullptr, 0, str, args)+1); 10 vsnprintf(&buff[0], buff.size(), str, args); 11 va_end(args); 12 buff.pop_back(); 13 return buff; 14} 15 16#include <iostream> 17 18int main() { 19 int a = 123; 20 std::cout << "[" << format("a = %d", a) << "]\n"; 21 return 0; 22}

投稿2021/06/23 11:00

episteme

総合スコア16612

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

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

0

この動作は関数化出来ないのでしょうか?

ふつーに関数化できますが、なにがどういうふうに不具合があるという話なんでしょうか

投稿2021/06/23 10:57

y_waiwai

総合スコア88042

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

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

退会済みユーザー

退会済みユーザー

2021/06/23 11:01

void f(cosnt char* str,...)の中でvoid f(cosnt char* str,...)をしたいです。
y_waiwai

2021/06/23 11:02

中でするとは? ちと意味不明です
退会済みユーザー

退会済みユーザー

2021/06/23 11:05

可変長引数をとる関数の中で可変長引数の関数を使うという意味です。
episteme

2021/06/23 11:21

で、そのときどんな不具合があるんです?
退会済みユーザー

退会済みユーザー

2021/06/23 11:41

たとえばvoid f("aa %d",a);としたときに変数aの引数が上手く動作しない
y_waiwai

2021/06/23 11:43

うまく動作しないとは?具体的にどういうふうに動作するんでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問