Shubham Kumar Ответов: 4

Проблема "ошибки сегментации"


Я пытаюсь решить проблему ранга хакера ( ссылка дана) -
[^]
Я понял проблему и создал программу для ее решения. Но проблема возникает, когда в качестве входных данных задается большой объем данных, поэтому компилятор выдает "ошибку сегментации", то есть ошибку нарушения.Он работает с небольшим количеством входов без каких-либо ошибок.

Пожалуйста, помогите мне с этим.Я пытаюсь придерживаться основных языковых особенностей C++ и не использовать указатель или векторы (если быть точным) для решения этой проблемы. Пожалуйста, взгляните на код.

/

Что я уже пробовал:

#include<iostream>

using namespace std;


int main()

{
    int n;
    int q;
    int column;
    int dummy;
    int b;
    int f;
    cin>>n>>q;
     int a[n][1000];

    for(int i=0;i<n;i++)
    {
        cin>>column;
      
        for(int j=0;j<column;j++)
        {
            cin>>dummy;
             a[i][j]=dummy;
        }
    }


      for(int l=0;l<q;l++)
      {
          cin>>b;
          cin>>f;
          cout<<a[b][f]<<endl;
      }


}

Richard MacCutchan

Этот код даже не будет компилироваться, вы еще не объявили переменную a. Было бы также легче понять, если бы вы использовали значимые имена для своих переменных, а не отдельные буквы.

4 Ответов

Рейтинг:
1

User 7429338

Если столбец > 100, ваш код получит доступ к a[i][100], что вызывает ошибку. 100 не должны быть жестко закодированы, но распределены на основе столбца.


Shubham Kumar

Как мы можем динамически выделить столбец. Например, если я выделю его в первом блоке цикла for, он будет локальным только для него??

Рейтинг:
1

Jochen Arndt

Ваш опубликованный код даже не будет компилироваться, потому что массив a нигде не определено.

Ошибка, скорее всего, возникает из-за отсутствия связанного доступа на запись к этому массиву. Это означает, что используемые индексы (i и-или j здесь) больше или равны соответствующим размерам массива.

[РЕДАКТИРОВАТЬ]
Отсутствующее определение для a было добавлено тем временем:

int a[n][1000];
Ошибка возникает, когда column считывание из пользовательского ввода больше или равно используемому размеру 1000 или отрицательно. Добавить проверку, что значение:
if (column < 0 || column >= 1000)
{
    cout << "Invalid column value";
    return;
}
[/РЕДАКТИРОВАТЬ]


Shubham Kumar

спасибо, что ответили.Мне нужно продолжение
на самом деле входные данные для столбца могут варьироваться он не привязан
Итак, как я могу динамически выделить столбец в первом цикле for и сделать его глобальным для второго блока цикла for

Mohibur Rashid

как насчет использования класса или структуры?

Jochen Arndt

Вы должны прочитать (максимальное) количество столбцов при запуске программы (сразу после чтения количества строк). Затем вы можете выделить массив.

У вас даже есть различное количество столбцов для строк?
Если нет: почему вы читаете номер столбца вместо того, чтобы просто зацикливаться (и печатать то, что должно быть введено как "введите значение для ["<<i<"] ["<< j"]")?

Рейтинг:
0

KarstenK

В вашем коде есть некоторые ошибки, такие как n, но также и некоторые логические ошибки, такие как ввод столбца для каждой строки.

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

cout << "column value:";
cin>>column;
cout << "row value:";
cin>>row;
//I would use a better name like piArray (pointer to int Array)
int *a = new int[column*row];//allocate int array is useable

//at the ende
delete a;


Рейтинг:
0

Patrice T

Цитата:
Но проблема возникает, когда в качестве входных данных дается большой объем данных

Проблема может быть связана с тем, что вы жестко закодировали длину строки до 1000 элементов
int a[n][1000];

но в требовании четко указано, что строка может содержать до 3.10^5 (300000) элементов.


Shubham Kumar

Я действительно изменил его на 3.10^5, но он не работает . пожалуйста, попробуйте сами, если вы можете