2014-12-15 3 views
-4

Я использую Visual Studio 2010. while продолжает повторяться, и я получаю сообщение об ошибке, когда программа останавливается.В то время как циклы повторяются, ошибка отладки при остановке программы

Это просто увеличивая значение массива в 700 раз больше, чем это необходимо, и «линия» показывает, что это просто повторяет цикл пока больше, чем он должен (~ 700 раз)

Код:

#include <stdio.h> 
#include <stdlib.h> 

#include <time.h> 
#include <iostream> 

int main(){ 

    int loop,loop2,loop3,usergirdi,random,linecounter,s,b,x; 
    int a[17]; 
    printf("baslayarak \n"); 
    scanf("%d",&usergirdi); 

    for (loop=1;loop<=16;loop++){ 
     a[loop]=0; } 
    for (loop2=1;loop2<=15;loop2++){ 
      if(loop2==usergirdi){ 
       usergirdi=usergirdi; 
       a[usergirdi]+=1; 
       printf("%d ",a[usergirdi]); } 

      else 
       printf("%d ",a[loop2]);} 

    linecounter=0; 

    printf("\n"); 

while (a[1]<1||a[15]<1||a[2]<1||a[3]<1||a[4]<1||a[5]<1||a[6]<1||a[7]<1||a[8]<1||a[9]<1||a[10]<1||a[11]<1||a[12]<1||a[13]<1||a[14]<1){ 

linecounter++; 

     srand (time(NULL)); 
      random=(rand()%15+1); 



    if (a[random-1]==0 && a[random+1]==0 && a[random]==0){} 

    else if (a[random-1]!=0 || a[random+1]!=0) 
       { 
        a[random]+=1; 

    } 
    for (b=0;b<=14;b++){ 
     printf("%d ",a[b]); } 
    printf("[line %d]\n",linecounter); 



}} 

ошибка отладки:

+0

Пожалуйста, уменьшите код до ** минимального ** компилируемого кода, необходимого для воспроизведения этой ошибки. Вероятно, вы также обнаружите, что решили свою проблему. –

+0

Не звонили ли тревожные звонки с этим отвратительным условием 'while'? – Bathsheba

+0

Тревожные колокола: 'a [-1] = 0;'. Сообщение об ошибке даже сообщает об этом. – usr2564301

ответ

1

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

  1. Перед началом цикла while.

    a[16] = 0; 
    
  2. Внутри цикла while.

    a[16] = 0; 
    a[-1] = 0; 
    
  3. Снова внутри while петли

    if (a[random-1]==0 && a[random+1]==0 && a[random]==0){} 
        // ^^ If random == 0 
    
  4. Снова внутри while петли

    else if (a[random-1]!=0 || a[random+1]!=0) 
         // ^^ If random == 0 
    

Вы можете удалить эти ошибки с помощью:

  1. Использование

    a[15] = 0; 
    
  2. Замена линии

    a[-1] = 0; 
    

    с

    a[0] = 0; 
    
  3. Изменение строки, которая генерирует random к:

    random=(rand()%14)+1; 
    

Ошибка в логике может быть удалена:

  1. Перемещения вызова srand вне цикла.

  2. Извлечение a[0] < 1 Проверка на соответствие while.

+0

, поэтому, если я расширяю диапазон массивов, то разрешит ли он повторяющуюся проблему ? – Zavolar

+0

@ Zavolar, см. Мое обновление. –

+0

Хорошо. Спасибо за это, поэтому я расширил массив. Но он все еще повторяется больше, чем должен – Zavolar

0
a[16]=0; 

Этот массив индекс от 0-15a[16] является массив из ограниченного доступа и ведет к UB.

Избавиться от этого также:

a[-1]=0; 
+0

UB? Что это значит ? – Zavolar

+0

@ Zavolar Неопределенное поведение (UB) – Gopi

+0

Хорошо. Я просто удалил все части «[16]» и все еще получаю ошибку с коррупцией – Zavolar