Я получаю следующую ошибку при запуске моего кода:
Необработанное исключение в 0x00F66754 в KSU.CIS308.Project5.exe: 0xC0000005: Место записи нарушения прав доступа 0xFDFDFDFD.
Я предполагаю, что это связано с наличием памяти для указателя, но не тем, на что он указывает. Я понятия не имею, как назначить это все же. Вот код, это метод конструктора для объектов Matrix:
Matrix::Matrix(int row, int col)
{
this->rows = row;
this->cols = col;
this->arr = new int*[row];
for (int i = 0; i < row; i++)
{
this->arr[i] = new int[col];
}
}
this->arr = new int*[row];
это то, что бросает это. Это указатель на указатель, так что я могу хранить матрицу как двумерный массив. Буду признателен за любую оказанную помощь.
Я думаю, что это также бросается позже, но если я могу понять один, остальное должно быть легко исправить также.
Arr объявлен так в заголовочном файле:
int **arr;
Итак, при отладке я обнаружил, что col получает 0, что может объяснить ошибку.
Я думал, что рассчитал правильное значение для его передачи. Вот основной файл. Я использую strtok’s, чтобы поместить все в вектор. Формат ввода пользователя: «1 2 3 // 3 2 1» Где «//» — разрыв строки.
int main() {
vector<int> v1;
int rowCountA = 1;
int colCountA = 0;
cout << "Enter First Matrix (put // to denote row breaks): ";
char buff[200];
char *token;
char *tok;
scanf("%s", buff);
token = strtok(buff, "//");
while (token != NULL)
{
tok = strtok(token, " ");
while (tok != NULL)
{
v1.push_back(atoi(tok));
tok = strtok(NULL, " ");
colCountA++;
}
token = strtok(NULL, "//");
rowCountA++;
}A = new Matrix(rowCountA, colCountA/(rowCountA+1));
for (int i = rowCountA; i > 0; i--)
{
for (int k = colCountA; k < 1; k--)
{
A->setElem(i, k, v1.back());
v1.pop_back();
}
}
}
Как вы узнали, проблема заключается в передаче 0 в качестве одного из измерений, в противном случае создание 2D-массива является правильным. Вы никогда не должны позволять col
равным 0, в худшем случае (скажем, пустой ввод), сделайте его равным 1.
В любом случае вы неправильно анализируете ввод:
scanf("%s")
возвращает только первое число, потому что это останавливается на первом месте. Ваш код должен использовать fgets()
вместо.
Используя строковые функции C, вы должны заменить scanf("%s", buff);
с:
fgets(buff, sizeof(buff)/sizeof(char), stdin);
Но вы не можете гнездо звонки в strtok()
, Когда вы разбили строку на //
а затем позвоните strtok
на каждом токене вы больше не можете получить следующий строка потому что он забывает о токенизации на основе //
,
Вот грубый эквивалент синтаксического анализа, который вы делаете с использованием ввода-вывода C ++ (хотя код делает есть другие ошибки):
string sbuff;
getline(cin, sbuff);
stringstream ss(sbuff); // header file <sstream>
while (ss >> sbuff) {
if (sbuff == "//") {
rowCountA++;
}
v1.push_back(atoi(sbuff.c_str()));
colCountA++;
}