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