необработанное исключение: расположение чтения нарушения доступа 0x00000004 - PullRequest
0 голосов
/ 05 июля 2011

Я получаю эту ошибку в режиме отладки, когда впервые сталкиваюсь с отмеченной строкой в ​​коде ниже.

#include<fstream>
#include<iostream>
#include<math.h>
#include<string>

using namespace std;

int main()
{int t,i,j,k,n,g[100],w[100],opp[100];
float rpi[100],wp[100],owp[100],oowp[100];
char s[100][100];
ifstream ip; ip.open("A-small-practice.in"); ofstream op; op.open("A_out.in");
ip>>t; 
for(i=0;i<t;i++)
  { ip>>n;
    memset(g,0,sizeof(g));
    memset(w,0,sizeof(w));
    memset(op,0,sizeof(op));
    memset(rpi,0,sizeof(rpi));
    memset(wp,0,sizeof(wp)); 
    memset(owp,0,sizeof(owp));
    memset(oowp,0,sizeof(oowp));
    memset(s,'.',sizeof(s));

    for(j=0;j<n;j++)
      {for(k=0;k<n;k++)
        {ip>>s[j][k]; //<--------------------the error occurs here
        if(s[j][k]=='0')
          g[j]++;
    if(s[j][k]=='1')
      {g[j]++;w[j]++;}
        }
      wp[j]=w[j]/g[j];
     }

    for(j=0;j<n;j++)
      {for(k=0;k<n;k++)
       if(j!=k && s[k][j]!='.')
           {owp[j]+=(wp[k]*g[k]-s[k][j])/(g[k]-1);
           opp[j]++;
           }
       owp[j]/=opp[j];
      } 

    for(j=0;j<n;j++)
      {for(k=0;k<n;k++)
        {if(j!=k && s[k][j]!='.')
         oowp[j]+=owp[k];
        }
       oowp[j]/=opp[j]; 
      }

   op<<"Case #"<<i+1<<": \n"; 
    for(j=0;j<n;j++)
    {rpi[j]=(0.25*wp[j]) + (0.5*owp[j]) +(0.25*oowp[j]);
    op<<rpi[j]<<"\n";
     } 
 } 
return 0; 
}

при входе отладчик прерывается в этом сегменте кода. Циклы и логика имеют значение размеравсе правильно, я не знаю, где происходит переполнение .. есть ли другие причины для этого?

    class _Sentry_base
    {   // stores thread lock and reference to input stream
public:
    __CLR_OR_THIS_CALL _Sentry_base(_Myt& _Istr)
        : _Myistr(_Istr)
        {   // lock the stream buffer, if there
        if (_Myistr.rdbuf() != 0)//<-------------break points here
            _Myistr.rdbuf()->_Lock();
        }

1 Ответ

2 голосов
/ 05 июля 2011

Вам не нужно использовать memset для одномерных массивов.Например,

 int g[100] = {0};

будет работать.

Для двумерного массива выполните цикл с помощью цикла for и установите для каждого элемента значение '.', или используйте memset для этого шага..

С точки зрения вашей реальной проблемы вам может понадобиться использовать ip.get() вместо чтения символа за символом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...