Я начал изучать C++, и у меня уже есть проблема. Моя программа будет принимать 4 аргумента из командной строки. Этими аргументами будут размеры двух многомерных массивов. ./myprogram 2 2 2 2
Ошибка сегментации при попытке чтения во втором многомерном массиве
Это, как я ввожу элементы первого массива 2х2:
1 2 3 4
Затем я ввожу элементы для второго массива: 5
Тогда я получаю сообщение об ошибке в терминал, указанный Segmentation fault (core dumped)
Вот код, который читается из командной строки и шины ы для чтения в элементах массива:
#include <iostream>
#include <stdlib.h>
using namespace std;
void readArr(int, int, double**);
int main(int argc, char* argv[]) {
int aRowCount = atoi(argv[1]);
int aColCount = atoi(argv[2]);
int bRowCount = atoi(argv[3]);
int bColCount = atoi(argv[4]);
std::cout << "Input accepted" << endl;
if(aColCount != bRowCount) {
std::cerr << "Col. Count of the first must match Row. Count of the second matrix." << endl;
return 1;
}
double **A = new double*[aRowCount];
for(int i = 0; i < aRowCount; i++){
A[i] = new double(aColCount);
}
std::cout << "allocating A" << endl;
double **B = new double*[bRowCount];
for(int j = 0; j < bRowCount; j++){
A[j] = new double(bColCount);
}
std::cout << "allocating B" << endl;
double **C = new double*[aRowCount];
for(int k = 0; k < aRowCount; k++) {
C[k] = new double(bColCount);
}
std::cout << "Reading in A" << endl;
readArr(aRowCount, aColCount, A);
std::cout << "Reading in B" << endl;
readArr(bRowCount, bColCount, B);
return 0;
}
void readArr(int rowCount, int colCount, double **array) {
for(int i = 0; i < rowCount; i++) {
for(int j = 0; j < colCount; j++) {
std::cin >> array[i][j];
}
}
}
Какой процесс привел к решению использовать 'new' и' double ** '? Это стоит пересмотреть. –
Ваше использование необработанных массивов и указателей делает ваш код трудным для чтения и подвержен ошибкам. И вам не хватает всех 'delete []' s. К счастью, вы можете использовать 'std :: vector' вместо необработанных массивов. Он делает все, что 'new []' делает, но лучше и безопаснее. –
Вы также должны использовать 'std :: stoi' вместо той же функции atoi, которая подвержена ошибкам. –