Buffer Overrun w visual studio c++

0

program idzie skompilować i uruchomić jednak gdy ta tabela: int reka[10000][7];
dojdzie gdzies do reka[5000][7] to wyskakuje błąd 'How to debug Buffer Overrun Issues' czyli nie dz siętego programu dalej puścić niż w tej lini na ekranie pokaże się ii2 - 5000 --> printf("222222start %d , ii2 %d\n",start,ii2);

oraz nie wiem jak zadeklarować większą tablicę od tej int reka[10000][7]; na tablicę przynajmniej nt reka[1000000][7];

 #include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <windows.h>
#include <Shellapi.h>
#include <fstream>
//#pragma comment(lib, "shell32.lib")
using namespace std;

int _tmain()
{
  srand((int) time(0));
  printf("test 300 , test %d\n?", rand() % 301);  
  Sleep(rand() % 1001);
     //ShellExecuteA(NULL,"open","http://google.com",NULL,NULL, SW_SHOWNORMAL);
  int tab1[52],tab2[52],tablos[52];
  int reka[10000][7];
  int los=0;
  tab1[0]=2;
  tab1[1]=3;
  tab1[2]=4;
  tab1[3]=5;
  tab1[4]=6;
  tab1[5]=7;
  tab1[6]=8;
  tab1[7]=9;
  tab1[8]=10;
  tab1[9]=10;
  tab1[10]=10;
  tab1[11]=10;
  tab1[12]=11;
  tab1[13]=2;
  tab1[14]=3;
  tab1[15]=4;
  tab1[16]=5;
  tab1[17]=6;
  tab1[18]=7;
  tab1[19]=8;
  tab1[20]=9;
  tab1[21]=10;
  tab1[22]=10;
  tab1[23]=10;
  tab1[24]=10;
  tab1[25]=11;
  tab1[26]=2;
  tab1[27]=3;
  tab1[28]=4;
  tab1[29]=5;
  tab1[30]=6;
  tab1[31]=7;
  tab1[32]=8;
  tab1[33]=9;
  tab1[34]=10;
  tab1[35]=10;
  tab1[36]=10;
  tab1[37]=12;
  tab1[38]=11;
  tab1[39]=2;
  tab1[40]=3;
  tab1[41]=4;
  tab1[42]=5;
  tab1[43]=6;
  tab1[44]=7;
  tab1[45]=8;
  tab1[46]=9;
  tab1[47]=10;
  tab1[48]=10;
  tab1[49]=10;
  tab1[50]=12;
  tab1[51]=11;

   for(int i=0;i<10000;i++)
  {
   for(int j=0;j<7;j++)
  {
  reka[i][j]=-100;
  }
  }

std::fstream plik;
plik.open("dane.txt",std::ios::in|std::ios::out);
//if( plik.good() == true )
//{
//    std::cout << "Uzyskano dostep do pliku!" << std::endl;
    //tu operacje na pliku
//} else std::cout << "Dostep do pliku zostal zabroniony!" << std::endl;
int ii=0;
int ii2=0;
//////////////////////////////////////////////////////////////////
for (int start=0;start<370;start++)
{  
   for(int i=0;i<52;i++)
  {
  tablos[i]=-1000;
// printf("i=%d , %d\n",i ,tablos[i]); 
  }

  for(int i=0;i<52;i++)
  {
  jeszczeraz:
  tablos[i]=rand() % 52;
    for(int j=0;j<i;j++)
    {     
          if(tablos[i]==tablos[j]&&(i!=j))
          {
              goto jeszczeraz;
          }
    }
  }
   for(int i=0;i<52;i++)
  {
  tab2[i]=tab1[tablos[i]];
 printf("i=%d , %d\n",i ,tab2[i]); 

  }
///////////////////////////////////////////////

   int k=0;

    for(int ii=(0+ii2);ii<(27+ii2);ii++)
    {
        ii2++;
        if(ii2%27==0&&ii2!=0)
        goto tu;
        if(ii2%100==0)
        {
       printf("123456start %d , ii2 %d ii %d\n",start,ii2,ii); 
        system("pause");
        }
    for(int j=0;j<7;j++)
    {

        if(tab2[k]==12)
        {
        tab2[k]=0;
        }

      reka[ii+ii2][j]=tab2[k];
      k++;
        if(j==0)
        {
        reka[ii+ii2][5]=reka[ii+ii2][0];
        reka[ii+ii2][6]=reka[ii+ii2][0];
        if(reka[ii+ii2][0]==11)
        {
        reka[ii+ii2][6]=reka[ii+ii2][6]-10;
        }
        }
        if(j==1)
        {
        reka[ii+ii2][5]=reka[ii+ii2][5]+reka[ii+ii2][1];
        reka[ii+ii2][6]=reka[ii+ii2][6]+reka[ii+ii2][1];
        if(reka[ii+ii2][1]==11)
        {
        reka[ii+ii2][6]=reka[ii+ii2][6]-10;
        }
        if(reka[ii+ii2][5]==21)
        {
        j=10;
        }   
        }
        if(j==2)
        {
        reka[ii+ii2][5]=reka[ii+ii2][5]+reka[ii+ii2][2];
        reka[ii+ii2][6]=reka[ii+ii2][6]+reka[ii+ii2][2];
        if(reka[ii+ii2][2]==11)
        {
        reka[ii+ii2][6]=reka[ii+ii2][6]-10;
        }
        if(reka[ii+ii2][5]==21||reka[ii+ii2][6]==21)
        {
        j=10;
        }
        if(reka[ii+ii2][5]>21&&reka[ii+ii2][6]>21)
        {
        j=10;
        }
        }
        if(j==3)
        {
        reka[ii+ii2][5]=reka[ii+ii2][5]+reka[ii+ii2][3];
        reka[ii+ii2][6]=reka[ii+ii2][6]+reka[ii+ii2][3];
        if(reka[ii+ii2][3]==11)
        {
        reka[ii+ii2][6]=reka[ii+ii2][6]-10;
        }
        if(reka[ii+ii2][5]==21||reka[ii+ii2][6]==21)
        {
        j=10;
        }
        if(reka[ii+ii2][5]>21&&reka[ii+ii2][6]>21)
        {
        j=10;
        }
        }
        if(j==4)
        {
        reka[ii+ii2][5]=reka[ii+ii2][5]+reka[ii+ii2][4];
        reka[ii+ii2][6]=reka[ii+ii2][6]+reka[ii+ii2][4];
        if(reka[ii+ii2][4]==11)
        {
        reka[ii+ii2][6]=reka[ii+ii2][6]-10;
        }
        if(reka[ii+ii2][5]==21||reka[ii+ii2][6]==21)
        {
        j=10;
        }
        if(reka[ii+ii2][5]>21&&reka[ii+ii2][6]>21)
        {
        j=10;
        }
        }

    }

    }
    tu:
    k=0;
    if(ii2%54==0)
    {
    printf("222222start %d , ii2 %d\n",start,ii2); 
    system("pause");
    }

    if (ii2>=9990)
    goto koniec;
  } 
 koniec:
/////////////////////////
   for(int i=0;i<9990;i++)
   {
    plik <<"\n"<<i; 

      for(int j=0;j<7;j++)
       {
      plik <<"\n"<<j<<"\n"<<reka[i][j];

       }
     plik <<"\n"<<endl<<"\n";
   }

 plik.close();
 system("pause");
 return 0;
}
0
  1. Dynamiczna alokacja pamięci.
  2. To wypełnienei tablicy... ARRGHHHH!
0
int reka[10000][7];

nie można tworzyć tak dużych tablic na stosie.

int tab1[52],
...
tab1[0]=2;
tab1[1]=3;
...
tab1[50]=12;
tab1[51]=11;

masakra.

int tab1[] = {2,3,4,5,6,7,8,9,10,10,10,11,....};
0

Z tego co tu widzę, to tablica jest wypełniana sekwencjami tych samych zestawów wartości, zatem pętla byłaby bardziej na miejscu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0