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

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

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

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

Q&A

解決済

3回答

4136閲覧

[GLUTで文字列描画] 型"const wchar_t*"の引数は型"wchar_t*"のパラメータと互換性がありません

THETA97556919

総合スコア5

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

0グッド

1クリップ

投稿2021/04/23 02:45

編集2021/04/23 03:01

前提・実現したいこと

このリンクで実装していること。
OpenGLで文字列描画をしたい。

発生している問題・エラーメッセージ

リンクのソースコードを写して学習していましたが、エラーを吐かれました。

//該当箇所 *1 ・型"const wchar_t*"の引数は型"wchar_t*"のパラメータと互換性がありません  ・'void GLFONT::DrawStringW(int,int,wchar_t*,...)'引数3を'const wchar_t[17]'から’wchar_t*’へ変換できません。 //該当箇所 *2 ・コンストラクター"GLFONT::GLFONT"のインスタンスが引数リストと一致しません ・'GLFONT::GLFFONT(wchar_t*, int)':引数1を'const wchar_t[5]'から'wchar_t*'へ変換できません。

該当のソースコード

C++

1#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") 2#include <GL/freeglut/freeglut.h> 3#include <stdio.h> 4 5#define WIDTH 320 6#define HEIGHT 240 7 8class GLFONT 9{ 10public: 11 HFONT Hfont; 12 HDC Hdc; 13 GLFONT(wchar_t *fontname, int size); 14 void DrawStringW(int x,int y,wchar_t *format, ...); 15}; 16//コンストラクタ フォント作成 17GLFONT::GLFONT(wchar_t *fontname, int size) 18{ 19 Hfont = CreateFontW( 20 size, //フォント高さ 21 0, //文字幅 22 0, //テキストの角度 23 0, //ベースラインとx軸との角度 24 FW_REGULAR, //フォントの太さ 25 FALSE, //イタリック体 26 FALSE, //アンダーライン 27 FALSE, //打ち消し線 28 SHIFTJIS_CHARSET, //文字セット 29 OUT_DEFAULT_PRECIS, //出力精度 30 CLIP_DEFAULT_PRECIS, //クリッピング精度 31 ANTIALIASED_QUALITY, //出力品質 32 FIXED_PITCH | FF_MODERN, //ピッチとファミリー 33 fontname); //書体名 34 35 Hdc = wglGetCurrentDC(); 36 SelectObject(Hdc, Hfont); 37} 38//ワイド文字列の描画 39void GLFONT::DrawStringW(int x,int y,wchar_t *format, ...) 40{ 41 wchar_t buf[256]; 42 va_list ap; 43 int Length=0; 44 int list=0; 45 46 //ポインタがNULLの場合は終了 47 if ( format == NULL ) 48 return; 49 50 //文字列変換 51 va_start(ap, format); 52 vswprintf_s(buf, format, ap); 53 va_end(ap); 54 55 Length = wcslen(buf); 56 list = glGenLists(Length); 57 for( int i=0; i<Length; i++ ){ 58 wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i); 59 } 60 61 glDisable(GL_LIGHTING); 62 glRasterPos2i(x, y); 63 //ディスプレイリストで描画 64 for( int i=0; i<Length; i++ ) 65 { 66 glCallList(list + i); 67 } 68 glEnable(GL_LIGHTING); 69 //ディスプレイリスト破棄 70 glDeleteLists(list, Length); 71 list = 0; 72 Length = 0; 73} 74 75GLFONT *font; 76 77void display(void) 78{ 79 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 80 glColor4f(0.0f, 0.0f, 1.0f, 1.0f); 81 font->DrawStringW(10,120,L"こんにちは OpenGLの世界!!"); <-- 該当箇所 *1 82 glutSwapBuffers(); 83} 84void idle(void) 85{ 86 glutPostRedisplay(); 87} 88void Init(){ 89 glClearColor(1.0, 1.0, 1.0, 1.0); 90 glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); 91 font = new GLFONT(L"MS明朝", 24); <--該当箇所 *2 92} 93int main(int argc, char *argv[]) 94{ 95 glutInitWindowPosition(100, 100); 96 glutInitWindowSize(WIDTH, HEIGHT); 97 glutInit(&argc, argv); 98 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 99 glutCreateWindow("文字列を描画"); 100 glutDisplayFunc(display); 101 glutIdleFunc(idle); 102 Init(); 103 glutMainLoop(); 104 return 0; 105}

試したこと

VisualStudioのプロジェクトプロパティの「文字セット」を
Unicode文字セットを使用する→マルチバイト文字セットを使用する
に変更した。

補足情報(FW/ツールのバージョンなど)

VisualStudio2019

プログラミング初心者です。足りない情報など多いかと思いますので、他に必要な情報があれば追記致しますのでお知らせください。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

エラーメッセージのとおりです。wchar*の引数に文字列リテラル(constが付く)は渡せません。

void GLFONT::DrawStringW(int x,int y,wchar_t *format, ...)の内部でformatを変更しないのであれば、引数をconst wchar_t *formatに変えましょう。

投稿2021/04/23 02:54

maisumakun

総合スコア146018

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

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

THETA97556919

2021/04/23 03:07

おっしゃる通りで、うまく動きましたありがとうございました。 サイトを信じきっていました、、wchar*に文字列リテラルは渡せないのですね。勉強になりました。
guest

0

font->DrawStringW(10,120,L"こんにちは OpenGLの世界!!"); <-- 該当箇所 *1

font->DrawStringW(10,120,(wchar_t*)L"こんにちは OpenGLの世界!!"); <-- 該当箇所 *1

って、関数定義のところでconst つけてしまってもいいのでは

投稿2021/04/23 02:56

y_waiwai

総合スコア88042

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

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

THETA97556919

2021/04/23 03:08

おっしゃる通りで、うまく動きましたありがとうございました。 サイトを信じきっていました、、wchar*に文字列リテラルは渡せないのですね。勉強になりました。
guest

0

エラーメッセージのまんまじゃなイカ.

void GLFONT::DrawStringW(int x,int y,wchar_t *format, ...)

とか

GLFONT::GLFONT(wchar_t *fontname, int size)

の引数が whart_t* 型なのに,文字列リテラルをダイレクトに引数にして呼ぼうとしているからエラーになってるだけ.

そもそもこれらの引数を非constにする必要があるのだろうか?
(const whart_t* じゃダメなんですか?)

投稿2021/04/23 02:55

fana

総合スコア11996

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

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

THETA97556919

2021/04/23 03:08

おっしゃる通りで、うまく動きましたありがとうございました。 サイトを信じきっていました、、wchar*に文字列リテラルは渡せないのですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問