2017-02-17 7 views
1

Я начал изучать 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]; 
     } 
    } 
} 
+1

Какой процесс привел к решению использовать 'new' и' double ** '? Это стоит пересмотреть. –

+0

Ваше использование необработанных массивов и указателей делает ваш код трудным для чтения и подвержен ошибкам. И вам не хватает всех 'delete []' s. К счастью, вы можете использовать 'std :: vector' вместо необработанных массивов. Он делает все, что 'new []' делает, но лучше и безопаснее. –

+0

Вы также должны использовать 'std :: stoi' вместо той же функции atoi, которая подвержена ошибкам. –

ответ

1

Это:

A[i] = new double(aColCount); 

должно быть:

A[i] = new double[aColCount]; 

и аналогичные в других местах. Ваш код выделяет одиночный double и инициализирует его значением aColCount.

Смежные вопросы