Buffer Overrun w visual studio c++

Buffer Overrun w visual studio c++
RE
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:50
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];

Kopiuj
 #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;
}
OO
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:98
0
  1. Dynamiczna alokacja pamięci.
  2. To wypełnienei tablicy... ARRGHHHH!

O̾..͠o
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:minuta
0
Kopiuj
int reka[10000][7];

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

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

masakra.

Kopiuj
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.

OO
Jak jest sekwencja to tablica może być zbędna bo można wzorek odpowiedni zmutować zamiast niej

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.