Проблема создания и возврата зубчатого массива (ошибка std :: bad_array_new_length) - PullRequest
1 голос
/ 08 мая 2019

Для решения этой домашней задачи нам нужно создать новый зубчатый массив с кодом, предоставленным нашим профессором, распечатать массив и вычислить max, min и сумму содержимого массива. Нам разрешено редактировать только функции createAndReturnJaggedArray() и printAndThenFindMaxMinSum(int**,int*,int*,int*), так как остальная часть кода была предоставлена ​​нам, чтобы мы могли проверить, что получаем правильный вывод.

Я могу запустить программу, однако после печати начальной строки она завершает работу программы, выдавая мне ошибку terminate called after throwing an instance of 'std::bad_array_new_length' what(): std::bad_array_new_length. Я полагаю, что проблема заключается в том, что я создал неровный массив и выделил память для столбцовой части массива, однако я использовал примечания, которые нам дали в качестве справочных, и понятия не имею, откуда возникла проблема. Вся программа представлена ​​ниже. Спасибо за любую помощь!

РЕДАКТИРОВАТЬ / ПРИМЕЧАНИЕ : мы еще не изучили векторы, поэтому нам не разрешено их использовать.

#include <iostream>
#include <climits>
using namespace std;

class JaggedArray {

public:

int numRows;
int *numColumnsInEachRow;
JaggedArray() {
    numRows = 11;
    numColumnsInEachRow = new int[numRows];
    for (int i = 0; i < numRows; i++) {
        if (i <= numRows / 2) {
            numColumnsInEachRow[i] = i + 1;
        } else {
            numColumnsInEachRow[i] = numRows - i;
        }
    }
    readComputeWrite();
}

int **createAndReturnJaggedArray() { // COMPLETE THIS FUNCTION
    int **A = new int*[numRows];
    for(int i=0;i<numRows;i++){ //allocate columns in each row
        A[i] = new int[numColumnsInEachRow[i]];
        for(int j=0;j<numColumnsInEachRow[i];j++){
            if(i <= numRows/2)
                A[i][j] = (i + j);
            else
                A[i][j] = -1 * (i+j);
        }
    }
    return A;
}

void printAndThenFindMinMaxSum(int **A, int *maxPtr, int *minPtr, int *sumPtr) { // COMPLETE THIS FUNCTION
    maxPtr = new int[INT_MIN];
    minPtr = new int[INT_MAX];
    sumPtr = 0;

    for(int i=0;i<numRows;i++){
       for(int j=0;j<numColumnsInEachRow[i];j++){
           //1. print array
            if (j == (numColumnsInEachRow[i]-1))
                cout << A[i][j] << endl;
            else
                cout << A[i][j] << " ";

           //2. compute max, min, and sum
           sumPtr += A[i][j];
           if (A[i][j] > *maxPtr)
                maxPtr = new int[A[i][j]];
           if (A[i][j] < *minPtr)
                minPtr = new int[A[i][j]];
        }
    }
}

void print(int max, int min, int sum) {
    cout << endl;
    cout << "Max is " << max << "\n";
    cout << "Min is " << min << "\n";
    cout << "Sum is " << sum << "\n";
}

void readComputeWrite() {
    int max, min, sum;
    int **A = createAndReturnJaggedArray();
    cout << "*** Jagged Array ***" << endl;
    printAndThenFindMinMaxSum(A, &max, &min, &sum);
    print(max, min, sum);
}
};

int main() {
    JaggedArray jaf;
    return 0;
}

1 Ответ

1 голос
/ 08 мая 2019

Как подсказывает @ user4581301, ваша проблема в printAndThenFindMinMaxSum. Простое изменение на приведенное ниже решает вашу проблему:

void printAndThenFindMinMaxSum(int **A, int &maxPtr, int &minPtr, int &sumPtr) { // COMPLETE THIS FUNCTION
    maxPtr = INT_MIN;
    minPtr = INT_MAX;
    sumPtr = 0;

    .
    .
    .
            sumPtr += A[i][j];
            if (A[i][j] > maxPtr)
                maxPtr = A[i][j];
            if (A[i][j] < minPtr)
                minPtr = A[i][j];
        }
    }
}

Нам также нужно изменить readComputeWrite на:

void readComputeWrite() {
    int max, min, sum;
    int **A = createAndReturnJaggedArray();
    cout << "*** Jagged Array ***" << endl;
    printAndThenFindMinMaxSum(A, max, min, sum);
    print(max, min, sum);
}

Я бы также рекомендовал изменить имена minPtr, maxPtr и sumPtr на что-то более подходящее, так как они не являются указателями в этой точке и представляют примитивные значения.

Вы заметите, что я изменил указатели на ссылки, так как это более естественная адаптация для этого типа операций. По сути, передача по ссылке позволяет пользователю работать с переданным значением простым способом, без утомительной задачи убедиться, что вы разыменовали вещи в соответствующее время. Это также позволяет работать менее подверженным ошибкам образом.

Опять же, как проницательно указывает @ user4581301, целью этого назначения было, вероятно, иметь дело с указателями. Таким образом, есть несколько вещей, которые необходимо изменить, если OP не может использовать ссылки. Обратите внимание:

void printAndThenFindMinMaxSum(int **A, int *maxPtr, int *minPtr, int *sumPtr) { // COMPLETE THIS FUNCTION
    *maxPtr = INT_MIN;  // Make sure to deference before assigning
    *minPtr = INT_MAX;  // Make sure to deference before assigning
    *sumPtr = 0;  // Make sure to deference before assigning

    for(int i=0;i<numRows;i++){
        for(int j=0;j<numColumnsInEachRow[i];j++){
            //1. print array
            if (j == (numColumnsInEachRow[i]-1))
                cout << A[i][j] << endl;
            else
                cout << A[i][j] << " ";

            //2. compute max, min, and sum
            *sumPtr += A[i][j];   // Make sure to deference before assigning
            if (A[i][j] > *maxPtr)  // Make sure to deference before comparing
                *maxPtr = A[i][j];  // Make sure to deference before assigning
            if (A[i][j] < *minPtr)  // Make sure to deference before comparing
                *minPtr = A[i][j];  // Make sure to deference before assigning
        }
    }
}

И readComputeWrite может остаться неизменным после первоначальной попытки ОП.

В коде ОП они в основном забывают о необходимости почтения перед назначением / сравнением.

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