• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Stack overflow - programowanie dynamiczne

VPS Starter Arubacloud
0 głosów
384 wizyt
pytanie zadane 12 marca 2018 w C i C++ przez Andrzej Cioska Nowicjusz (220 p.)
edycja 12 marca 2018 przez Andrzej Cioska

Cześć!

Piszę program, który na podstawie dwóch wartości (czas i atrakcyjność) wybierze najlepszą kombinację miejsc do odwiedzenia w określonym czasie. Pierwsze kroki w programowaniu dynamicznym. Całość mniej więcej hula, ale w linijkach, które zamknąłem w komentarzu (/*...*/) znajduje się coś, co doprowadza do błędu 3221225725 (stack overflow). Ma ktoś jakiś pomysł? :)

 

#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;

void wybor(double tab[][2], int n);
int main(int argc, char** argv) {
	int n, program, metoda;
	double nominaly[n][2], egipt[5][2], czas;
	string miejsca[5];
	cout<<"Wybierz program:\n1. Nominaly\n2. Egipt\n";
	cin>>program;
	cout<<"Wybierz metode:\n1. Zachlanna\n2. Dynamiczna\n";
	cin>>metoda;
	cout<<endl;
	switch(program) {
		case 1:
			double kwota;
			cout<<"Podaj liczbe wykorzystywanych nominalow: ";
			cin>>n;

			cout<<"\nWpisz dostepne nominaly oddzielajac je znakiem ENTER: \n\n";
			for(int i=0; i<n; i++) {
				cout<<i+1<<". ";
				cin>>nominaly[i][0];
			}
			wybor(nominaly, n);

			cout.precision(15);
			cout<<"\nPodaj kwote do zwrocenia (czesci dziesietne oddziel kropka, a nie przecinkiem): ";
			cin>>kwota;
			int ile;
			for(int i=n-1; i>=0; i--) {
				ile=0;
				while(kwota>=nominaly[i][0]) {
					kwota-=nominaly[i][0];
					ile++;
					nominaly[i][1]=ile;
				}
			}
			if(kwota<0.01) kwota=0;
			if(kwota==0) {
				for(int i=n-1; i>=0; i--) {
					if(nominaly[i][1]!=0) {
						cout<<"Nominalu "<<nominaly[i][0]<<" uzyto "<<nominaly[i][1]<<" razy."<<endl;
					}
				}
			} else cout<<"Nie da sie wyplacic reszty podanymi nominalami";
			break;
		case 2:
			fstream dane;
			dane.open("dane.txt", ios :: in);
			//if(dane.good()==true) cout<<"ok";
			for(int i=0; i<5; i++) {
				dane>>miejsca[i];
				//cout<<miejsca[i]<<" ";
				dane>>egipt[i][0]>>egipt[i][1];
				//cout<<egipt[i][0]<<" "<<egipt[i][1]<<endl;
			}
			dane.close();
			cout<<"Podaj czas wycieczki (wielokrotnosc 0.5) z zakresu <0, 8>:"<<endl;
			cin>>czas;
			int ind=4;
			double atrakcja=0;
			switch(metoda) {
				case 1:




					cout<<"Plan wycieczki:\n";
					while(ind>=0) {
						if(czas-egipt[ind][0]>=0) {
							cout<<miejsca[ind]<<", ";
							atrakcja+=egipt[ind][1];
							czas-=egipt[ind][0];
						}
						ind--;
					}
					cout<<endl<<"Atrakcyjnosc wycieczki: "<<atrakcja;
					break;

				case 2:
					int rzut=(int)(czas*2);										//wyznaczanie plecaków
					double skok[rzut];
					int roznica;
					for(int i=1; i<=rzut; i++) {
						skok[i-1]=0.5*i;
					}
					double tab[rzut][5];

					for(int i=0; i<rzut; i++) {									//wypełnienie pierwszego rzędu
						if(egipt[0][0]<=skok[i]) tab[i][0]=egipt[0][1];
						else tab[i][0]=0;
					}
					for(int i=1; i<=4; i++) {
						for(int j=0; j<rzut; j++) {
							cout<<egipt[i][0]<<endl;
							if(egipt[i][0]==skok[j] && egipt[i][1]>tab[j][i-1]) {
								tab[j][i]=egipt[i][1];
								continue;
							}
	/*
	roznica=(int)(egipt[i][0]*2);
    cout<<roznica;
	if(egipt[i][0]<skok[j] && (egipt[i][1]+tab[j-roznica][i-1])>tab[j][i-1]) {
	tab[j][i]=egipt[i][1]+tab[j-roznica][i-1];
	continue;
	}*/
							tab[j][i]=tab[j][i-1];
						}
					}
					cout<<tab[rzut-1][4];

					break;

			}










			break;

	}

	return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 12 marca 2018 przez adrian17 Ekspert (344,100 p.)
wybrane 13 marca 2018 przez Andrzej Cioska
 
Najlepsza

Nie patrzyłem na wskazane linie (może gdzieś tam wychodzisz poza tablicę; debugger lub dużo printowania pewnie pomoże to znaleźć), natomiast pierwsza rzecz którą zauważyłem:

    int n, program, metoda;
    double nominaly[n][2], egipt[5][2], czas;

Zmienna `n` nie ma wartości. W takim razie `nominaly[n][2]` nie ma sensu.

komentarz 12 marca 2018 przez Andrzej Cioska Nowicjusz (220 p.)
"n" ma wartość, użytkownik ją podaje :)

