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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

Q&A

解決済

3回答

568閲覧

C++におけるエラー"char *" の引数は型 "GLint" のパラメーターと互換性がありません

muton

総合スコア31

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

0グッド

1クリップ

投稿2019/05/23 07:14

編集2019/05/29 08:20

オープンソースコードのカーシュミレーションソフトにおいて指定した座標位置において点をシミュレーション画面上に表示したいと考えています。
そこで、OpenGLコマンドを用いて、描画したいと考えているのですが、glDrawArrays(GL_TRIANGLES, car->ctrl.ary[0], car->ctrl.ary[1]);
の部分で、
「E0167 型 "char *" の引数は型 "GLint" のパラメーターと互換性がありません」
というエラーが生じてしまいます。
どのような対策が考えられますか?
アドバイス頂けると嬉しいです。

使用環境はwindows8.1/visual studio2017/C++です。

###対象とするコード

C++

1typedef struct { 2char yy[256]; 3char *ary[2]; 4} tCarCtrl; 5 6void grDrawCar(tCarElt *car, tCarElt *curCar, int dispCarFlag, int dispDrvFlag, double curTime, class cGrPerspCamera *curCam) 7{ 8if (car->ctrl.ary, car->ctrl.yy) 9{ 10FILE *file1; 11 file1 = fopen("output.csv", "r"); 12 /*ファイルの終わりまで繰り返し読み込む*/ 13 while (fgets(car->ctrl.yy, 256, file1) != NULL) 14 { 15 car->ctrl.ary[0] = strtok(car->ctrl.yy, ","); 16 car->ctrl.ary[1] = strtok(NULL, ","); 17 } 18 fclose(file1); 19 20glDrawArrays(GL_TRIANGLES, car->ctrl.ary[0], car->ctrl.ary[1]); 21} 22}

やってみたこと

typedef struct { char yy[256]; char ary[2]; } tCarCtrl; と変更すると、car->ctrl.ary[0] = strtok(car->ctrl.yy, ","); car->ctrl.ary[1] = strtok(NULL, ","); の部分で以下のエラーが発生してしまいます。 エラー (アクティブ) E0513 型 "char *" の値を型 "char" のエンティティに割り当てることはできません

現状

背景に赤い点が描画されている
イメージ説明

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

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

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

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

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

guest

回答3

0

見た感じそもそもOpenGLの描画方法がまだ理解できていないように見えます。

カーシミュレーターやファイルの読み込みを抜きにして、一度三角形を描画するだけのプログラムを組んで、感覚を掴んでみてはいかがでしょうか。

参考:
チュートリアル2:最初の三角形

投稿2019/05/23 07:26

takabosoft

総合スコア8356

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

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

muton

2019/05/23 10:36

回答ありがとうございます。 勉強不足で申し訳ございません。 教えていただいたurlを基に勉強してみます、ありがとうございます。
takabosoft

2019/05/24 01:02

今回の問題の本質は「型が違うこと」ではありません。「OpenGL関数の使い方が全く違うこと」に起因していますので、その点を履き違えないようにしてくださいね。
muton

2019/05/29 08:18

