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

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

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

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

Q&A

解決済

2回答

650閲覧

vectorを配列を参照で渡したい。メンバ関数はなのか?.begin()?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/05/31 10:29

ソースファイル部の DrawPolygonIndexed3D(&v[0], 4, Ground_Index, 2, groundHandle, false) コードの
&v[0]ですがVERTEX3D *Vertex型を渡す必要があるようなのですがどうすればいいのでしょうか?&v[0]としてコンパイルエラーを抜けることができましたがこのやり方は正しいのでしょうか?またメンバ関数などあるのでしょうか?(リファレンスを見ましたが.begin()ではエラーになります。)

公式リファレンス: https://dxlib.xsrv.jp/function/dxfunc_3d_draw.html#R14N8

///////////////ヘッダーファイル //VERTEX3D v[4]; vector<VERTEX3D> v; //std::vector<int> data(123); ///////////////////////// /////ソースファイル void Game::DrawUpdate() { // DrawFormatString(0, 32 * 3, GetColor(255, 255, 255), "chqnge();"); SetCameraPositionAndTarget_UpVecY(VGet(cameraPos.x, cameraPos.y, cameraPos.z), VGet(targetV.x, targetV.y, targetV.z)); if(animTime >= 960) { animTime = 0; } /*アニメ描画時間を設定*/ if(MV1SetAttachAnimTime(modelHandle,0,animTime) == -1) { ofs<<"アニメーション時間設定エラー"<<std::endl; exit(1); } /*モデル表示*/ if (MV1DrawModel(modelHandle) == -1) { exit(1); } if (MV1SetPosition(modelHandle, model_pos) == -1) { exit(1); }//座標 if (MV1SetRotationXYZ(modelHandle,model_rotate) == -1 ){ exit(1); }//回転 /*地面ポリゴン描画*/ //if (DrawPolygonIndexed3D(v, 4, Ground_Index, 2, handle, false) == -1) { ofs << "地面描画エラー" << std::endl; exit(1); } if (DrawPolygonIndexed3D(&v[0], 4, Ground_Index, 2, groundHandle, false) == -1) { ofs << "地面描画エラー" << std::endl; exit(1); } //if(DrawPolygonIndexed3D(v,4,Ground_Index,2,DX_NONE_GRAPH,false) == -1){ ofs << "地面描画エラー" <<std::endl; exit(1); } //if (DrawPolygon3D(v, 1, handle, false) == -1) { exit(1); } // if(DrawPolygon3D(v,1,DX_NONE_GRAPH,false) == -1){ exit(1); } /*ライト*/ //LetLightEnableHandle(LightHandle,true); Debug_Draw(); } ////////////////////////

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

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

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

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

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

guest

回答2

0

&v[0] でもいいけど、v.data() でもいいはずです。

投稿2020/05/31 11:35

kazuma-s

総合スコア8224

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

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

0

ベストアンサー

vector<VERTEX3D> v;が空でないのなら&v[0]でよいです。

std::vector::operator[]は要素への参照を返します。vectorの要素はメモリ上で連続していることが保証されているため、&v[0]で取得した先頭要素のアドレスから要素数分連続して格納されています。


.begin()ではエラーになります

std::vector::beginが返すのは先頭要素のポインタではなくイテレータです。
begin()でやりたいなら、&*v.begin()
*をつけて先頭要素の参照を取得し、さらに&をつけてアドレスを取得。


&v.front()v.data()でもよいです。

投稿2020/05/31 10:49

編集2020/05/31 11:46
SHOMI

総合スコア4079

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

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

退会済みユーザー

退会済みユーザー

2020/06/01 04:15

質問ですが「0」と配列をしているとマジックナンバーがでてしまいますがこれどうすればいいのでしょうか?#defineを用意すべきですがその場合何という名前が最適なのでしょうか?
SHOMI

2020/06/01 04:24

誰が見ても意味が明確で、後から変更が生じることもあり得ないものはマジックナンバーではありません。配列先頭要素を示す0をdefineする方が意味がわからなくなると思いませんか?
退会済みユーザー

退会済みユーザー

2020/06/01 09:59

なるほど。要素数の設定ですが.resize();でいいのでしょうか?https://cpprefjp.github.io/reference/vector/vector/resize.html 公式リファレンスですが要素数を変更とありますが初期化?決める時はどうすればいいのでしょうか?ヘッダーファイルとソースファイルを分けているのでヘッダーファイルではv(3);とは書けないのでソース部でv.resize();しています。
SHOMI

2020/06/01 16:54

要素数変更はresize();でよいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問