Dlaczego mój program się sypie?, jak to naprawić?

0

Siema,

mój program sypie się w linijce nr 54, proszę o pomoc.

wywala takie coś po uruchomieniu:

Unhandled exception at 0x5486ca58 (msvcr100d.dll) in test_regex.exe: 0xC0000005: Access violation writing location 0xabababab.

adres do pliku dane3.txt:

http://www.przeklej.pl/plik/dane3-txt-0029jt9u340i

 
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/regex.hpp>
#include <iostream>
#include <boost/foreach.hpp>
#include <fstream>
using namespace std;
using namespace boost;



int main()
{




string kod;

ifstream plik;

plik.open("dane3.txt", ios::out);

if(plik.is_open())
{
	while(!plik.eof())
		{
		kod.push_back(plik.get());
		}
}
else cout << "dupa\n";

plik.close();
const static regex email_regex(
	
	
	"[.+>]([^>[:space:]<].*?)[<.+>]"
	//"[.+>]([^>[:space:]<].*?)[<.+>]"
);

string *tab;
int a=0;



const sregex_token_iterator end;
   for (sregex_token_iterator i(kod.begin(),
      kod.end(), email_regex);
      i != end;
      ++i)
   {
      
		tab = new string[a];
	  tab[a]=*i;
	  a++;
   }
 cout<< "\n\n - - - - - - - - \n\n";	  

system("pause");
}

0

przeanalizuj jeszcze ostatnią pętle for w 47 linijce bo mi się tam kilka rzeczy nie podoba, po 2 jak tworzysz operatorem new to pamietaj o 'delete' a u Ciebie tego nie widze.

@Edit
ŁF - dokładnie, powiedziałem aby przeanalizował od nowa tą pętle ; D

int a=0;
a potem dajesz
tab = new string[a];
czyli za Twoim pierwszym obiegiem pętli tworzysz tab = new string[0]
a potem zwiększasz cały czas tworząc nowe tablice które nie są w pełni wykorzystywane a na dodatek nie kasujesz ich operatorem delete []

0

w tej pętli nie mogę przypisać zmiennej "i" do stringa, ale chyba ogólnie for dobry jest. ??

0

tab = new string[a];
tab[a]=*i;

czy aby nie tworzysz tablicy o długości a, ale o ostatnim indeksie na a-1? btw mam wrażenie, że tworzysz za każdym razem nie element, ale od nowa całą tablicę.

0

dzięki ŁF,
teraz przed forem dałem
string *tab=new string[1000];
i usunąłem z fora
tab = new string[a];

a teraz możesz mi napisać jak to zrobić, aby nie określać z góry wielkości tablicy tab?
bo zawsze kompilator mi pisze, żę mam określić wielkość, a ja chcę się przygotować na sytuację kiedy będę miał indeks 1001.

0

@up Przykład:

int main()
{
int rozmiar;
  cout << "Podaj rozmiar tablicy:";
cin >> rozmiar;
  int *tablica = new int[rozmiar] ;
  for(int i = 0; i < rozmiar; i++)
{
 tablica[i] = i;
}
delete [] tablica;

return 0;
}
0

ale ja nie jestem w stanie podać wielkości tablicy, nie można tego dynamicznie jakoś, że jak jest potrzeby kolejny element tablicy to się go dodaje samoczynnie?

0

ok, dzięki.

A wiecie może jak zrobić aby w tym moim forze przeszukiwanie zaczęło się dopiero od np. wyrazu "Tottenham", a nie od samego początku?

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