追記 OpenGLについて勉強し、以下のコードを書くことで、点を確認することができました。 しかし、質問欄に追記した通り、その点はコース上ではなく、背景の位置に描画されているようです。コース上に描画するためにはどうすれば良いか分からず困っています。 アドバイスを頂けると嬉しいです。 if(/*car->myCoordsVector*/true) { glPushAttrib(GL_ALL_ATTRIB_BITS); glPushMatrix(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(curCam->getFovY(), 2, .005, 100000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); t3Dd *pos = curCam->getPos(); t3Dd *center = curCam->getCenter(); t3Dd *upv = curCam->getUp(); gluLookAt(pos->x, pos->y, pos->z, center->x, center->y, center->z, upv->x, upv->y, upv->z); glColor3d(1.0, 0.0, 0.0); glPointSize(60); glBegin(GL_POINTS); glVertex3d(74, 171, 100); glEnd(); glPopMatrix(); glPopAttrib(); }
takabosoft

2019/05/29 08:48

最初の質問とほとんど関連性が無いので、新規に質問を立ててください。
muton

2019/05/29 09:24

回答ありがとうございます。 新しく質問を立てました。 アドバイスを頂けると嬉しいです。
guest

0

ベストアンサー

「E0167 型 "char *" の引数は型 "GLint" のパラメーターと互換性がありません」

メッセージそのまんまでしょ。
「char*を貰ったけどさ、それGLintに(暗黙)変換できないんだよねー」て言うてます。

glDrawArrays(GL_TRIANGLES, atoi(car->ctrl.ary[0]), atoi(car->ctrl.ary[1]));
だとどうなります?

投稿2019/05/23 10:12

episteme

総合スコア16614

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

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

muton

2019/05/23 10:34

回答ありがとうございます。 glDrawArrays(GL_TRIANGLES, atoi(car->ctrl.ary[0]), atoi(car->ctrl.ary[1])); と変更することで、ビルドの際のエラーは発生しなくなりました。 しかし、カーシュミレーション上でレース開始時に動作が停止してしまいます。 デバックを行うと for (i = 0; i < s->_ncars; i++) { grDrawCar(cars[i], curCar, dispCam->getDrawCurrent(), dispCam->getDrawDriver(), s->currentTime, dispCam); } の部分でハンドルされない例外が発生しているとのエラーが発生します。 どのような問題が考えられますでしょうか、宜しくお願い致します。
episteme

2019/05/23 11:44 編集

ary[0], ary[1] にはナニが入ってます? それは gcDrawArraysの引数にふさわしいものですか? ary[0], ary[1] に入ってるのが座標だとしたら、とんでもないマチガイだね。
muton

2019/05/23 16:10

回答ありがとうございます。 お恥ずかしい話、ary[0],ary[1]に入ってるのは車のx位置座標、y位置座標になります。 勉強不足で申し訳ございません。openGLについて、勉強に励みます。 本来どのようなものを入れなくてはならないのでしょうか?
episteme

2019/05/23 16:55

検索すればわかる。
muton

2019/05/29 08:18

追記 OpenGLについて勉強し、以下のコードを書くことで、点を確認することができました。 しかし、質問欄に追記した通り、その点はコース上ではなく、背景の位置に描画されているようです。コース上に描画するためにはどうすれば良いか分からず困っています。 アドバイスを頂けると嬉しいです。 if(/*car->myCoordsVector*/true) { glPushAttrib(GL_ALL_ATTRIB_BITS); glPushMatrix(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(curCam->getFovY(), 2, .005, 100000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); t3Dd *pos = curCam->getPos(); t3Dd *center = curCam->getCenter(); t3Dd *upv = curCam->getUp(); gluLookAt(pos->x, pos->y, pos->z, center->x, center->y, center->z, upv->x, upv->y, upv->z); glColor3d(1.0, 0.0, 0.0); glPointSize(60); glBegin(GL_POINTS); glVertex3d(74, 171, 100); glEnd(); glPopMatrix(); glPopAttrib(); }
guest

0

コードを見る限り car->ctrl.ary[0], car->ctrl.ary[1] は','で分割した文字列(のポインタ)です。
"output.csv"の中身が座標なのかもしれませんが、文字列としての座標でしょう。

atoi,atof関数などで数値にしないと、OpenGLの描画では使用できないのではないでしょうか。

投稿2019/05/23 10:00

ds-kawasaki

総合スコア35

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

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

muton

2019/05/23 10:37

回答ありがとうございます。 仰る通りで、文字列として"output.csv"の中身(座標)を定義していました。 そこでatoi関数を用いる事でエラーが発生しなくなりました。 しかししかし、カーシュミレーション上でレース開始時に動作が停止してしまいます。 デバックを行うと for (i = 0; i < s->_ncars; i++) { grDrawCar(cars[i], curCar, dispCam->getDrawCurrent(), dispCam->getDrawDriver(), s->currentTime, dispCam); } の部分でハンドルされない例外が発生しているとのエラーが発生します。 どのような問題が考えられますでしょうか、宜しくお願い致します。
muton

2019/05/29 08:18

追記 OpenGLについて勉強し、以下のコードを書くことで、点を確認することができました。 しかし、質問欄に追記した通り、その点はコース上ではなく、背景の位置に描画されているようです。コース上に描画するためにはどうすれば良いか分からず困っています。 アドバイスを頂けると嬉しいです。 if(/*car->myCoordsVector*/true) { glPushAttrib(GL_ALL_ATTRIB_BITS); glPushMatrix(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(curCam->getFovY(), 2, .005, 100000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); t3Dd *pos = curCam->getPos(); t3Dd *center = curCam->getCenter(); t3Dd *upv = curCam->getUp(); gluLookAt(pos->x, pos->y, pos->z, center->x, center->y, center->z, upv->x, upv->y, upv->z); glColor3d(1.0, 0.0, 0.0); glPointSize(60); glBegin(GL_POINTS); glVertex3d(74, 171, 100); glEnd(); glPopMatrix(); glPopAttrib(); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問