Eu de obicei folosesc:<br><br>#define DEBUG 1<br>#define log if( DEBUG == 1 )<br><br>și pentru a afișa informație de debug:<br><br>log printf( "orice sintaxă suportată de printf, cu sau fără __LINE__ sau alte 'magical constants' " );<br>
<br>sau pentru afișări complexe (exemplu o matrice):<br><br>log {<br> for i ...<br> for j ..<br> printf ...<br>printf ...<br>...<br>...<br>...<br>}<br><br>Are 2 probleme:<br><br>1. Într-adevăr adaugă un jump la fiecare if.<br>
2. Trebuie avut grijă la folosirea sintaxei:<br> if( test == 1 )<br> log printf( "Testul e 1");<br> else<br> log printf( "Testul nu e 1" );<br> "else"-ul de aici va acționa pentru "if( DEBUG == 1 )" în loc de "if( test == 1)" - bine se rezolvă ușor asta dar se poate întâmpla din neatenție.<br>
<br>Pentru punctul 1 se rezolvă repede în varianta release. Ștergi #define log și apoi toate blocurile cu log în față. În caz că îți scapă vreunu va da compilatorul eroare deci implicit vor fi toate scoase.<br><br>Mi se pare foarte interesante și metodele voastre. Le voi încerca.<br>
<br>Numai bine,<br> - Geo<br><br><div class="gmail_quote">2011/3/6 Razvan Deaconescu <span dir="ltr"><<a href="mailto:razvan.deaconescu@cs.pub.ro">razvan.deaconescu@cs.pub.ro</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">On 03/06/2011 10:55 PM, Adrian Scoica wrote:<br>
>><br>
>> 1) Când faci debugging, vrei să nu afișezi doar un mesaj ci, de dorit,<br>
>> fișierul și linia care a generat mesajul.<br>
><br>
> Pentru linia curenta din fisier, se poate folosi macro-ul __LINE__<br>
> (cate 2 caractere '_'). __LINE__ functioneaza fie in mod absolut<br>
> (numarand de la inceputul fisierului), fie in mod relativ (numara<br>
> incremental de la ultima directiva #line din fisier). De exemplu:<br>
><br>
> /* asta e linia 4 */<br>
> printf("%d",__LINE__); /* se afiseaza 5 */<br>
> #line 100<br>
> printf("%d",__LINE__); /* se afiseaza 100 */<br>
<br>
</div>și __FILE___ pentru fișier. Astfel, o formă bună de print debugging devine:<br>
<div class="im"><br>
---<br>
#ifdef DEBUG_<br>
#define LOG(a) \<br>
</div> fprintf(stderr, "%s [%d]: %s\n", __FILE__, __LINE__, a) \<br>
<div class="im">#else<br>
#define LOG(a) \<br>
do { } while (0) \<br>
#endif<br>
---<br>
<br>
</div>Din păcate, presupune că a este șir ceea ce poate nu este cazul, poate<br>
îmi doresc să afișez un mesaj mai complex, ca mai jos.<br>
<div class="im"><br>
>> 2) Nu vrei să afișezi doar un string ci poate o afișare de forma printf.<br>
>> Adică LOG("x = %d, y = %d\n", x, y);<br>
><br>
> In C++, poti afisa o variabila intr-un macro doar stiindu-i numele. De<br>
> exemplu, daca ai:<br>
><br>
> #define LOG(a) (std::cerr<< a << "\n")<br>
><br>
> atunci poti afisa astfel:<br>
><br>
> LOG("valoare(x): " << x << ", valoare(y) " << y);<br>
<br>
</div>Nu mă pricep la C++ așa că te voi crede pe cuvânt că se poate :-)<br>
<div class="im"><br>
> Exista si in C o metoda mai generica? :-?<br>
<br>
</div>Da, există. Folosind Variadic Macros[1][2]. Cine vine cu o propunere<br>
care să includă Variadic Macros?<br>
<br>
Răzvan<br>
<br>
[1] <a href="http://en.wikipedia.org/wiki/Variadic_macro" target="_blank">http://en.wikipedia.org/wiki/Variadic_macro</a><br>
[2] <a href="http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html" target="_blank">http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html</a><br>
<div><div></div><div class="h5">_______________________________________________<br>
<a href="http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii" target="_blank">http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii</a></div></div></blockquote></div><br><br clear="all"><br>-- <br>Pandia Gheorghe<br>Emails: <a href="mailto:gheorghe.pandia@gmail.com">gheorghe.pandia@gmail.com</a>, <a href="mailto:gheorghe.pandia@yahoo.com">gheorghe.pandia@yahoo.com</a><br>
Tel: +40762684476<br>Yahoo!-Messenger-ID: gheorghe.pandia<br>Website: softproblem_dot_com<br>Blog: polidrop.host56_dot_com<br>LinkedIn: ro.linkedin_dot_com/in/gheorghepandia<br>Twitter: twitter_dot_com/gheorghepandia<br>