0xC0000005: место чтения нарушения доступа 0x0000000000000008 - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать генератор имен, который использует предустановленные слоги, доступ к которым осуществляется из трех разных массивов.

#include "main.hpp"

Namegen::Namegen() {
}

const char *Namegen::getFirst() {
    const char *name;
    int rNum = rng->getInt(0, 5);
    const char *firstSyllable = start[rNum];
    rNum = rng->getInt(0, 5);
    const char *secondSyllable = mid[rNum];
    rNum = rng->getInt(0, 5);
    const char *lastSyllable = end[rNum];

    name = firstSyllable + *secondSyllable + *lastSyllable;

    return name;
}

В каждом массиве всего 6 слогов, поэтому для min установлено значение 0и максимум до 5. Всего шесть цифр.Тем не менее, по некоторым причинам, похоже, что он генерирует 8 где-то?Я не совсем уверен, о чем идет речь об этом исключении, но, надеюсь, это сделает кто-то другой.Это исключение (даже если оно уже в заголовке):

0xC0000005: Access violation reading location 0x0000000000000008.

Это мой файл Namegen.hpp (связанный с файлом main.hpp):

#pragma once

class Namegen {
public:
    const char *start[6] = { "Ba", "Ce", "Ti", "Mo", "Lu", "Dy" };
    const char *mid[6] = { "ma", "te", "di", "so", "ku", "ly" };
    const char *end[6] = { "ban", "can", "dan", "fan", "gan", "han" };

    Namegen();
    TCODRandom *rng;
    const char *getFirst();
};

ПочемуВыдает ли это исключение и как я могу его исправить?

Я понял, что могу успешно объединить значения, используя следующий код:

std::string Namegen::getName() {
    int r = rng->getInt(0, 2);
    std::string firstSyll = fSyll[r];
    r = rng->getInt(0, 2);
    std::string midSyll = mSyll[r];
    r = rng->getInt(0, 2);
    std::string lastSyll = lSyll[r];

    std::string name = std::string(firstSyll) + std::string(midSyll) + std::string(lastSyll);

    return name;
}

Однако, этотеперь выдает это исключение:

Exception thrown at 0x00007FF978AD9E7A (ucrtbased.dll) in AotDK.exe: 0xC0000005: Access violation reading location 0x0000000000000000.

1 Ответ

0 голосов
/ 08 июня 2018

name = firstSyllable + *secondSyllable + *lastSyllable; нигде нет вблизи конкатенации.(Компилятор компилирует его так, как он думает, что вы выполняете некоторую арифметику с указателями на firstSyllable.) На самом деле поведение не определено, поскольку вы присваиваете что-то, что не является nullptr или адресом объекта name.

Отбросьте все вещи char* и используйте вместо них std::string.Тогда + будет действовать как конкатенация, поскольку это перегруженный оператор в строковом классе.

Тогда ваши данные примут форму

std::vector<std::string> start = { "Ba", "Ce", "Ti", "Mo", "Lu", "Dy" };

, которая демонстрируетсила стандартной библиотеки C ++.Вам необходимо набрать #include <string> и #include <vector>, чтобы получить эту функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...