Я новичок в кодировании и столкнулся с проблемой

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

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

Попробуйте напечатать значение для n и q, чтобы увидеть, имеет ли это смысл.

Guillaume Racicot 09.04.2019 17:14

у вас наверняка есть доступ из массива, некоторый потенциальный доступ из массива и потенциальный незаконный размер выделения, см. мой ответ

bruno 09.04.2019 17:15

Я настоятельно не рекомендую использовать DevC++, он не разработан должным образом и имеет множество проблем. Если вам нужна бесплатная IDE, здесь есть множество en.wikipedia.org/wiki/…, которые более эффективно удовлетворят ваши потребности, из которых я бы лично рекомендовал Code::Blocks, Eclipse или Visual Studio.

Tzalumen 09.04.2019 17:50

Несвязанные: старайтесь давать своим вопросам описательные названия. Программистам, которые следят за вами, будет легче найти ваш вопрос. Точно так же попробуйте дать своим идентификаторам осмысленные имена. Всем будет проще, если переменные будут названы в честь того, что они содержат или представляют, а функции будут названы в честь того, что они делают. Кроме того, опечатка в многобуквенном идентификаторе труднее проскользнуть через компилятор, чем если вы случайно используете A там, где вы хотели использовать B.

user4581301 09.04.2019 19:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Имея

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

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

what(): std::bad_array_new_length

указывает, что значение н и/или д слишком велико для 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];
}

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

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

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

Другие вопросы по теме