2017-11-15 14 views
0

私は現在、プログラムが実行されているアセットフォルダへのパスを提供する "fromAssets"関数を作成しています。アセットパス:絶対値対生成

この関数は、次のコード部分に由来します。

ヘッダファイル:

#include <iostream> 
#include <boost/filesystem.hpp> 

namespace fs = boost::filesystem; 

namespace path { 
    static fs::path BUILD_PATH; 
    const void initialiseBuildPath(const char *argv); 
    const char * fromAssets(const char * path); 
} 

ソースファイル:

using namespace path; 

const void path::initialiseBuildPath(const char *argv0) { 
    BUILD_PATH = fs::initial_path<fs::path>(); 
    BUILD_PATH = fs::system_complete(fs::path(argv0)) 
          .parent_path() 
          .parent_path(); 
} 

const char * path::fromAssets(const char * path) { 
    std::string strPath = std::string(path); 
    return (BUILD_PATH.string() + "/assets/" + strPath).c_str(); 
} 

用途:

const char * absolute = "/Users/thomaspetillot/CLionProjects/glDiscoverProject/build/assets/shader/basic.vert.glsl"; 
const char * generated = path::fromAssets("shader/basic.vert.glsl"); 
cout << strcmp(absolute, generated) << endl; // show 0 



// Work 
auto * shader = new Shader(absolute, 
          path::fromAssets("shader/basic.frag.glsl")); 

// Doesn't work 
auto * shader = new Shader(generated, 
          path::fromAssets("shader/basic.frag.glsl")); 

フォルダ構造:

build 
├── assets 
│   ├── img 
│   │   ├── pepe.jpg 
│   │   └── snoop.jpg 
│   └── shader 
│    ├── basic.frag.glsl 
│    └── basic.vert.glsl 
└── bin 
    └── program 

どのようにフラグ・シェーダのためではなく、他のために働くことができますか?

+0

私たちはどのように知っていますか? 'path :: fromAssets(" shader/basic.vert.glsl ")の結果とはどのようなものですか?/Users/a/b/c/build/assets/shader/basic.vert.glslとはどう違うのですか? 「? – BDL

+0

彼らは違いはありません、strcmpは0を返します - それは謎がどこから来るかです。 – Pixeuh

+0

ああ、問題を見つけました。 – BDL

答えて

1

fromAssetsメソッドは、無効なメモリアドレスへのポインタを返します。これは、関数のローカル変数であるstd :: stringオブジェクトのc_str()ポインタを返すために発生します。関数が戻ると、std :: stringを含むすべてのローカル変数が削除され、返されたポインタはもはや既存のメモリアドレスを指していません。

最高の(そして最も現代的な)修正プログラムは、const char *ポインタの代わりにstd :: stringオブジェクト自体を返すことです。 c_strポインターをShaderコンストラクターに渡すか、より良いコンストラクターを調整してconst std::string&をパラメーターとして使用することはできません。

+0

完璧に動作します、ありがとう! – Pixeuh