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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

958閲覧

std::copyでエラー

nakaT

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/06/22 09:26

実現したいこと

DirectX12の頂点バッファに可変長配列データをコピーしたい

前提

VisualStadio2022
C++でDirectX12のサンプルコードを試しています

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

C++ オーバーロードされた関数 のインスタンスが引数リストと一致しません
引数の型: (DXApplication::Vertex *)

該当のソースコード

   struct Vertex
{
DirectX::XMFLOAT3 pos;
DirectX::XMFLOAT2 uv;
};

     //頂点の数はその都度変わるのでvectorを使用して頂点バッファにコピー

     std::vector<Vertex>Myvertices{};

Vertex v; // 前面 v = { { -1.0, -1.0, 1.0}, { 1.0f, 1.0f } }; Myvertices.push_back(v); v = { { 1.0, -1.0, 1.0}, { 0.0f, 1.0f } }; Myvertices.push_back(v); v = { { 1.0, 1.0, 1.0}, { 0.0f, 0.0f } }; Myvertices.push_back(v); v = { { -1.0, 1.0, 1.0}, { 1.0f, 0.0f } }; Myvertices.push_back(v); // 背面 v = {{ -1.0, -1.0, -1.0,}, { 1.0f, 1.0f }}; Myvertices.push_back(v); v = {{ -1.0, 1.0, -1.0,}, { 0.0f, 1.0f }}; Myvertices.push_back(v); v = {{ 1.0, 1.0, -1.0,}, { 0.0f, 0.0f }}; Myvertices.push_back(v); v = {{ 1.0, -1.0, -1.0,}, { 1.0f, 0.0f }}; Myvertices.push_back(v); // 上面 v = {{ -1.0, 1.0, -1.0}, { 1.0f, 1.0f }} ; Myvertices.push_back(v); v = {{ -1.0, 1.0, 1.0}, { 0.0f, 1.0f }}; Myvertices.push_back(v); v = {{ 1.0, 1.0, 1.0}, { 0.0f, 0.0f }} ; Myvertices.push_back(v); v = {{ 1.0, 1.0, -1.0}, { 1.0f, 0.0f }} ; Myvertices.push_back(v); // // 底面 v = {{ -1.0, -1.0, -1.0}, { 1.0f, 1.0f }} ; Myvertices.push_back(v); v = {{ 1.0, -1.0, -1.0}, { 0.0f, 1.0f }} ; Myvertices.push_back(v); v = {{ 1.0, -1.0, 1.0}, { 0.0f, 0.0f }} ; Myvertices.push_back(v); v = {{ -1.0, -1.0, 1.0}, { 1.0f, 0.0f }} ; Myvertices.push_back(v); // 右側面 v = {{ 1.0, -1.0, -1.0}, { 1.0f, 1.0f }} ; Myvertices.push_back(v); v = {{ 1.0, 1.0, -1.0}, { 0.0f, 1.0f }} ; Myvertices.push_back(v); v = {{ 1.0, 1.0, 1.0}, { 0.0f, 0.0f }} ; Myvertices.push_back(v); v = {{ 1.0, -1.0, 1.0}, { 1.0f, 0.0f }} ; Myvertices.push_back(v); // // 左側面 v = {{ -1.0, -1.0, -1.0}, { 1.0f, 1.0f }} ; Myvertices.push_back(v); v = {{ -1.0, -1.0, 1.0}, { 0.0f, 1.0f }} ; Myvertices.push_back(v); v = {{ -1.0, 1.0, 1.0}, { 0.0f, 0.0f }} ; Myvertices.push_back(v); v = {{ -1.0, 1.0, -1.0}, { 1.0f, 0.0f }} ; Myvertices.push_back(v);

     //MyverticesのVertexをverticesにコピー
Vertex* vertices= nullptr;

vertices = (Vertex*)malloc(sizeof(Vertex) * Myvertices.size()); int MyCount = Myvertices.size(); //ループでコピー for (int i=0; i < MyCount; i++) { vertices[i] = Myvertices[i]; } //省略 Vertex* vertexMap = nullptr; ThrowIfFailed(vertexBuffer_->Map(0, nullptr, (void**)&vertexMap)); std::copy(std::begin(vertices), std::end(vertices), vertexMap); !!!ここでエラ-!!!! エラ-メッセージ C++ オーバーロードされた関数 のインスタンスが引数リストと一致しません 引数の型: (DXApplication::Vertex *)

試したこと

固定長配列では成功し、表示されます。
座標点を動的に増減し表示しようと上記vectorにしたのですが

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

visualstudio2022 C++

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

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

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

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

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

guest

回答3

0

ベストアンサー

式中に配列が現れた場合にはその配列の先頭要素を指すポインタに型変換されます。 変換後のポインタはポインタの先頭要素を指しているだけで配列全体の情報を失ってしまうので終端位置はわからなくなります。

しかしこの暗黙の変換には例外があります。 配列の参照の初期化子である場合はそのひとつです。 std::beginstd::end は参照として配列を受け取ることでポインタに変換される前の配列として受け取る仕組みになっています。

https://timsong-cpp.github.io/cppwp/n3337/iterator.range

なので固定長の配列である場合はその型から配列の大きさを知り、大きさがわかるということは終端位置もわかるということです。


固定長の配列ではない場合はにプログラマはメモリを確保したときに確保した大きさを記録しておき、必要に応じて与える形にしなければなりません。 結論としてはこうです。

cpp

1std::copy(vertices, vertices+MyCount, vertexMap);

配列に対してポインタはイテレータとしての性質を満たすのでこの場合は std::beginstd::end を使わずともポインタ自体をイテレータとして渡してかまいません。

投稿2023/06/22 10:56

SaitoAtsushi

総合スコア5714

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

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

nakaT

2023/06/22 22:15

表示されるようになりました。 添削コードも表示していただき、ありがとうございます。
guest

0

この回答はGPT-4による自動生成回答です

エラーが発生している箇所は、std::copyの部分です。std::end(vertices)が問題を引き起こしています。verticesはポインタであり、std::endはコンテナに対して使用する関数です。std::vectorの場合は問題ありませんが、ポインタに対しては使用できません。

解決策として、std::copyの第2引数をvertices + MyCountに変更してください。これにより、ポインタの範囲を正しく指定できます。

cpp

1std::copy(std::begin(vertices), vertices + MyCount, vertexMap);

また、verticesmallocで確保していますが、C++ではnewを使用することが推奨されます。mallocはC言語で使用されるメモリ確保関数で、C++ではnewが型情報を持っているため、より安全にメモリ確保ができます。

cpp

1Vertex* vertices = new Vertex[Myvertices.size()];

そして、メモリ解放時にはdelete[]を使用してください。

cpp

1delete[] vertices;

投稿2023/06/22 09:27

teratail-ai

Powered by GPT-4

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

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

0

std::copy(std::begin(vertices), std::end(vertices), vertexMap);

strd::end(vertices) が使えるのは vertices が固定長配列(Vertex vertices[N])のとき。
なので std::copy(vertices, vertices+Myvertices.size(), vertexMap); が正解。

投稿2023/06/22 14:38

episteme

総合スコア16612

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

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

nakaT

2023/06/22 22:16

表示されるようになりました。 添削コードも表示していただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問