Buffer Overrun w visual studio c++

Odpowiedz Nowy wątek
2011-07-26 20:21
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;
}

Pozostało 580 znaków

2011-07-26 20:59
O_o
0
  1. Dynamiczna alokacja pamięci.
  2. To wypełnienei tablicy... ARRGHHHH!

O̾..͠o

Pozostało 580 znaków

2011-07-27 09:56
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,....};

Pozostało 580 znaków

2011-07-27 09:59
Kumashiro
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.

Jak jest sekwencja to tablica może być zbędna bo można wzorek odpowiedni zmutować zamiast niej - O_o 2011-07-28 06:06

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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