Я относительно новичок в кодировании, и я столкнулся с проблемой - PullRequest
0 голосов
/ 09 апреля 2019

Я новичок в конкурентном программировании. Я пытался решить вопрос о коде chef. Когда я пробовал на своем компиляторе dev c ++, я не получил никакой ошибки, однако я получаю ошибку во время выполнения в онлайн-коде шеф-повара IDE

int main() {

    int n,q;
    int l,r;
    int *A;
    int *B;
    int *J;
    int *C;
    cin >> n >> q;
    A=new int[n];
    B=new int[n];
    J=new int[n];
    C=new int[q];
    for (int i=0;i<n;i++) {
        cin >> A[i];
    }
    for (int i=0;i<n;i++) {
        cin >> B[i];
    }
    J[0]=0;

    for (int j=1;j<n+1;j++) {
        J[j]=J[j-1]+(A[j-1]*B[j-1]);
    }

    for (int i=0;i<q;i++) {
        cin >> l >> r;
        if (r==1) {
            C[i]=J[1];
        }
        else {
            C[i]=J[r]-J[l-1];
        }

    }
    for(int i=0;i<q;i++){
        cout << C[i] << endl;
    }
    delete []A;
    delete []B;
    delete []C;
    delete []J;

    return 0;
}

завершить вызов после выброса экземпляра 'std :: bad_array_new_length'

what():  std::bad_array_new_length

1 Ответ

2 голосов
/ 09 апреля 2019

Наличие

cin >> n >> q;
A=new int[n];
B=new int[n];
J=new int[n];
C=new int[q];

вы проверяете, вводите ли вы действительные размеры, даже не что-то

что (): std :: bad_array_new_length

указывает значение n и / или q слишком велико для new [n] или new[q]. Это очень вероятно, если вы вводите отрицательные целые числа (размер без знака ), или может иметь место, если вы не вводите 2 действительных целых числа, так что хотя бы одно из переменных не инициализировано (неопределенное поведение ) или, конечно, если вы введете хотя бы очень большое целое число.

В общем случае все cin >> ..., должны быть if (!(cin >> ...)) { ...error management ... }

Так что, по крайней мере:

if (!(cin >> n >> q) || (n < 1) || (q < 1)) {
  cerr << "invalid sizes" << endl;
  return -1;
}

Наличие

J=new int[n];
...
for(int j=1;j<n+1;j++){
    J[j]=J[j-1]+(A[j-1]*B[j-1]);

}

J[j] равен J[n] на последнем повороте, поэтому вы записываете из выделенного массива


Также в

for(int i=0;i<q;i++){
    cin >> l >> r;
    if(r==1){
        C[i]=J[1];
    }
    else{

    C[i]=J[r]-J[l-1];
}

вы не проверяете значения l и r , которые являются действительными индексами, а также если целое число было задано в качестве входных данных

cin >> l >> r; может быть что-то вроде

if (!(cin >> l >> r) || 
    (r < 0) || (r >= n) ||
    (l < 1) || (l >= (n - 1))) {
  cerr << "invalid indexes" << endl;
  return -1;
}
...