<div dir="ltr">Salut, Mihai!<div><br></div><div>Cum a spus și Adrian, în primul rând nu este OK întotdeauna să întoarcem valoarea errno-ului în caz de eroare. Spre exemplu, dacă programul nostru trebuie să iasă ca urmare a altor erori, și nu în urma unei erori a unui apel de sistem, atunci errno-ul va ramâne setat pe Sucess/0, iar programul nostru se va termina cu succes.</div><div><br></div><div>O altă mențiune este că majoritatea apelurilor de sistem eșuează cu valoarea -1 (sau valori negative în general), care în bash este translatată la 255. Deși și dacă ai vrea să verifici dacă procesul s-a întors cu o valoare negativă, nu ai putea.</div><div><br></div><div>Poți să ne dai un exemplu concret în care schimbarea adusă de tine este utilă?</div><div><br></div><div>Numai bine,</div><div>Răzvan</div><div dir="ltr"><div><br></div><div><div class="gmail_quote"><div dir="ltr">On Tue, Mar 6, 2018 at 4:39 PM Adrian Pop via so <<a href="mailto:so@cursuri.cs.pub.ro" target="_blank">so@cursuri.cs.pub.ro</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Salut!<br>Nu m-am prins daca ai intrebat sau nu ceva, insa pot sa spun ca nu este obligatoriu sa:<br>- folosim DIE (de exemplu in caz ca vrem sa dezalocam memoria, nu este prea ok)<br>- intoarcem neaparat codul intors de apelul de sistem, in cazul unei erori<br><br>Pentru partea cu DIE, poti tu pur si simplu sa pui exit(-1) in macro (sau sa ai un #define FAIL_CODE -1) si asa mereu vei avea un cod de return negativ (asa cum se recomanda si in enuntul temei). Pentru a elibera si memoria in cazul unei erori sau a returna exact codul apelului de sistem care a generat eroarea in program, iti poti face propriul mecanism (de exemplu o functie helper, un macro DIE modificat sau un efect de tip waterfall in cazul unei erori).<br><div style="text-align:justify"><span style="font-size:12.8px">Ca sa avem comportament diferit in functie de platforma (de exemplu sa folosim <span style="font-size:12.8px">GetLastError() pe Windows) ar trebui sa avem <span style="color:rgb(51,51,51);font-family:Verdana,"Lucida Grande",Lucida,Helvetica,Arial,sans-serif;font-size:13px;text-align:justify">directive de preprocesare de forma </span></span></span><font color="#333333" face="Verdana, Lucida Grande, Lucida, Helvetica, Arial, sans-serif">#ifdef _WIN32, ceea ce este interzis la aceasta tema.<br><br>Spor!<br>Adrian Pop</font></div></div><div class="gmail_extra"></div><div class="gmail_extra"><br><div class="gmail_quote">2018-03-06 16:16 GMT+02:00 Mihai Popescu via so <span dir="ltr"><<a href="mailto:so@cursuri.cs.pub.ro" target="_blank">so@cursuri.cs.pub.ro</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">Bună ziua,<br><br>Ne este spus în laboratoare și teme să folosim macro-ul DIE pentru verificarea codului de eroare întors de un apel de sistem.<br>Am observat că în resurse [1], [2] este implementat apelând exit(EXIT_FAILURE). Acest lucru face ca procesul să intoarcă de fiecare dată 1, nu codul de eroare întors de un apel de sistem, deoarece EXIT_FAILURE este definit astfel în stdlib.h :<br>#define EXIT_FAILURE   1  /* Failing exit status.  */<br><br>Codul de eroare poate fi luat:<br>  - în Linux din errno, macro definit în errno.h<br>  - în Windows apelând GetLastError()<br><br>Pe acesta ar trebui să îl returneze și procesul.<br><br>[1] <a href="https://ocw.cs.pub.ro/courses/so/laboratoare/resurse/die" target="_blank">https://ocw.cs.pub.ro/courses/so/laboratoare/resurse/die</a><br>[2] <a href="https://ocw.cs.pub.ro/courses/so/laboratoare/resurse/c_tips" target="_blank">https://ocw.cs.pub.ro/courses/so/laboratoare/resurse/c_tips</a><br></div></blockquote></div></div><br></blockquote><div><br></div><div> </div></div></div></div></div>