Reszta programu działa bez problemu, chodzi stricte o wskazane linie. Szukałem wyjścia poza tablicę i nie znalazłem, stąd moje pytanie.
1
komentarz 12 marca 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
No nie ma sensu, bo używasz wartości zmiennej n, zanim użytkownik tę wartość określi.
1
komentarz 12 marca 2018 przez adrian17 Ekspert (344,100 p.)

Reszta programu działa bez problemu, chodzi stricte o wskazane linie

(U mnie się wysypuje na samym początku, właśnie przez tą tablicę.)

komentarz 12 marca 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Inna sprawa, że określanie wielkości tablicy statycznej niestałą zmienną jest w C++ niepoprawne.
komentarz 12 marca 2018 przez Andrzej Cioska Nowicjusz (220 p.)
Panowie, dziękuję Wam za wskazanie tego problemu, jednak poruszamy się wokół czegoś trywialnego :) Równie dobrze mógłbym usunąć tę tablicę, ponieważ w miejscu, które wyrzuca błąd, ona nie jest w ogóle używana. Niemniej poprawię :D
Ma ktoś jakiś pomysł na rozwiązanie faktycznego problemu? :P
komentarz 12 marca 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
To o czym piszemy jak najbardziej może być przyczyną błędu. Możliwe, że wartość niezainicjowanej zmiennej n jest bardzo duża przez co program chce zaalokować na stosie zbyt dużo pamięci doprowadzając do jego przepełnienia. Niemniej nie da się przewidzieć co się będzie dało w tym programie, bo ma on niezdefiniowane zachowanie.
komentarz 13 marca 2018 przez adrian17 Ekspert (344,100 p.)

Ma ktoś jakiś pomysł na rozwiązanie faktycznego problemu? :P

Próbowałem odpalić z instrumentacją do sprawdzania błędów pamięci, ale potyka się właśnie na samym początku kodu, więc nie mam jak dalej dedukować.

Podtrzymuję drugą opcję, że najprościej będzie jak odpalisz funkcję w debuggerze i/lub dodasz tuzin `cout << wartosc` przed każdym indeksowaniem.

komentarz 13 marca 2018 przez Andrzej Cioska Nowicjusz (220 p.)
Oczywiście mieliście rację, mój brak wiary wynikał z tego, że ciągle piszę w archaicznym Dev'ie, który mi takie buble przepuszcza. Jak wrzucałem tę tablicę do komentarza, to program nadal się wysypywał, a nie mogłem skorzystać z debuggera, bo crash'owało na samym początku. Problem, o który mi chodziło już zlokalizowałem, leżał on w zmiennej "roznica", jakieś 100 linijek dalej ;)

Dzięki!

Podobne pytania

0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 2 grudnia 2020 w Algorytmy przez wojtek_suchy Mądrala (6,880 p.)
0 głosów
0 odpowiedzi 147 wizyt
pytanie zadane 31 sierpnia 2019 w Offtop przez reaktywny Nałogowiec (40,650 p.)
0 głosów
0 odpowiedzi 483 wizyt

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...