problem z dynamiczna tablica...

0
      
scanf("%d\n", &x2);
      if(tab[x2-1].n == 0)
	{
	  tab[x2-1].n = 1;
	  tab[x2-1].wsk = new int[1];
	  tab[x2-1].wsk[0] = i;
	} else {
	  tablica = new int[tab[x2-1].n+1];
	  CopyTab(tablica, tab[x2-1].wsk, tab[x2-1].n);
	  delete tab[x2-1].wsk;
	  tab[x2-1].wsk = NULL;
	  tab[x2-1].n++;
	  tab[x2-1].wsk = new int[tab[x2-1].n];
	  CopyTab(tab[x2-1].wsk, tablica, tab[x2-1].n-1);
	  delete tablica;
	  tablica = NULL;
	  tab[x2-1].wsk[tab[x-2].n-1] = i;
                }

void CopyTab(int *target, int *source, int n)
{
  for(int i = 0; i < n; i++)
    target[i] = source[i];
}

Powiedzcie czemu czaly czas jest blad segmentation fault? Przy troche wiekszych danych? np. 20??? Jak to troche zoptymalizowac??

mam taka structure:

typedef struct struktura
{
     int n;
     int *tab;
}

tab to wskaznik na tablice [na stercie]
n to rozmiar tej tablicy
n jest zwiekszane zawsze przy powiekszaniu rozmiaru tablicy

podczas wczytywania danych musze zrobic cos takiego:

  • czytam liczbe x
    -powiekszam aktualny rozmiar tablicy o 1
  • wstawiam x do ostatniej komorki tablicy

wiec dlatego jest ta tablica dynamiczna... please pomozcie to wazne...

aha zapomnialem dodac kompilator g++

1

Hmmm nie latwiej/szybciej to na listach zrobic? (linked list)

ale jak tam chcesz....
nie za bardzo rozumiem czym u ciebie jest tab[x2-1]
czyszby jakies
struktura tab[sth] ?
zaloze ze tak...
wiec tak...

a) wykonujesz za duzo krokow...
nie mowiac juz o tym ze caly czas masz x2-1...
nie lepiej dac jakies
int asdf = x2-1;
i tylko asdf wstawiac? jedno odejmowanie w kazdej linijce mniej
to samo co do ilosci
int xxx = tab[x-2].n;
pare mov'ow dla procka mniej
masz:
-- cut --
} else {
tablica = new int[tab[x2-1].n+1];
CopyTab(tablica, tab[x2-1].wsk, tab[x2-1].n);
delete tab[x2-1].wsk;
tab[x2-1].wsk = NULL;
tab[x2-1].n++;
tab[x2-1].wsk = new int[tab[x2-1].n];
CopyTab(tab[x2-1].wsk, tablica, tab[x2-1].n-1);
delete tablica;
tablica = NULL;
tab[x2-1].wsk[tab[x-2].n-1] = i;
}
-- cut --
a czemu nie
-- cut --
} else {
int asdf = x2-1, xxx = tab[asdf].n;
tablica = new int[xxx+1];
memcpy( tablica, tab[asdf].wsk, xxx * sizeof( int ));
delete tab[asdf].wsk;
tab[asdf].wsk = tablica;
tab[asdf].wsk[xxx] = i;
tab[asdf].n++;
}
-- cut --

nie prawdaz ze krotsze?
ale czemu ci sie to wywala to za bardzo nie wiem...
poza tym na prawde zajmij sie listami, sa owiele bardziej uzyteczne do tego typu dzialan

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