6 maja 2009

Niebezpieczne makra cz I.

Wczoraj wieczorem zabrałem się za rozwiązanie zadania z pracowni z ASD. Trochę za późno się za to wziąłem, bo na dwie godziny przed oddaniem programu byłem na etapie czytania treści zadania. Po napisaniu programu zająłem się debugowaniem. Doszedłem do wniosku, że błąd tkwi w poniższej pętli warunkowej.
if (j-KLOCKI[i] >= 0)
assign(TAB[j-KLOCKI[i]][p2], TAB[j][p1]);
else
assign(TAB[KLOCKI[i]-j][p2], TAB[j][p1]+KLOCKI[i]-j);
Przyglądałem się bardzo uważnie tym instrukcjom, ale nie umiałem dojść dlaczego program nie wchodzi do instrukcji w ciele else. Pomocną informacją może okazać się że assign to makro:
#define assign(a,b) if ((a) < (b)) a = (b)
Mógłbym popsuć wam zabawę i napisać gdzie tkwi błąd. Jednak tego nie zrobię. Opiszę to dopiero w następnej notce. Życzę miłej zabawy :-)

3 komentarze:

Anonimowy pisze...

tak na szybko pisze ;)
wydaje mnie sie, ze rozwiniecie makra spowoduje, ze cialo 'else' wpadnie pod 'if-a' z makra.
ale moge sie mylic ;)

MJK pisze...

Zauważyłem po chwili. Zabawne :)

stdin pisze...

Prościej i bezpieczniej, używa się tak samo:

template <typename A, typename B>
inline void assign(A &a, B b) {
if (a < b) a = b;
}