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();
}
No.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が書き換えられる。
# コール元は書き換わらない(コール元のポインタ変数のアドレスは知らないから)。
って事ではないですかね?
回答ありがとうございます。
回答をヒントにしてポインタ変数について調べ直し解決出来ました。
Nm内のNaを参照渡しの&Naにして正しく表示することができるようになりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#defineの使い方について
-
リモートデスクトップの接続元I...
-
openCVで動画が読み込めないエ...
-
iostream インクルード時に発生...
-
C++で縦の棒グラフ
-
std::map の const 修飾について
-
atlbase.h と afxwin.hの同時定義
-
wstringの内容を表示させたい
-
ヘッダーファイルがインクルー...
-
ファイル読み込みとmap処理
-
前回のクライアント側のプログ...
-
構文エラーが出ているのですが...
-
セグメンテーションフォルトが...
-
VC++ iostreamの不具合(?)
-
string型のフォーマット書式指...
-
テイラー展開とその精度について
-
コンパイルできません
-
C++ basic_ostreamの拡張
-
Cでのパケットキャプチャについて
-
mapの初期化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
空ENTERの判別
-
なぜ、C++の標準ヘッダをインク...
-
【C++】ヘッダ内でstringを格納...
-
C++での <iostream.h>と<iostre...
-
#include "fstream.h"
-
#define中の#のエスケープ
-
JPEGやPNGが読めるLoadImage関数
-
リモートデスクトップの接続元I...
-
CStringとString
-
string型のフォーマット書式指...
-
std::map の const 修飾について
-
VHDLのsignedとunsignedの違いは?
-
このプログラミング誰か教えて...
-
構造体配列のvectorへの変換と...
-
指定した文字を削除したい
-
構造体に決められた文字列を入...
おすすめ情報