Я пытаюсь читать данные в char * со следующим кодом:
void MyGameMain::MakeNewTileMap() {
char* data[] = { GetLevelFromFile() };
//failing at x = 0 y = 4
// Set up the tiles
for (int x = 0; x < 24; x++) {
for (int y = 0; y < 26; y++) {
m_oTiles.SetValue(x, y, data[y][x] - 'a');
}
}
//display level in prompt
for (int y = 0; y < 26; y++) {
for (int x = 0; x < 24; x++)
printf("%d ", m_oTiles.GetValue(x, y));
printf("\n");
}
}
Функция GetLevelFromFile() выглядит следующим образом:
char* MyGameMain::GetLevelFromFile() {
return
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaabbbbbbbbbbbbaaaaaa",
"aaaaaaeeeeeeeeeeeeaaaaaa",
"aaaaaabbbbbbbbebbbaaaaaa",
"aaadddbbbbbbbbbbbbcccaaa",
"aaadddbbbbbbbbbbbbcccaaa",
"aaaaaabbbebbbbbbbbaaaaaa",
"aaaaaabbbbbbbbbbbbaaaaaa",
"aaaaaabbbbbbbbbbbbaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa";
}
Когда я запускаю этот код, я получаю сообщение об ошибке, которое по сути означает, что я пытаюсь читать данные, которые не существуют, в точке второго для первого вложенного цикла, когда x = 0
и y = 4
.
Может ли кто-нибудь объяснить, почему это происходит, в чем проблема?
В конечном итоге план должен иметь GetLevelFromFile()
для чтения в строке из файла, чтобы я мог хранить данные уровня в отдельных файлах.
Спасибо за вашу помощь!
То, что вы возвращаете, на самом деле является одной строкой: оператор запятой в этом случае просто возвращает последний элемент "aaaaaa...". Чтобы достичь того, что вы хотите (массив строк), вы должны по крайней мере поместить завитки вокруг вашего массива. (Я предполагаю, что этот метод является фиктивным методом, так как возвращение жестко заданных массивов строк таким образом может быть сомнительной идеей :))
char** MyGameMain::GetLevelFromFile() {
return {
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
....
"aaaaaaaaaaaaaaaaaaaaaaaa"
};
}
UPDATE: и возвращаемый тип должен быть указателем-на-chararray (или указателем-на-pointer-to-char), чтобы char* data[]
принимал его правильно.
LATER UPDATE: на самом деле я предпочел бы иметь фиктивный массив как статический член класса (помечен как const, если он должен быть замороженным значением):
class MyGameMain {
public:
void MakeNewTileMap();
const char** GetLevelFromFile() const;
static const char* level[];
};
const char* MyGameMain::level[] = {
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa"
};
const char** MyGameMain::GetLevelFromFile() const {
return level;
}
void MyGameMain::MakeNewTileMap() {
const char** data = GetLevelFromFile();
...
Проблема заключается в том, что ваше объявление "string","string","string",etc
НЕ объявляет массив char *
. Вы используете оператор запятой, означающий, что возвращаемая строка на самом деле будет LAST-строкой "AAAA... AA", длина которой составляет всего 26 байтов, поэтому вы перестанете ссылаться на память за пределами границ. Удалите запятую, и она должна работать так, как вы хотите, потому что все строки строк будут объединены в 1 длинную строку препроцессором.
typedef char BOARD [B_HEIGHT][B_WIDTH];
это помечает любые проблемы во время компиляции.
struct levelbase {
int x, y;
unsigned char operator[](_x, _y) {return (unsigned char*)(this+1)+_y*x+_x;};
};
template<int x, int y> struct level : levelbase {
unsigned char data[x][y];
};
Лучше верните указатель const на что-то вроде выше.
GetLevelFromFile
неверен. Строковый литерал - этоconst char[N]
. Указание с помощьюchar *
вызывает проблемы (и это категорически запрещено в C ++ 11).