1

私は C++/SDL で PONG クローンを作成しており、プログラムが開始するディレクトリにすべてのイメージがあります。GetCurrentDirectory() を使用してそのパスを見つけることができ、strcat() を使用してファイルを開いて実際の画像を追加すると、正常に読み込まれますが、元の値が変更されるため、次を読み込もうとすると役に立たなくなります。画像。元の値を変更せずにパスを渡す方法、またはこの問題を回避する別の方法を教えてください。

私の現在のコード:

    TCHAR openingdirectorytemp [MAX_PATH];
    bgtexturesurf = SDL_LoadBMP(strcat(openingdirectorytemp, "\\bg.bmp"));
4

4 に答える 4

1

実際の C++ 文字列を使用します。

#include <string>

using std::string;

void child(const string str)
{
  str += ".suffix"; // parameter str is a copy of argument
}

void parent()
{
   string parents_string = "abc";
   child(parents_string);
   // parents_string is not modified
}

TCHARWindows API の世界で作業する必要がある場合は、次を使用しstd::basic_string<TCHAR>ます。

typedef std::basic_string<TCHAR> str_t; // now use str_t everywhere

したがって、コードは次のようになります

void my_class::load_bg_bmp(const str_t &dir_path)
{
  str_t file_path = dir_path + _T("\\bg.bmp")l
  bgtexturesurf = SDL_LoadBMP(file_path.c_str()));
  // ...
}

このTCHARタイプにより、ビルド時間に幅の狭い文字と幅の広い文字を切り替えることができます。を使用しても意味がありませんが、 のようなラップされTCHARていない狭い文字列リテラルを使用して"\\bg.tmp"ください。

strcatまた、初期化されていない配列に対しては、未定義の動作が呼び出されることに注意してください。の最初の引数strcatは文字列でなければなりません: null で終了する文字配列の最初の要素へのポインター。初期化されていない配列は文字列ではありません。

C++ 文字列クラスを使用することで、このような低レベルの問題を回避できます。

于 2013-10-09T01:41:01.390 に答える
0

C++ を使用すると、string を使用して最終的なパス名を作成できます。

string pathname(path);
pathname += "\\bg.bmp";

bgtexturesurf = SDL_LoadBMP(pathname.c_str());
于 2013-10-09T01:44:28.770 に答える
0

他の回答で示唆されているように C++ 文字列を使用できますが、C アプローチを維持することもできます。

元の内容をコピーして別の文字列を作成し、それを strcat に使用するだけです。

TCHAR openingdirectorytemp [MAX_PATH];
TCHAR path [MAX_PATH];
strcpy(path, openingdirectorytemp);
bgtexturesurf = SDL_LoadBMP(strcat(path, "\\bg.bmp"));

そうすることpathで、別のメモリ空間で文字列を作成するため、strcat は影響しませんopeningdirectorytemp

于 2013-10-09T01:38:32.613 に答える
0

変更が心配な場合は、連結する前に文字列のコピーを作成する必要があります。言い換えると

string1 = "abc"
string2 = "def"
strcat(string1, string2);

結果は

string1 = "abcdef"

それはあなたがプログラムに頼んだことだからです。代わりに、追加

strcpy(string3, string1)
strcat(string3, string2);

今、あなたは持っているでしょう

string1 = "abc" 
string3 = "abcdef"

もちろん、十分なスペースが割り当てられていることなどを確認する必要があります。

于 2013-10-09T01:39:24.037 に答える