アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++、DXLibでゲームを作っています。
vector<string>型の変数Name,Textにtxtファイルから読み込んだテキストを代入した後、
const char*型の変数Nなどに代入して画面に表示するプログラムにしたいのですが、
Nなどに正しいデータが代入されておらず、int型の0が代わりに入っているようです。
(%dで画面に表示して確認しました。)
特にエラーメッセージ等は表示されずどこでミスが起きているのか分からない状態ですが、
LS::LSあたりで処理を間違っているのでしょうか。
確認、添削をしていただけますか。

下に該当する部分のプログラム文を載せました。
必要な宣言はヘッダファイル内でしているはずです。

const char* GS::parameterTChapter = "parameterTChapter";
const char* N;
const char* L1;
const char* L2;
const char* L3;
int SN = 0;
int BGM = 0;
int BG = 0;
int EV = 0;
std::vector<std::string> Name(1000,"\0") ;
std::vector<std::string> Text(1000,"\0");
GS::GS(IOSCL* impl, const parameter& parameter) : AS(impl, parameter) {
_chapter = parameter.get(parameterTChapter);
if (_chapter < 10) {

}
else{

}
FILE *fp;
int ngsv;
errno_t error = fopen_s(&fp, "msv.sav", "r+b");
fread(&ngsv, sizeof(int), 1, fp);
if (ngsv < _chapter) {
ngsv = _chapter;
fwrite(&ngsv, sizeof(int), 1, fp);
}
fclose(fp);
LS::LS(_chapter);
}
void GS::update() {
if (Keyboard::getIns()->getPressingCount(KEY_INPUT_Z) == 1) {
LS::Nm(N, SN);
SN++;
}
if (Keyboard::getIns()->getPressingCount(KEY_INPUT_X) == 1) {

}
if (Keyboard::getIns()->getPressingCount(KEY_INPUT_ESCAPE) == 1) {

}
}
void GS::draw() const {
DrawFormatString(100, 100, GetColor(255, 255, 255), "Stage %d", _chapter);
DrawFormatString(50, 350, GetColor(255, 255, 255), "%s", N);
DrawFormatString(100, 380, GetColor(255, 255, 255), "%s", L1);
DrawFormatString(100, 410, GetColor(255, 255, 255), "%s", L2);
DrawFormatString(100, 440, GetColor(255, 255, 255), "%s", L3);
}
LS::LS(int Stage) {
int Count = 0;
int SerifNo = -1;
int LineMax = 0;
static std::vector<int> LineNo(1000);
sprintf_s(Filename, 64, "./resource/story/stage%d.txt", Stage);
if (FileRead_open(Filename)) {
FileHandle = FileRead_open(Filename);
while (FileRead_eof(FileHandle) == 0) {
FileRead_gets(TmpBuf, LoadTextLen, FileHandle);
if (TmpBuf[0] == '\0')continue;
TmpText = TmpBuf;
if (TmpText[0] == NULL) continue;
LS::CS(TmpText);
if (TmpText[0] == '\0') continue;
SplitTextArray = LS::SS(TmpText, ':');
Name[Count] = SplitTextArray[NAME];
Text[Count] = SplitTextArray[TEXT];
if (Text[Count] == "\0") {
Text[Count] = Name[Count];
Name[Count] = "続き";
LineNo[SerifNo]++;
}
else {
SerifNo++;
LineNo[SerifNo] = 1;
}
LineMax++;
Count++;
}
Count = 0;
SerifNo = 0;
}
else{
err("ファイルが見つかりません");
}
}
std::vector<std::string>LS::SS(const std::string &Str, char Sep) {
std::vector<std::string> V;
std::stringstream Ss(Str);
std::string Buffer;
const std::string EndOfText = "\0";
while (std::getline(Ss, Buffer, Sep))V.push_back(Buffer);
V.push_back(EndOfText);
return V;
}
int LS::CS(std::string &TmpText) {
unsigned int i = 0;
char TmpStr[3];
const int BigSpaceSize = 2;
if (TmpText.length() >= BigSpaceSize) {
do {
if (TmpText.length() <= i) {
TmpText[0] = '\0';
return 0;
}
TmpStr[0] = TmpText[i];
TmpStr[1] = TmpText[i + 1];
TmpStr[2] = '\0';
i += 2;
} while (strcmp(TmpStr, " ") == 0);
TmpText = &TmpText[i - 2];
}
i = 0;
while (TmpText[i] == ' ') {
i++;
if (TmpText.length() <= i) {
TmpText[0] = '\0';
return 0;
}
}
TmpText = &TmpText[i];
}
void LS::Nm(const char* Na, int N) {
Na = Name[N].c_str();
}
void LS::Txt(const char* Te, int N) {
Te = Text[N].c_str();
}

A 回答 (1件)

constポインタは…ちょっとハマる部分もあるので注意が必要かも知れませんが……



>const char* N;
で、ポインタ変数を定義。(グローバル変数なら全Bit0…かな?)

>LS::Nm(N, SN);
で、ポインタ変数が「指しているアドレス」を第1引数として渡す。

>void LS::Nm(const char* Na, int N) {
で、ローカル変数のNaにアドレスが渡されるが、
>Na = Name[N].c_str();
により、「ローカル変数の」Naが書き換えられる。
# コール元は書き換わらない(コール元のポインタ変数のアドレスは知らないから)。

って事ではないですかね?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
回答をヒントにしてポインタ変数について調べ直し解決出来ました。
Nm内のNaを参照渡しの&Naにして正しく表示することができるようになりました。

お礼日時:2018/12/05 19:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!