Pamięć(?) - szeregowanie zadań

Pamięć(?) - szeregowanie zadań
LO
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 11 lat
  • Postów:7
0

Dobry wieczór,

Napisałam program rozwiązujący problem szeregowania zadań korzystając z algorytmu genetycznego (mniej istotna część wstępu :) ). Pewna część programu jest powtarzana wielokrotnie i za którymś, chyba niezbyt określonym razem program się wysypuje (przy wcześniejszych iteracjach wszystko działa bez zarzutu), więc jedyna myśl, która przychodzi mi do głowy to problemy z pamięcią, ale że jestem początkującym programistą, to nie do końca się na tym znam.

Dlatego proszę o rzucenie okiem, czy wstawiony przeze mnie fragment kodu może generować jakieś problemy pod względem pamięciowym? W felernej iteracji pojawia się "d" ale "e" już nie.

Kopiuj

    cout<<"d ";
    for (int y=0; y<10; y++)                       ///iteracja po 10 zadaniach
    {
        int masz=zadania[kolejnosc[y]].operacja1[0]-1;         //kazde zadanie=3 operacje
        long int kolumny2=0;
        if (zadania[kolejnosc[y]].operacja1[1]>0)       //dopoki operacja jeszcze nieskonczona
        {
            for(long int kolumny=0; kolumny<10000; kolumny++)
            {
                if (glowna[masz][kolumny]==0)
                {
                    if (zadania[kolejnosc[y]].operacja1[1]<=0)
                        break;
                    else
                    {
                     glowna[masz][kolumny]=1;       //w tablicy uporzadkowan wstawiam 1
                     zadania[kolejnosc[y]].operacja1[1]--;
                    }
                }
                else
                    if (glowna[masz][kolumny]==2)  //komorka zajeta przez maintenance
                    {
                        if (glowna[masz][kolumny-1]==1)   
                        {
                                kara+=int(ceil(0.3*zadania[kolejnosc[y]].operacja1[1]));
                        }                                             //naliczamy kare za przerwanie operacji
                    }
                            kolumny2=kolumny;
            }
        }
        kolumny2+=1;
        long int kolumny3=0;
        int masz2=zadania[kolejnosc[y]].operacja2[0]-1;

        if (zadania[kolejnosc[y]].operacja2[1]>0)
        {
            for(kolumny2; kolumny2<10000; kolumny2++)
            {
                if (glowna[masz2][kolumny2]==0)
                {
                    if (zadania[kolejnosc[y]].operacja2[1]<=0)
                        break;
                    else
                    {
                     glowna[masz2][kolumny2]=1;
                     zadania[kolejnosc[y]].operacja2[1]--;
                    }
                }
                else
                    if (glowna[masz2][kolumny2]==2)
                    {
                        if (glowna[masz2][kolumny2-1]==1)
                        {
                                kara+=int(ceil(0.3*zadania[kolejnosc[y]].operacja2[1]));
                        }
                    }
                            kolumny3=kolumny2;
            }
        }

        kolumny3++;
        int masz3=zadania[kolejnosc[y]].operacja3[0]-1;
        if (zadania[kolejnosc[y]].operacja3[1]>0)
        {
            for(kolumny3; kolumny3<10000; kolumny3++)
            {
                if (glowna[masz3][kolumny3]==0)
                {
                    if (zadania[kolejnosc[y]].operacja3[1]<=0)
                        break;
                    else
                    {
                     glowna[masz3][kolumny3]=1;
                     zadania[kolejnosc[y]].operacja3[1]--;
                    }
                }
                else
                    if (glowna[masz3][kolumny3]==2)
                    {
                        if (glowna[masz3][kolumny3-1]==1)
                        {
                                kara+=int(ceil(0.3*zadania[kolejnosc[y]].operacja3[1]));
                        }
                    }
            }
        }

     }
     cout<<"e ";

Każde zadanie ma 3 operacje, dlatego w powyższym kodzie jest praktycznie 3 razy to samo.

Czy ktoś jest w stanie znaleźć problem? Cały kod w załączniku (wszystkie deklaracje itp.)

Z góry dziękuję za odpowiedź

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Wywal ten kod, bo do niczego innego się nie nadaje. Następnie przepisz w wersji dla ludzi. Tak zeby twoja mama potrafiła ten kod przeczytać. I nie, nie pisz "przecież tak sie nie da". Zaręczam że sie da.
Ja w tym kodzie widze tylko pętle, operacje matematyczne i zmienne o enigmatycznych nazwach. Nie widzę tu algorytmu. Ty zresztą też nie, stąd twój problem.
A gdyby ten kod wyglądał tak:

Kopiuj
void cośtam(){
  for(int i=0;i<10;i++){
      przetwarzajZadanie(i);
  }
}

void przetwarzajZadanie(int n){
    przetwarzajOperacje1(n);
    przetwarzajOperacje2(n);
    przetwarzajOperacje3(n);
}

void przetwarzajOperacje1(int n){
    //jakaś magia
    if(operacjaNieSkonczona(n)){
        magiaZKolumnami();
    }
}

