C ++ чтение данных в символ *

0

Я пытаюсь читать данные в 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() для чтения в строке из файла, чтобы я мог хранить данные уровня в отдельных файлах.

Спасибо за вашу помощь!

  • 2
    Ваш тип возврата на GetLevelFromFile неверен. Строковый литерал - это const char[N] . Указание с помощью char * вызывает проблемы (и это категорически запрещено в C ++ 11).
  • 0
    Кроме того, это довольно сложно отлаживать, когда кто-то подсчитывает символы вручную. Вы действительно должны сделать его более полным для обслуживания.
Показать ещё 6 комментариев
Теги:
char

3 ответа

1
Лучший ответ

То, что вы возвращаете, на самом деле является одной строкой: оператор запятой в этом случае просто возвращает последний элемент "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();

    ...
  • 0
    Вы правы, функция является фиктивной функцией. То, что вы предложили, не работает. Но вы правы, я хочу вернуть массив строк.
  • 0
    какую ошибку вы сейчас получаете?
Показать ещё 6 комментариев
1

Проблема заключается в том, что ваше объявление "string","string","string",etc НЕ объявляет массив char *. Вы используете оператор запятой, означающий, что возвращаемая строка на самом деле будет LAST-строкой "AAAA... AA", длина которой составляет всего 26 байтов, поэтому вы перестанете ссылаться на память за пределами границ. Удалите запятую, и она должна работать так, как вы хотите, потому что все строки строк будут объединены в 1 длинную строку препроцессором.

  • 0
    Я не хочу возвращать одну длинную строку, я хочу вернуть все это как массив строк. Есть идеи, как это сделать?
  • 0
    Первое, что я бы предложил, - это преобразовать массив char в структуру (или класс, если хотите). typedef char BOARD [B_HEIGHT][B_WIDTH]; это помечает любые проблемы во время компиляции.
0
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 на что-то вроде выше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню