Error "program has triggered a breakpoint" i niepoprawne wczytywanie tablic

0

W skrócie: pisząc zachłanny algorytm rozwiązujący problem plecakowy mój program wyrzuca błąd. Właściwie nie wiem skąd on się bierze, na początku wyczytałam w internecie że to nieprawidłowe zwalnianie pamięci może powodować, ale za bardzo nie wiem co tutaj jest nie tak... (?)
Gdyby ktoś był tak miły i miałby chęć na to spojrzeć to byłabym bardzo wdzięczna!

#include <stdio.h>
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <stdlib.h>


using namespace std;

struct przedmiot
{
	int waga;
	int wartosc;
	double stosunek;
};

int compare2(const void * a, const void * b)
{

	przedmiot *orderA = (przedmiot *)a;
	przedmiot *orderB = (przedmiot *)b;

	if (orderB->stosunek > orderA->stosunek)
	{
		return 1;
	}
	if (orderB->stosunek < orderA->stosunek)
	{
		return -1;
	}
	return 0;
}

int zachlanny(int W, int w[], int p[], int n, int sum = 0, int waga = 0)
{	
	int i;
	przedmiot *przedmioty = new przedmiot[n];
	for (i = 0; i < n; i++);
	{ 
	  cout<<p[i]<<" "<<w[i]<<endl;
		przedmioty[i].stosunek = (double)p[i] / (double)w[i];
		cout<<przedmioty[i].stosunek<<" to stosunek"<<endl;
		przedmioty[i].waga = w[i];
		przedmioty[i].wartosc = p[i];
	}
	qsort(przedmioty, n, sizeof(przedmiot), compare2);
	int a = 0;
	while (waga <= W && a < n)
	{	
		if (waga + przedmioty[a].waga <= W)
		{
			waga += przedmioty[a].waga;
			sum += przedmioty[a].wartosc;
			cout<<"waga to: "<<waga<<" a suma to: "<<sum<<endl;
		}
		a++;
	}
	cout << "Zachlanny: " << sum << endl;
	return 0;
}

int compare(const void * a, const void * b)
{
	return (*(int*)a - *(int*)b);
}

int main()
{	
	srand(time(0));
	int n = rand() % 10 + 1;
	int W = rand() % 50 + 1;
	cout << "W to: " << W << endl;
	int* val = new int[n];
	int* wt = new int[n];
	for (int i = 0; i < n; i++)
	{
		val[i] = rand() % 20 + 1;
		wt[i] = rand() % 20 + 1;
	}
	qsort(wt, n, sizeof(int), compare);
	for (int i = 0; i < n; i++)
  {
    cout<<"wart: "<<val[i]<<" waga: "<<wt[i]<<endl;
  }
	zachlanny(W, wt, val, n);


	//system("pause");
	return 0;
}

Wygląda na to, że moje tablice nie wczytują się poprawnie do funkcji :| dlaczego?

0

W którym miejscu w kodzie ten błąd występuje?

1

Jak piszesz w C++ to nie używaj nagich alokacji/dealokacji i nieczytelnych funkcji sortujących. std::vector i std::sort poprawią czytelność kodu.

3

Typowy błąd ze średnikiem:

    for (i = 0; i < n; i++);    // ten średnik wykonuje pętlę bez jakiejkolwiek akcji
    {
        // Ten blok wykonuje się jeden raz z  i = n
        cout<<p[i]<<" "<<w[i]<<endl;
        przedmioty[i].stosunek = (double)p[i] / (double)w[i];
        cout<<przedmioty[i].stosunek<<" to stosunek"<<endl;
        przedmioty[i].waga = w[i];
        przedmioty[i].wartosc = p[i];
    }

zmienna i jest równa zawsze zmiennej n, co skutkuje srogim jechaniem po pamięci, gdyż wszystkie tablice kończą się na indeksie n - 1.

Tak jak radzi Ci kolega @kq - używaj vector'a i STL'a gdzie tylko możesz. Unikniesz takich kłopotów.
No i debuguj swój kod - wyłapiesz takie błędy samodzielnie.

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