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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

C++

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

Q&A

解決済

1回答

3355閲覧

スマートポインタをキャストすると例外エラーが出る原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

C++

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

0グッド

0クリップ

投稿2021/06/29 10:58

編集2021/06/29 12:01

提示コードの三つ目のコードですがコメント部のコードで提示画像のアクセスエラーが発生します。

(unsigned char*)*textureID.back().fileData);

部が原因なのですが(const void *)型としてstd::shared_ptrFrameWork::TextureDataのstd::shared_ptr<unsigned char>型を渡すにはどうすればいいのでしょうか?

イメージ説明

cpp

1#include "Texture.hpp" 2 3#define STB_IMAGE_IMPLEMENTATION 4#include "stb/stb_image.h" 5 6// ##################################### 画像読み込み ##################################### 7std::shared_ptr<FrameWork::TextureData> FrameWork::LoadTexture(const char* fileName) 8{ 9 //std::shared_ptr<FrameWork::TextureData> data = std::make_shared<FrameWork::TextureData>(); 10 TextureData data;// = std::make_shared<FrameWork::TextureData>(); 11 data.fileData = NULL; 12 //data.fileData = std::make_shared<unsigned char*>(stbi_load(fileName, &data.size.x, &data.size.y, &data.channel, 0)); //画像読み込み 13 data.fileData = std::shared_ptr<unsigned char>(stbi_load(fileName, &data.size.x, &data.size.y, &data.channel, 0), stbi_image_free); 14 assert(data.fileData && "画像ファイルがありません。"); 15 16 return std::make_shared<FrameWork::TextureData>(data); 17} 18

cpp

1#ifndef ___TEXTURE_HPP_ 2#define ___TEXTURE_HPP_ 3#include <iostream> 4#include "glm/glm.hpp" 5#include "glew/include/GL/glew.h" 6 7/*######################################################################### 8# テクスチャ構造体 9 10説明 11 テクスチャのデータ 12###########################################################################*/ 13namespace FrameWork 14{ 15 //テクスチャデータ構造体 16 typedef struct 17 { 18 glm::ivec2 size; //画像サイズ 19 std::shared_ptr<unsigned char> fileData; //画像データ 20 int channel; //画像のチャンネル数 21 GLuint ID; //テクスチャID 22 GLuint textureUnitNumber; //テクスチャユニット番号 23 }TextureData; 24 25 std::shared_ptr<FrameWork::TextureData> LoadTexture(const char* fileName); //テクスチャーロード 26} 27#endif

cpp

1 2// ##################################### テクスチャを設定 ##################################### 3void FrameWork::Sprite::setTexture(std::shared_ptr<TextureData> tex) 4{ 5 textureID.push_back(*tex); //テクスチャーIDに追加 6 glGenTextures(1, &textureID.back().ID); //テクスチャIDの生成 7 8 //バインド 9 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 10 glBindTexture(GL_TEXTURE_2D, textureID.back().ID); 11//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 12 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureID.back().size.x, textureID.back().size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, (unsigned char*)*textureID.back().fileData); 13//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 14 // テクスチャの補間設定 15 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 16 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 17 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 18 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 19 20 textureID.back().textureUnitNumber = GL_TEXTURE0 + (int)textureUnitCount; 21 22 //テクスチャユニットを設定できない場合はエラー 23 assert(textureID.back().textureUnitNumber < GL_TEXTURE31); 24 25 textureUnitCount++; //テクスチャーユニットカウントに加算 26}

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

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

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

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

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

guest

回答1

0

ベストアンサー

std::shared_ptr を生ポインタにキャストすると reinterpret_cast 相当のキャストが起きる、つまり名目上だけ型を変更されるのであって、生ポインタを取り出せるわけではないです。 型変換に static_cast を使っていれば出来ない変換であることがコンパイル時にわかったはずなので、キャストは C++ スタイルの文法をきちんと理解して使い分けることを勧めます。

スマートポインタ同士の代入であれば所有権の伝播が (基本的には) 上手くおこなわれますが、同じ生ポインタを別々のスマートポインタに入れると破綻します。 よってそういうことが起きないようにスマートポインタは可能な限りスマートポインタとして操作し、生ポインタを取り出すのはそれが本当に必要になる箇所の直前、かつ明示的であることが好ましいという考え方から型変換演算子 (キャストオペレータ) は定義されていません。

メンバ関数 get で取り出せるようになっています。

投稿2021/06/29 12:36

SaitoAtsushi

総合スコア5684

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問