erwit
#cpp #programowanie

Mikrobki, dlaczego licznik (counter) nie dziala?

#include "iostream"

int counter;

int A(int n, int m)

{

counter++;

if(n==0)

return m+1;

else

{

if((n>0)&&(m==0))

return A((n-1),1);

else

if((n>0)&&(m>0))

return A(n-1,A(n,m-1));

}

}

int main()

{

int n, m;

counter=0;

std::cin>>n>>m;

std::cout<
return 0;

}
  • Najlepsze
  • Wszystkie komentarze
Lrrr
Lrrr
Lrrr
6
@erwit: bo jest błąd
KrzaQ2
@erwit: Licznik działa, ale to co robisz to UB. Nie wolno w jednej linijce zmieniać zmiennej i jej odczytywać bez sekwencjonowania.
Lrrr
Lrrr
Lrrr
1
@kineczka1981: hehe prawdziwa
Rincewind
std::cout<
std::cout<<"counter: "<

Kolejność ewaluacji parametrów funkcji jest niezdefiniowana. A przeciążony operator jest funkcją. Nie można powiedzieć, w jakiej kolejności będzie ci się wykonywać ten cały łańcuch „operatorów”

<<

–
KrzaQ2
@erwit: Chodzi o to, ƶe zmieniasz counter w wywołaniu A() a jednocześnie odczytujesz go w tym samym wyraƶeniu. Zrób

cout << A() << endl; cout << counter;
Rincewind
@erwit: Tam nie ma błędu. Nigdzie nie jest zmieniana żadna wartość.
KrzaQ2
@Rincewind: Wiki nie ma racji w tym przypadku :P

If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.


~ n3337 (aka darmowa wersja standardu C++11)
KrzaQ2
@erwit: Jeśli chcesz głębokość rekurencji sprawdzić to dodaj dodatkowy argument do funkcji - depth i przekazuj depth+1 za kaƶdym razem. a do globalnego countera przypisuj max(counter,depth), gdzie counter jest globalny a depth podany od rodzica.
GrabkaMan
@erwit: iostream w <>bo to nie jest stworzona przez Ciebie biblioteka.

Ponadto napisz sobie

Using namespace std;

Po include. Wtedy możesz usunąć wszystkie std z tekstu. Będzie bardziej przejrzysty.
erwit
erwit Autor
0
@GrabkaMan: z tymi klamerkami od biblioteki, racja, edytor mi automatycznie zrobil...

nie mniej nie zmienia to nic w kwestii licznika wywolan rekurencji
KrzaQ2
k.....1
k.....1
@Lrrr: mega wyczerpująca odpowiedż:DD
GrabkaMan
No nie zmienia. Xd

Jestem z telefonu, a tutaj się ciężko jakieś kody ogarnia. Jsk nikt nie pomoze to e domu sprawdzę. ;-)

@erwit:
erwit
erwit Autor
0
@KrzaQ2: mam po prostu napisac

counter;

counter++; ?

edit: tak tez nie dziala... nie wiem o co chodzi, przeciez ta zmienna jest zadeklarowa