Widzisz pewną różnicę? Ten kod da się przeczytać. Z tego kodu nawet twoja mama będzie potrafiła zrozumieć do czego on służy.
Hint: jeśli musisz wstawić w kodzie komentarz który wyjaśnia "co się dzieje" to znaczy że powinna to być nowa funkcja z opisową nazwą.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
LO
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 11 lat
  • Postów:7
1

Zawsze się da:

Kopiuj

int kara=0;

void wszystkiezadania()
{
	for (int y=0; y<10; y++)
	{
		wstawdotabeli(y);
	}
}

void wstawdotabeli(int y)
{
	wstawoperacje1(y);
	wstawoperacje2(y);
	wstawoperacje3(y);
}



bool czyoperacjaskonczona(int y)
{
	if (zadania[kolejnosc[y]].operacja1[1]>0)
		return false;
	else
		return true;
}

void wstawoperacje1(int y)
{
	int maszynadlaoperacji1=zadania[kolejnosc[y]].operacja1[0]-1;
	long int kolumny2=0;
	if (czyoperacjaskonczona(y)==false)
		for (long int kolumny=0; kolumny<1000; kolumny++)
			badamyiuzupelniamy(y, kolumny, maszynadlaoperacji1);
}

void badamyiuzupelniamy (int y, int kolumny, int maszynadlaoperacji1)
{
	if (czykomorkapusta(kolumny, maszynadlaoperacji1)==true)
	{
		przypiszjednostkeoperacji1(maszynadlaoperacji1, kolumny);
		zmniejsziloscpozostalychjednostekoperacji1(y);
	}
	else
	{
		if (czykomorkazajetamaintenancem(kolumny, maszynadlaoperacji1) == 
			if (czykomorkawlewojestzadaniem(kolumny, maszynadlaoperacji1)==true)
				kara+= naliczkare(y);

	}
}

int naliczkare(int y)
{
	return int(ceil(0.3*zadania[kolejnosc[y]].operacja1[1]));
}

bool czykomorkawlewojestzadaniem(kolumny, maszynadlaoperacji1)
{
	if (glowna[maszynadlaoperacji1][kolumny-1]==1)
		return true;
	else
		return false;
}


bool czykomorkazajetamaintenancem(int kolumny, int maszynadlaoperacji1)
{
	if (glowna[maszynadlaoperacji1][kolumny]==2)
		return true;
	else
		return false;
}


bool czykomorkapusta(int kolumny, int maszynadlaoperacji1)
{
	if (glowna[maszynadlaoperacji1][kolumny]==0)
		return true;
	else
		return false;
}

void przypiszjednostkeoperacji1 (int maszynadlaoperacji1, kolumny)
{
	glowna[maszynadlaoperacji1][kolumny]=1;
}

void zmniejsziloscpozostalychjednostekoperacji1(y)
{
	zadania[kolejnosc[y]].operacja1[1]--;
}

Funkcje dla pozostałych 2 operacji analogiczne, główna to tablica dwuwymiarowa- zmienna globalna, zadania- wektor zawierający obiekty klasy Zadanie, kolejnosc- tablica określająca w jakiej kolejności mają być szeregowane zadania.

BB
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:100lica
  • Postów:79
0

Obawiam się, że ta druga wersja jest teraz jeszcze bardziej nieczytelna niż ta pierwsza O_o - przynajmniej takie pierwsze wrażenie :]
Jeśli mogę coś poradzić to:
przed każdą wykonaną pętlą zrób sobie coś takiego:

Kopiuj
cout << "check 1 (2,3,...n): pętla for ... y = " << y << "max rozmiar: " << nazwa_zmiennej_zamiast_10 << " -> jeszcze działa! ;D " << endl; //lub coś w tym stylu 

i zrób tak przed rozpoczęciem wykonania się każdej pętli/warunku etc.
W ten oto prosty sposób znajdziesz miejsce, gdzie Ci się program wywala -> bo do tego momentu będziesz miał wyświetlony każdy komunikat. Jeśli wyświetlisz sobie numer pętli oraz inne istotne informacje z kodu to znalezienie problemu to kwestia 5 minut.

Natomiast druga rada, która wynika z szybkiego zniechęcenia analizowania Twojego kodu to: używaj ludzkich zmiennych w pętlach a przede wszystkim nie używaj stałych w pętlach... tzn. nie rób tak:

Kopiuj
for (int y=0; y<10; y++)

tylko np. tak:

Kopiuj
for(int i=0; i<normalna_nazwa_zmiennej_reprezentujacej_ilosc_wykonywanych_obliczen; i++)

Z zawodu księgowy. Programować dopiero się uczę, więc proszę o wyrozumiałość ;). W kręgu zainteresowań: sztuczna inteligencja (SSN, AG, LR etc.).
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Jest lepiej niz było, ale jeszcze daleko z tym do dobrego kodu. Bo widzisz twój kod jest równie czytelny jak ten który pokazałem jako przykład, ale weź pod uwage że ja nie wiem co ten algorytm miał robić! Z mojego przykładowego kodu nie da sie tego wyczytać i niestety z twojego kodu też nie. Pytałaś swoją mamę/siostrę czy teraz rozumie ten kod? ;)

Jeśli chodzi o szukanie co się wysypało to ja bym to zwyczajnie odpalił z debugera. Jak się wysypie to debuger powie ci gdzie i co sie stało.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)