Bezpodstawne nadanie zmiennej horrendalnej wartości

0

Mam oto takich kilka urywków kodu (za duży by temat był czytelny, ograniczam się do dotyczących zmiennej urywków), w których używam pewnej zmiennej do przechowywania tymczasowej wartości. Jednakże ona w kilku nieokreślonych przeze mnie dokładniej przypadkach nabiera horrendalnej wartości.
Oto jej deklaracja:

long unsigned cache_sz=0;

Tutaj jest jej główne zastosowanie, zbieranie/przechwycenie informacji, które potem zostaną usunięte po pobraniu:

unsigned straty=0, efektywnosc=60, efektownosc=20;
double procent_o;
long unsigned j+=random(efektywnosc,0);

// obliczenie wartości zmiennej j [...] w żadnym wypadku nie przekracza ona wartości kilku tysięcy
for(int i=1;i<=zy;i++) {
                // obliczenia
                procent_o=procent(naj, zy);
                efektywnosc+=rab*15;
                efektownosc+=naj*7;
                for (int y=1;y<=zy;y++) {
                        if (random(100,0)<efektywnosc) j+=random(efektywnosc,0);
                        else if (random(100,0)>efektywnosc) {
                            if (random(100,0)>procent_o) ++straty, --amount[6];
                        }
                }
                loading(1);
}
// koniec obliczeń j

cache_sz=j;
static_cast<long unsigned>(cache_sz); // wynik desperackiego wyszukiwania błędu, sam nie wiedziałem co już robić w związku z problemem.

Wspomniana funkcja random.

int random(int skala, int odejmij) {
    int nLosowana;
    do {
            nLosowana = (rand() % skala + 1) - odejmij;
    } while (nLosowana <= 0);

    return nLosowana;
}

Później następuje wyczyszczenie informacji ze zmiennej.

long unsigned zysk=calculate()+cache_sz;
sz+=zysk; /* najważniejsza część, bo w niej chyba tkwi cały galimatias. Sęk w tym, która zmienna ma tak ogromne wartości, sz czy calculate(). Wyszło że calculate() jest w porządku. */
cache_sz=0;

Funkcje calculate() i procent().

long unsigned calculate() {
         long unsigned zysk_infra=amount[0]*income[0]+amount[1]*income[1]+amount[2]*income[2]+amount[3]*income[3]+amount[4]*income[4];
         return zysk_infra;
}

double procent (double u1, double u2) {
 double wynik;
 wynik = u1 / u2;
 wynik *= 100;
 return wynik;
}

Dlaczego więc po uruchomieniu kodu i przechwyceniu informacji zmienna 'zysk' ma jakąś horrendalną wartość? np. 400 tys. około. Moim zdaniem była to niezgodność typów zmiennych, więc przestawiłem się na long unsigned, potem desperacko chwyciłem się brzytwy w postaci static_cast, a teraz sam już nie wiem.

Proszę, nie ignorujcie mnie. Każda odp. jest w cenie!

1

I chcesz powiedzieć że kompilator nic nie krzyczy?
long unsigned j+=random(efektywnosc,0);

0
Tobruk napisał(a):

Każda odp. jest w cenie!

  1. Use debugger, Luke!
  2. wartość zmiennej zależy bezpośrednio od wartości j, jak wygląda jej deklaracja i wcześniejsze użycie?
0
_13th_Dragon napisał(a):

I chcesz powiedzieć że kompilator nic nie krzyczy?
long unsigned j+=random(efektywnosc,0);

troszke rozszerze zeby autor nie musial dlugo sie zastanawawiac

po rozwinieciu tej linijki co bedzie?
j = j + random

a co masz pod j w trakcie dodawania? do j dodajesz smieci + random wiec dostajesz smieci

unsigned long j = 0
j += random(...)

0

Aj, zagapiłem się i wziąłem trochę z wcześniejszej wersji zaraz przed zmianie.

long unsigned j=0; j+=random(efektywnosc,0);

Co do debuggera to temat na inny wątek, bo używam Code::Blocks do pisania kodu a DevC++ do kompilowania xD
W CB nie działa mi ani wbudowany MinGW ani inne ustrojstwa. Poprawiałem ścieżki do /include itp. ale ten z Deva towarzyszy mi od początku programowania (wł. hobby ;p).

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