#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 в коде.