Insert sort się wiesza - ponoć wskaźnik

0

Mam problem z Insert Sortem. Po wyborze opcji program się wywala z komunikatem "Process exited with return value 3221225477. Znajony twierdz, że to coś ze wskaźnikiem, ale nie potrafię tego odszukać. Gdzie jest błąd i jak go naprawić. Z góry dzięki za pomoc.

 
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

const int rozmiar = 100000;
int* tablica;
	int por = 0;
	int zam = 0;
int zamiana[100];
int porownania[100];

void wypisz(int rozmiar, int tab1[])
{
	std::cout << std::endl;
	std::cout << "Posortowany ciag " << std::endl;
	
	for (int i = 0; i < rozmiar; ++i)
	{
		std::cout << tab1[i] << " ";
	}
}

void ustaw(int* tablica, int rozmiar)
{
	tablica = new int[rozmiar];
}

void wybor(int opcja, int* tablica, int rozmiar)
{
	switch(opcja)
	{
		case 1:
			
			for (int i = 0; i < rozmiar; ++i)
			{
				int buff;
				buff = rozmiar - i;
				tablica[i] = buff;
			}
			
			for (int i = 0; i < rozmiar; ++i)
			{
				std::cout << tablica[i] << " ";
			}
			break;
			
		case 2:
			
			srand (static_cast<int>(time(NULL)));
			
			for (int i = 0; i < rozmiar; ++i)
			{
				tablica[i] = rand() % rozmiar + 1;
			}
			
			for (int i = 0; i < rozmiar; ++i)
			{
				std::cout << tablica[i] << " ";	
			}
	}
}

	
int IS(int* tablica, int rozmiar, int opcja)
{
	ustaw(tablica, rozmiar);
	wybor(opcja, tablica, rozmiar);
	
	int i;
	for (int j = 1; j < rozmiar; ++j)
	{	
		int x = tablica[j];
		
		i = j - 1;
		
		while (i >= 0 && tablica[i] > x)
		{//por+1
			tablica[i+1] = tablica[i];//zam
			i = i - 1;
			por++;
		}
		tablica[i+1] = x;
		zam++;
		
	}
	std::cout << std::endl;
	wypisz(rozmiar, tablica);
	
	delete [] tablica;
}


void test(int zam, int por, int* zamiana, int* porownania)
{		
	int help_zam;
	int help_por;
	
	for(int i = 1; i <= 100; i++)
	{
		zam = 0;
		por = 0;	
		for(int j = 0; j < 10; j++)
		{
			int* tab;
			IS(tab, (i*100), 2);
			help_zam += zam;
			help_por += por;
			delete [] tab;
		}
		
		zamiana[i - 1] = help_zam/10;
		porownania[i - 1] = help_por/10;	
	}
}

int main()
{
	int opcja;
	int rozmiar;
	std::cout << "Podaj rozmiar ";
	std::cin >> rozmiar;
	
	std::cout << "1. Ciag posortowany odwrotnie" << std::endl;
	std::cout << "2. Ciag losowy" << std::endl;
	std::cin >> opcja;

	
	
	
	IS (tablica, rozmiar, opcja);
	test(zam, por, zamiana, porownania);
	wypisz(100, zamiana);
	wypisz(100, porownania);

	
	getch();
}

0

tutaj:

void ustaw(int* tablica, int rozmiar)
{
        tablica = new int[rozmiar];
}

ustawiasz wskaźnik na jakiś obszar pamięci - wszystko ładnie pięknie, ale zapominasz, że wskaźnik jest przekazywany przez wartość, więc rezerwujesz pamięć, ale wskaźnik nadal wskazuje na ścianę! Powinieneś zwracać ustawiony wskaźnik, albo przekazywać przez referencję.

Druga rzecz to taka, że parametr przesłania zmienną globalną. Albo zrezygnuj z parametru, albo zrezygnuj ze zmiennej globalnej. Ja proponuję skorzystać z drugiej opcji.

EDIT:
Nie zauważyłem, że masz tam wywołania rekurencyjne - w takim razie podstawowym błędem jest tu wykorzystanie zmiennych globalnych

0

Wiem, że to może zabrzmi glupio, ale mógłbyś napisać konkretnie co, jak i na co zmienić? Wcześniej nie bawiłem się wskaźnikami i nie ogarniam tego.

0

wywal "const int rozmiar = 10000"
i zmien:
int* ustaw(int* tablica, int rozmiar)
{
tablica = new int[rozmiar];
return tablica;
}

proponowalbym jeszcze zastapienia getch()/conio.h - getchar()/cstdio oraz wszystkie naglowki ze standardowej biblioteki c zapisujemy usuwajac ".h" i dodajac "c" na poczatku np. cstdlib itp.

0

Cały czas wywala z tym samym komunikatem

0

Wyjasnij mi do czego sluzy funkcja test bo bez niej program spelnia swoje przeznaczenie ?

A zrobilem nastepujace rzeczy:

  1. Wyrzucilem ta stala rozmiar na gorze.
  2. Zmodyfikowalem funkcje ustaw, zeby zwracala ten obszar pamieci, ktory przydziela
  3. W funkcji IS przypisalem te pamiec argumentowi.
  4. Zakomentowalem 3 linijki: wywolanie funkcji test i 2 linijki funkcji wypisz pod funkcja test.

Program w ten sposob dziala poprawnie tzn. w przypadku wyboru opcji 1. wypelnia tablice wartosciami rozmiar - i
, a w przypadku opcji 2. losowymi wartosciami, i wypisuje te tablice, nastepnie sortuje i znowu wypisuje tablice posortowana.

0

W zadaniu jest "dla każdego n należy wykonać wielokrotne losowanie ciągu wejściowego i wyświetlić uśrednione dane". Dla ciągu losowego miała zliczać i usredniać ilość porównań i zamian.

0

Przemysl w takim razie jeszcze raz ta funkcje poniewaz po wynikach moge stwierdzic, ze nie dziala zgodnie z przeznaczenie, ale zaden blad nie wywala tylko ilosc wyswietlen tej tablicy jest na tyle przerazajaca, ze raczej nie o to Ci chodzilo.

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