Где нарушение доступа к моему коду?

#c #access-violation #primes

#c #доступ-нарушение #простые числа

Вопрос:

Я получаю нарушение доступа при попытке запустить этот код, который находит простые числа в привязке.

 int main () {
    cout << "Program initialized successfully. Please wait for the next message to appear." << endl << endl ;

    int Primes[51] ;
    int runner = 0 ;
    int chaser = 0 ;
    int bound = 0 ;
    int count = 0 ;

    cout << "Please enter the maximum boundary of the calculation : " ;

    cin >> bound ;

    cout << endl << "The number you've entered, " << bound << ", has been accepted. Please wait for the calculations." << endl ;

    if (runner <= bound ) {
        Primes[0] = 2;
        Primes[1] = 3;
        Primes[2] = 5;
        Primes[3] = 7;
        Primes[4] = 11;
        count = 4;

        for ( runner = 11 ; runner <= bound ; runner    ) {
            while ( runner % Primes[chaser] != 0 ) {
                for ( chaser = 0 ; Primes[chaser] != 0 ; chaser    ) {
                    if ( runner % Primes[chaser] == 0 ) {
                        count    ;
                        Primes[count] = runner;
                    }
                }
            }
        }

        int chaser_count;
        cout << "Here's the primes computer discovered : " << endl ;
        for ( chaser_count = 0 ; chaser_count <= count ; chaser_count    ) {
            cout << Primes[chaser_count] << endl ;
        }
        cout << "There is " << count << " primes discovered." << endl ;
    }
    return 0;
}
  

Программа работает нормально, пока не дойдет до строки вычисления: if(runner <= bound)

Я получил нарушение доступа.

Я вроде знаю, что такое нарушение доступа, но я не знаю, что его вызвало.

Редактировать:

Теперь я получил 2 ответа, в которых говорится, что у меня может быть что-то вроде простых чисел [50], но я в этом серьезно сомневаюсь, потому что я получаю ошибку сразу после указания границы, 12.

Спасибо за парня, который откомментировал это.

Я использую Dev-C .

Я нашел место, где была вызвана ошибка. Спасибо всем, кто прокомментировал и ответил за меня. Это логическая ошибка, которую я не обнаружил, которая приводит к простому [51].

Спасибо вам всем за помощь.

Комментарии:

1. Отладчик сообщает вам, где происходит сбой. Какой IDE / компилятор / отладчик вы используете?

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

3. @sbi Из интереса, почему вы удалили все комментарии из исходного кода, но не объяснили, почему вы это сделали?

4. @ClareMacrae: комментарий к фиксации гласит: «удалены ненужные комментарии». Они больше загромождали код, чем помогали его понять. Что хорошего в том, чтобы прокомментировать определение переменной с помощью «это определяет переменную»? Может быть, я мог бы сохранить некоторые, но я был слишком ленив для этого, и я подумал, что лучше удалить несколько слишком много из этого простого кода, а не иметь их все.

5. Шейн, возможно, ты захочешь научиться использовать отладчик для пошагового выполнения кода.

Ответ №1:

Здесь :

for ( chaser = 0 ; Primes[chaser] != 0 ; chaser ) {

вы не инициализировали Primes свой массив с 0, поэтому цикл может повторяться снова и снова, а chaser может быть больше 51 (размер вашего массива простых чисел), а затем Primes[something_bigger_than_50] вызовет нарушение доступа.

Комментарии:

1. Большое спасибо. Я пытался предотвратить это с помощью ограничения, которое я установил в своем мозгу, чтобы сделать границу действительно маленькой, когда я ее тестирую. Но, похоже, я допустил ошибку в своем коде, которая приводит к бесконечному циклу if в коде.