Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

14
► Programare ► Mingw ► Ice an ice ► C++ programming

Transcript of Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

Page 1: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 114

Sign In Create Account

Started by OriginalCopy Dec 05 2012 1015 middot

Page 1 of 2

SUBIECTENOI

laquo 1 5 raquo

Forumul Cheilor Nerei

Problema placuta ram

Driver webcam

Asigurare locuinta

Ce facultate sa aleg

Mai multe tipuri de sitemap

Amplificator Cougar C5004 1600W

Setare DNS Ubuntu Server

Decodare Samsung GTshyS6310 orange

Redirected(2014)

Mai pot salva aceasta bucata de t

constructie casa CRYSSTONE

[Unde] gasesc o etimologie buna p

Cum se pot trimite fisiere de cap

Credit microintreprindere

Unde pot gasi o inregistrare a em

Lucruri pe care orice programator ar trebui să le ştie

gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa View New Content

OriginalCopy Posted 05 December 2012 shy 1015

Acest articol este o icircncercare de a prezenta o imagine de ansamblu cu destule detalii tehnice interconectate pe care am observat ca multi dintrecei ce icircntreaba pe forum nu le stiu Contine lucruri pe care mi leshyam sintetizat eu singur deshya lungul timpului Daca peste 50 din lucruri icircti suntnoi icircti recomand citirea sa de doua ori pentru ca nu vei putea sintetiza toate lucrurile dintrshyo singura citire (nimeni nu poate)

1 De ce am nevoie pentru a invata sa programez Cel mai important lucru de care ai nevoie nu este un program sau o carte ci modul tau de gandire shy the mindset

Curiozitatea este un factor foarte important Trebuie sa fii curios cum functioneaza lucrurile si sa doresti sa intelegi in adevaratulsens al cuvantului Punctele urmatoare iti vor numi programe precum compilator sau IDE dar nu te multumi doar cu atat Cauta saintelegi ce implica procesul de compilare de unde stie un compilator ce trebuie sa faca din ce pasi este compusa compilarea ce rezultatare compilarea samd Probabil stii ca a programa inseamna a crea programe shy dar teshyai intrebat vreodata ce este defapt unprogram ce este defapt un proces Gandeste cerceteaza si analizeaza profund termenii si tehnologiile de care te lovesti

De exemplu daca tishye lene si nu simti dorinta de a intelege procesul de compilare ci I just want the damn program to clickaround atunci nu are rost sa iti omori timpul si energia cu programarea shy nu ai avea succes incearca altceva care te pasioneazaSi asa am ajuns la al doilea criteriu shy terminologia Invatshyo bine si corect si folosesteshyo Daca setul de scule de programarefolosite este lancea ta de programator atunci terminologia este varful lancei Care e diferenta dintre un toiag tocit si o lance fara varfExact nici una Nu te apuca sa folosesti termeni pe care nushyi intelegi ci documenteazashyte inainte Cu o lance ascutita

te vei putea intelege mai usor cu alti programatori Tu ii vei intelege pe ei si ei pe tinepe masura ce termenii intelesi de tine devin mai complecsi vei putea acumula cunostinte din ce in ce mai complexe bazate pecele anterioare in ritm exponential La inceput ti se va pare frustrant insa daca vrei sa devii bun oricum va trebui sa invetitermenii odata sishyodata Deci de ce sa nu faci totul ca la carte de la bun inceput

Trebuie sa fii inteligent Inteligenta nu se masoara in notele de la scoala ci in cat de complexe sunt gandurile pe care ti le faci tusingur fara impulsuri din exterior Obisnuiesc sa le numesc inteligenta reproductiva si inteligenta productiva

De exemplu ai incercat vreodata sashyti argumentezi existenta sau inexistenta divina Teshyai folosit de citate sau ce ai auzit de la altiiDaca da atunci aia se numeste inteligenta reproductiva

Deci cauta un subiect care te intereseaza bulverseaza sau incita la gandire si incearca sa argumentezi productiv dezvoltand un corpde idei propriu pe careshyl intelegi Cat de departe ajungi Crezi ca ce citesti acum e mult blabla In esenta tot ce am facut a fost sa unificcele trei caracteristici ale modului de gandire necesare in programare mentionate pana acum

Nota alt criteriu este sa nushyti fie teama de matematica Sa zicem ca cunostintele tale de matematica nu conteaza insa cu cat stiimai multa cu atat vei fi un programator mai bun scriind algoritmi mai performantiSi astfel am ajuns la a patra caracteristica esenta profunzimea in gandire In programare vei scrie cod te vei uita la el si vei fifericit ca merge Tin sa te dezamagesc nu codul in sine este opera de care ar trebui sa fii mandru ci felul in care ai combinat tot cestii Pe baza intelegerii termenilor si tehnologiilor ai reusit sa combini intrshyun mod profund concepte pe care initial leshyai acumulatseparat Si nu din greseala am folosit acumulat in loc de invatat ci pentru a uni cele doua caracteristici curiozitatea si profunzimeaAstfel voi inlantui a cincea caracteristica a mindsetshyului de profunzime atunci cand iti spui da am reusit sashyl fac sa mearga Ce estegresit cu acest mod de gandire Incearca sa gandesti profund si sa gasesti singur explicatia pe baza celor spuse pana acum Abia apoiverificashyte citind mai jos

Nu este suficient ca un program scris si gandit profund de tine pe baza propriei inteligente productive sa mearga pentru camerge ci pentru ca asa lshyai gandit tu sa functioneze Altfel spusnu lasa nimic la voia intamplarii Programarea este o stiinta exacta calculatoarele sunt automate finite(httpenwikipediaorgwikiFinite_state_machine) mai exact spus ideile algoritmii pe care ii poti transmite unui procesor sunt

Programare Mingw Ice an ice C++ programming

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 214

asain spiritul punctului anterior imaginatia joaca un rol important trebuie sashyti imaginezi toate felurile de input chiar si cele pentrucare programul nu este gandit defapt

In plus trebuie sa incerci sashyti dezvolti capacitatea de analiza si sinteza Este un proces anevoios si continuu si merge manashynmana cu imaginatia insa la un moment dat iti vei dezvolta un simt pentru cum trebuie impartita o problema mai mare in subproblemecare nu numai ca sunt mai mici dar sunt si reutilizabile si (cu timpul) fara greseli (bugshyfree)

Reutilizarea codului in noi proiecte nu numai ca va conduce la mai putine erori (deoarece codul e bugshyfree) ci iti va creste si ritmul derezolvare a problemei sau vei putea aborda probleme mai complexe fara sa te concentrezi mereu asupra acelorasi (sub)problemesimple si frustrante pe care leshyai rezolvat deja in proiectele trecute

Cu ajutorul imaginatiei si in spiritul reutilizarii codului iti poti imagina ce functii sau clase noi trebuie sa introduci care nu numai cashyti rezolva problema curenta ci pe care le vei putea reutiliza in proiectele urmatoareshyshyshy acesta este secretul meseriei in programareInvata engleza Obisnuiesteshyte sa acumulezi cunostinte in engleza deoarece resursele in engleza sunt cele mai actuale si cele maicorecte Cele in romana pur si simplu sunt inconsistente datorita lipsei celui mai important aspect terminologiaSfat pentru liceeni sunteţi icircn perioada icircn care vă dezvoltaţi gacircndirea deci faceţi exact asta dezvoltaţishyvă gacircndirea inginerească

Nu aveţi nevoie de icircmbuibare cu algoritmi cacircnd sunteţi icircn liceu e suficient să exploraţi cacirct mai multe structuri de date şi să vă gacircndiţi lautilitatea fiecăreia icircn natură apoi să rezolvaţi probleme cu ele eventual combinate Nu probleme din culegere ci probleme propriiinventate shy chiar dacă e vorba doar despre parcurgerea unui arbore sau a unui graf

Icircnvăţaţi icircn primul racircnd limbajul foarte bine Apoi treceţi la cel puţin alte două limbaje shy icircnvăţate foarte bine Nu contează care fiecarelimbaj icircţi lărgeşte orizontul

Apoi folosiţi diferite biblioteci librării vedeţi cum rezolvă şi alţii probleme cum scriu cod şi de ce Implicaţishyvă icircn openshysource lachestii simple shy exersaţi icircnţelegerea şi corectarea de cod care nshya fost scris de voi Obişnuiţishyvă să citiţi specificaţii formale şi săexploraţi necunoscutul

Acest gen de aptitudini sunt mult mai importante icircn perioada icircn care icircncă eşti icircn formare

Cacircnd veţi intra la facultate veţi avea toate sculele necesare pentru a vă focusa pe problemele cu adevărat interesante rezolvate prinalgoritmicămatematică fără a mai pierde timpul cu acele lucruri mărunte pe care le ştiţi deja

PS Nu aveţi nevoie de icircmbuibare cu algoritmi nu icircnseamnă să fugiţi de algoritmi Cacircnd rezolvaţi probleme practice veţi vedea la ce ebună sortarea unui vector sau generarea tuturor permutaţiilor sau care poate fi legătura dintre arbori şi O(log(N)) etc shy ideea estedezvoltaţishyvă intuiţia faţă de acest gen de icircntrebări e mult mai importantă decacirct algoritm peste algoritm peste algoritm Aveţi timpdestul pentru algoritmi şi oricum mereu veţi da de ceva algoritmi specializaţi de care nshyaţi auzit pacircnă atunci şi pe care trebuie săshyicombinaţi Iar icircn acest caz intuiţia soft skills şi capacitatea de a lucra cu necunoscutul sunt mult mai de ajutor decacirct studierea timp de4 ani a algoritmilor (care icircntre noi fie vorba icircn şcoală e o rasoleală oricum)

2 Cu ce sa incep cu C sau cu C++Cu C Motive

1 tot ce inveti intrshyunul din limbaje poate fi usor transpus in celalalt deci ce inveti in C iti va fi util in C++ mai tarziu2 Cshyul pur este mai curat decat C++ cu cin si cout In C vei programa procedural Treci la C++ cand incepi sa programezi obiectual3 C si C++ sunt ambele limbaje foarte puternice si des folosite4 C++ nu este neaparat mai bun decat C Exista lucruri care sunt cel mai bine facute in C si nu in C++5 Incepand cu C te poti opri la un moment dat (dupa mine punctul ideal este dupa intelegerea pointerilor si lucrul dinamic cu memoria)

si intelege ce faci cu adevarat ce este un program un proces ce inseamna compilare linkare si in mod ideal si un mic excurs in ASM(1shy2 saptamani poate mai mult dupa interes)C++ insa iti ascunde sau mai bine zis prin multitudinea de features pe care le pune la dispozitie nu iti stimuleaza curiozitateacatre lowshylevel

6 Daca in liceu (sau chiar facultate) ti sshya spus ca programezi in C++ insa nu ai intalnit sau folosit termeni precum clasa templateSTL atunci tin sa te dezamagesc limbajul pe careshyl folosesti este defapt C si tot ce ai folosit din C++ sunt cel mai probabil obiectelestdcin si stdcout declarate in iostream (numit mai sus C cu cin si cout)

daimon on 25th May 2009 1621 said

O mica obiectie daca icirci pot spune asa legata de ordinea icircnvatarii limbajelor La facultatea mea (si din cacircte stiu la toate) ordinea de

icircnvatare a limbajelor este C shy CPP shy JAVA Or pe mine ca beginner C mshya icircnnebunit Pacircna si Pascal avea un mod primitiv pentru a declara

obiecte C icircn schimb mshya azvacircrlit icircn hardware calcule cu pointeri prin stive si alte chestii care pe un icircncepator sigur nushyl coafeaza Nushyi

vorba de skill e vorba de atractivitate Bun noi trebuie icircn final sa stim tot deci nu se pune Icircnsa

Eu unul sugerez oricui sa icircnceapa cu Java sau Cpp partea cu obiecte E intuitiva si pentru tembeli testat icircn practica Poate nu ajungi mai

mult de un codeshymonkey cu asta dar macar faci primul pas si nushyti bagi piciorul dupa cacircteva scanf() mai dure Plus ca un obiect pot sa tishyl

desenez folosind UML si are logica direct vizual Nu degeaab un program C odata ce creste devine din ce icircn ce mai greu de depanat daca

nu lshyai icircmpartit de la icircnceput prin fisiere si headere ca sa nu icircncurci lucrurile

Just my two cents

Eu unul nu am avut probleme cu C ca primul meu limbaj E adevarat teoretic facusem algoritmica in pascal la scoala (in generala)

Teoretic practic insa la scoala invatam algoritmii pe de rost si nu pricepeam nici macar de ce se numeste writeln si nu readln eramde parere ca ar trebui numite invers (nu pricepeam ca sunt numite din perspectiva masinii nu a omului) Nu radeti atat de jalnic eramla programare

In timpul liceului mshyam apucat de C (ca hobby nu la scoala) si fara profesor doar cu carti si resurse de pe web am inteles zic eu mai

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 314

mult decat ma asteptam Deci cred ca asta cu limbajul tine mai mult de cat de copt la minte dar mai ales cat de entuziasmat esti cand teapuci sa studiezi si nu de limbajul in sine Totul poate fi inteles daca te pasioneaza chiar si pointerii si chiar si fara profesor (si ca saplusez chiar si in limbi straine pe care nu le stapanesti cum trebuie engleza (teoretic o invatam de 5 ani practic insa de 2 ani shy si laasta eram mizerabil in generala ) si germana (de 1 an si totusi am inteles bine multe cu cartea de pe pronixde shy una din cele mai

bune carti IT care mishya cazut in mana si pe care ishyo recomand oricarui vorbitor de lb germana))

Deci stereotipul cum ca C este greu este doar o chestiune de atitudine si entuziasm care sunt si abordate in punctul 1 al sfaturilor mele(care au bineinteles o alura de subiectivitate shy stim bine ca obiectivitate absoluta nu exista)

PS nu degeaba am tinut sa mentionez ce elev mediocru eram in relatia mea cu informatica ci tocmai pentru a sublinia ca nu sunt cinestie ce geniu si ca entuziasmul chiar conteaza

PPS un debugger este pentru elevul C similar cu UML pentru elevul C++JavaDelphi shy iti arata exact ce se intampla doar ca lowshylevelE foarte important sa inveti sashyl manuiesti (cel putin cateva comenzi de baza) chiar daca iti e greu ca incepator

3 Ce fac defapt cand programezCand programezi scrii un text cu o anumita sintaxa si semantica text care contine descrierea unor algoritmi Acest text urmeaza sa fieconvertit din limbajul folosit si inteles de oameni (C sau C++ de exemplu) intrshyun limbaj binar inteles de CPU

4 De ce are un compilator nevoie de o sintaxa fixaDeoarece un compilator nu este nimic altceva decat un program iar programele care sunt executate de procesoarele actuale nu suntinteligente

5 Ce inseamna defapt sintaxaSintaxa unui limbaj de programare este setul de reguli din care este compus un limbaj De exemplu o regula sintactica ne spune ca un tip dedate (de exemplu int) trebuie sa fie urmat de unul sau mai multe spatii sau linii noi si apoi unul sau mai multi identificatori de variabileseparati prin virgula iar la sfarsit caracterul Alta regula sintactica ne spune ca un identificator este o litera sau caracterul _ urmat de zerosau mai multe litere caracterul _ sau cifre

Atat si nimic mai mult Nu este corect sa te intrebi care este sintaxa pentru a afla daca un numar este prim ci care este algoritmul pentru aafla daca un numar este prim sau nu

6 Ce inseamna semanticaSemantica inseamna semnificatie int de exemplu inseamna numar intreg iar int ialtfel spus int urmat de un identificator inseamnadeclara si aloca identificatorul i de tip numar intreg

7 Ce este un algoritmUn algoritm este un set de instructiuni care rezulta in cod executat de CPU pentru a rezolva o problema De exemplu pentru a numaradescrescator de la 10 pana la 0 algoritmul ar arata astfel1 initializeaza numarul cu valoarea 102 afiseaza numarul3 daca numarul este mai mare decat zero atunci31 scade 1 din numar32 sari la pasul 24 altfel41 sfarsit program

Posibile solutii in C ar arata astfel

int i

for(i=10igt=0ishyshy)

printf(d i)

sau (tradus cuvant cu cuvant)

int i

i=10

pas2

printf(d i)

if(igt0)

ishyshy

goto pas2

sau (cel mai elegant dupa parerea mea)

int i

i = 10

do

printf(d i)

while(ishyshy)

Atentie int i nu face parte din algoritm pentru ca instructiunea e folosita de compilator la compilare si nu va deveni parte a programuluiexe rezultat ca atare ci intrshyun alt mod (vezi mai jos despre alocarea statica a memoriei)

8 Ce inseamna declararea unei noi variabileAtunci cand declari o variabila ceea ce faci se numeste alocarea statica a memoriei Dupa cum iti poti imagina daca exista o alocarestatica atunci exista si una dinamica dar despre asta mai tarziu

Corect spus insa nu tu aloci memorie ci ii spui compilatorului sa o faca Acea variabila va fi inclusa in fisierul exe generat Din astadeducem ca cu cat declaram mai multe variabile cu atat marimea fisierului exe generat creste Continuarea explicatiei in urmatoareaintrebare

9 De ce o variabila are nevoie de un tip de date (precum int in exemplul de mai sus)Variabila in sine asa cum va fi folosita in programul exe binar nu va avea un tip de date explicit insa compilatorul are nevoie de tipul dedate pentru a sti cati bytes sa aloce si deci implicit cu cati bytes sa mareasca executabilul

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 414

Pentru a afla cu cat creste un executabil cu fiecare variabila foloseste operatorul sizeof()

printf(un int ocupa d bytessizeof(int))

shyshyshy defapt tipul de date este folosit de compilator si pentru a decide ce instructiuni binare pentru CPU sa scrie in executabil pentru ca atribuireaunei valori de tip char are o alta instructiune CPU decat cea pentru atribuirea unei valori de tip integer (e doar un exemplu dar exemple sunt ogramada) in practica trebuie sa aloci static foarte multe variabile pentru a observa o diferenta in marime sizeof() este un operator nu o functie si este evaluat la compilare ca orice alt operator

intrebare de profunzime pur teoretic daca CPUshyul tau si sistemul de operare sunt pe 64 biti si scrii si compilezi un program care afiseazamarimea unui integer program pe care ishyl trimiti si unui prieten cu un sistem pe 32 biti de ce pe ambele calculatoare ar afisa 8 chiar dacape calculatorul prietenului tau marimea unui integer este defapt 4

10 Ce este defapt o variabilaO variabila asa cum este ea folosita de un programator este o colectie de patru elemente

1 un nume sau identificator util compilatorului si programatorului2 o valoare3 un tip de date util compilatorului pentru a sti cum sa manipuleze acea variabila4 o adresa de memorie

11 Cum aflu adresa de memorie a unei variabileFolosind operatorul unar amp de exemplu

int i

printf(adresa variabilei i este pampi)

In C cu siguranta ai folosit deja scanf() pentru a citi valoarea unei variabile

int i

printf(introduceti i)

scanf(dampi)

Ei bine acel apel la scanf() se traduce cam asa citeste un numar intreg (specificat de d) si salveazashyl la adresa variabilei i12 Cand foloseste compilatorul valoarea unei variabile si cand foloseste adresa sa

In afara de cazul explicit in care folosesti operatorul amp compilatorul foloseste cele doua caracteristici (din totalul de patru) la compilare astfel

atunci cand atribui o valoare (constanta precum 10 mai sus sau variabila) unei variabile i compilatorul foloseste adresa acesteia

i = 10

j = n

prima instructiune se citeste copiaza constanta 10 la adresa variabilei i iar a doua copiaza valoarea variabilei n la adresa variabileijIn termeni tehnici ceea ce se afla in stanga operatorului de atribuire se numeste left value sau pe scurt lvalueIn exemplul de mai sus insa variabila n este tratata ca rvalue iar pe compilator il intereseaza valoarea sa

13 Ajutor Toti termenii astia ma deruteazacompilare linkare header IDE biblioteca

Scopul acestei sectiuni este sa iti explice teoria si utilitatea practica a tuturor acestor notiuni Categoric trebuie sa le intelegi Vei instala unmediu curat de programare de la zero componenta cu componenta si vei invata cum conlucreaza acestea si ce rol are fiecare

Intra pe httptdmshygcctdragonnetdownload (httptdmshygcctdragonnetdownload) si descarca OnshyDemand Installer Acest program vainstala compilatorul numit gcc Mai exact va instala portul gcc pentru windows numit MinGW (minimalist GNU for windows) gcc fiindcompilatorul standard pentru lumea GNULinux

Un port al unui program este o adaptare a acelui program pentru o alta platforma

Vrem sa folosim TDM pentru a instala MinGW deoarece MinGW nu dispune de un instalator comun si fara el ar trebui sa instalam totulmanual ceea ce e destul de complicat

Muta instalatorul intrshyun director nou creat Cprogramare Cu el vei putea si administra instalarile TDM deja existente (ca cea pe careurmeaza sa o creezi)

Nota poti instala orice oriunde vrei tu insa in continuare voi folosi foarte mult aceste cai deci tishyai face un bine daca ai urma exactinstructiunile mele

Daca ceva nu functioneaza cum trebuie si ai instalate alte scule de programare precum DevshyCpp CodeBlocks sau altele dezinstaleazashyletemporar Nu vei fi nevoit sa dezinstalezi Visual Studio sau Borland C++

Alege optiunea Create pentru a crea o noua instalare In urmatoarea pagina pentru Installation Directory introduCprogramarecompilator (fara ghilimele)

In rest instalarea cu valorile predefinite ar trebui sa fie perfecta

Acum in StartshygtAll programsshygtMinGW ai o legatura catre interfata CLI (httpenwikipediaorgwikiCommandshyline_interface) a sistemuluide operare cunoscuta sub windows si ca msshydos prompt Ceea ce face aceasta legatura este practic sa importe niste setari prin fisierulCprogramarecompilatormingwvarsbat

Cand ii dam drumul ne va pune automat in directorul Cprogramarecompilator Asta nu este neaparat o problema insa mult mai bine ar fidaca neshyar pune intrshyun director special unde ne vom tine noi proiectele Insa pentru asta trebuie mai intai sa cream un astfel de director Deci

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 514

creaza directorul Cprogramareproiecte

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vinede la change directory) in proiecte

cd proiecte

Inchide orice msshydos prompt daca il mai ai deschis si relanseazashyl Acum ar trebui sa te afli in Cprogramareproiecte

Bun avem totul setat si organizat intrshyun mod curat Acum hai sa cream un nou proiectAsta nu inseamna nimic mai mult sau mai putin decat a crea un nou subdirector in proiecte numit hello in care ne vom salva toatefisierele proiectului Deci introdu comanda necesara

mkdir hello

(mkdir = make directory)apoi schimba directorul curent in noul subdirector creat

cd hello

Hai sa facem ceva ce probabil stii sa scriem un cod sursa si sa testam in final daca totul functioneaza cum trebuie

edit mainc

Apoi introdu codul sursa

include ltstdiohgt

include ltstdlibhgt

int main(void)

printf(hello world)

return EXIT_SUCCESS

(nota la sfarsitul fisierului se afla o linie noua goala Asta este parte din standardul actual si modern al limbajului C)

In meniul editorului selecteaza File shygt Save si apoi File shygt Exit

Acum avem un fisier mainc care abia asteapta sa fie compilat Deci introdu comanda

gcc shyWall mainc

shyWall este un parametru si ii spune compilatorului sa genereze avertizari (W vine de la warnings) pentru toti (all) pasii ce implica ocompilare Este bine sa pui shyWall de fiecare data astfel compilatorul te va avertiza despre eventualele greseli pe care leshyai facut

Daca nu ai facut nicio greseala atunci compilatorul nu va afisa nimic El va genera insa un fisier aexeIl poti lansa in executie introducand in prompt

aexe

Ar trebui sa vezi pe ecran textul hello world

Fisierul se numeste din motive istorice aexe Daca vrem ca outputul compilatorului sa se numeasca altfel trebuie sashyi spunem asta prinparametrul shyo ltnume programgt shyo vine de la output Asadar ar trebui sa introducem

gcc shyWall shyo helloexe mainc

Am testat deci instalarea si totul functioneaza perfect Insa noi nu neshyam indeplinit misiunea sa intelegem sculele pe care le folosim si cumfunctioneaza acestea macar cat de cat Asta ne va face niste programatori mai buni

Deci vom face cateva experimente pe care le vom analiza pentru a ne putea explica cele mai importante concepte Unele dintre experimentevor genera erori ceea ce e dorit (eu vreau sa fac lucruri anormale pentru a demonstra ceva) Experimentele contin si explicatii teoretice sidemonstratii practice

1 Experiment 1 compilare si linkare

Compilatorul nostru numit gccexe (gcc vine de la GNU C Compiler) neshya compilat anterior codul sursa si a generat directexecutabilul Compilarea este constituita insa din mai multi pasi de la codul sursa scris in C pana la fisierul executabil care contineinstructiuni executate de electronica din CPU e drum lung Pe rand pasii acestia sunt

a preprocesare preprocesorul proceseaza toate instructiunile dedicate lui adica toate instructiunile care incep cu astainclude si directiva preprocesor include pe care am folositshyo si noi in programul nostru include practic include un fisieriar rezultatul arata de ca si cum continutul fisierului inclus ar fi fost scris de noi manual in maincPentru a vedea rezultatul acestui pas trebuie sa ii pasam compilatorului parametrul shyE care ii spune sa se opreasca imediatdupa pasul de preprocesare

gcc shyWall shyE shyo maini mainc

Deschide fisierul generat maini si wow o gramada de cod sunt peste 600 de linii de cod C foarte valid si necesar pentru caamarata noastra de functie main() (care se afla la sfarsitul fisierului) sa functioneze cum trebuie

b asamblare outputul acestui pas este inrudit cu un alt limbaj numit limbaj de asamblare (sau scurt ASM) InstructiunileASM coincid aproape 11 cu instructiunile binare care vor fi executate de CPU Acesta este ultimul pas care va fi inteligibil destulincat sa ne ofere informatii despre ce va face procesorul Outputul urmatorului pas (compilarea) este deja mult prea binar pentruun programator ordinar

Lui gcc ii spunem sa se opreasca dupa pasul de ansamblare cu parametrul shyS

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 614

Putem refolosi fisierul preprocesat maini astfel

gcc shyWall shyS shyo mains maini

sau ii putem spune compilatorului sa o ia de la capat incepand cu mainc sa salveze temporar un nou fisier preprocesat si sashylasambleze pe acela oprindushyse dupa pasul de asamblare

gcc shyWall shyS shyo mains mainc

In ambele cazuri comenzile sunt aceleasi Ceea ce difera este extensia fisierului de input (i sau c) in functie de care gcc decidece este de facut (daca mai este necesara o preprocesare sau nu)

Aruncand un ochi in fisierul asamblat mains ne regasim stringul ascii hello world0 care ne arata clar ca un string in C setermina in caracterul NUL (nu NULL) vedem si numele functiilor folosite precum main sau printf chiar daca acestea suntprecedate de unul sau doua _ si mai vedem si instructiuni ASM De exemplu instructiunea ASM

call __main

apeleaza functia noastra main() Insa dupa cum observi ea nu este nicidecum primul lucru executat de procesor (desi cusiguranta ti sshya spus la scoala main shy aici incepe programul) Compilatorul a adaugat automat pentru noi alte instructiuniinaintea sa instructiuni care pregatesc apelul efectiv Pentru a intelege cu adevarat ce se intampla aici este necesara studierealimbajului ASMc compilare in acest pas datele preprocesate sunt compilate iar outputul se numeste codshyobiect Acest cod obiect continepractic instructiunile CPU care vor constitui programul nostru efectiv Insa el nu contine detaliile care fac un executabil sa fie unexecutabil recunoscut ca atare de sistemul de operare El contine insa referinte la alte resurse (mai mult sau mai putin) externedespre care vom vorbi intrshyun experiment viitor referinte pe care leshyai vazut si in fisierul ASM precum _printf Codul obiectcontine simplificat vorbind instructiunile pure binare si nimic altceva

Si la acest pas putem refolosi outputul oricaruia dintre pasii anteriori ca input insa ii putem spune lui gcc sa se opreasca dupapasul de compilare cu parametrul shyc

gcc shyWall shyc shyo maino mains

sau

gcc shyWall shyc shyo maino maini

sau

gcc shyWall shyc shyo maino mainc

Gcc va decide in functie de tipul inputului ce fisiere temporare trebuie sa genereze Insa cum noi avem deja cel mai apropiat tipde input (fisierul asamblat) de ceea ce vrem (codul obiect) doar prima varianta are sens Astfel putem creste viteza de compilare(deoarece pasii intermediari de preprocesare si asamblare nu mai sunt necesari)

Insa de la orice input am pleca outputul maino va fi identic

Aruncand un ochi pe fisierul rezultat maino observam ca nu pricepem mare lucru deoarece outputul compilarii nu mai este untext cum a fost in cazul preprocesarii si al asamblarii ci un fisier binar cu instructiuni CPU Acele instructiuni vor fi executatede circuitele electronice din CPU

Totusi ne regasim textul hello world si vedem si nume precum printf sau main functii care apar si in programDeci rezultatul compilarii maino cel putin pare a reflecta in mare ce am scris noi in mainc si deci secvential si in maini simainsd linkareAcesta este ultimul pas in traducerea lui mainc din limbajul C in limbajul binar al CPUshyului Deoarece e ultimul pas lui GCC nutrebuie sashyi spui sa se opreasca la un anumit pas cum ai facut cu shyE pentru procesare shyS pentru asamblare sau shyc pentrucompilare Nu trebuie decat sashyl hranesti cu input provenit de la oricare output din pasii anteriori sau cu mainc insusi GCC isiva genera fisierele temporare de care are nevoie Cum noi avem insa outputul cel mai apropiat de ceea ce vrem cel mai eficienteste sashyl linkam pe acesta

gcc shyWall shyo helloexe maino

A linka inseamna a crea legaturi Pasul acesta creaza legatura dintre codul obiect din fisierul o si biblioteca standard C (pescurt libc stdlibc sau sub windows vei mai intalni si numele de msvcrt) In experimentul urmator vom vedea ce este aceastastdlibc si ce rol areConcluziiAm aflat ca ceea ce numeam pana acum compilare este defapt o serie de pasi (preprocesare asamblare compilare linkare)ordonati iar fiecare pas are ca input outputul pasului anterior Totul pleaca de la codul sursa scris de programator si se ajungela fisierul executabil care este (in principiu) inputul unei alte componente de data aceasta una hardware procesorul insusi

Compilarea este defapt tehnic corect vorbind doar acesta al treilea pas din ceea ce intelegeam inainte prin compilare

Compilatorul GCC ne lasa sa ne oprim dupa oricare dintre acesti pasi cu unul dintre parametrii shyE shyS sau shyc Astfel putem vedeaexact ce se intampla sub capota

In experimentele viitoare vei vedea ca in mod obisnuit nu vei avea deshya face cu datele de iesire ale pasilor de preprocesare siasamblare insa des vei fi confruntat cu utilizarea parametrului shyc chiar si in viata de zi cu zi de programator

Urmatoarele experimente vor vorbi mai indeaproape despre sculele de programa existente despre biblioteci IDEshyuri si alte detalii

Asigurashyte ca ai inteles mai intai toate lucrurile de mai sus pentru a castiga o claritate cat mai mare din cele ce urmeaza shy altfel nu

vei intelege mare lucru din experimentele viitoare

14 Ce este biblioteca standard

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 714

Biblioteca standard este o biblioteca care ii este pusa implicit la dispozitie unui cod sursa Limbajul C are o biblioteca standard numitacolocvial stdlibc limbajul C++ are o biblioteca standard numita colocvial stdlibc++

Bibliotecile standard vin de obicei la pachet cu setul de scule (compilator linker etc) de programare folosit Astfel se face ca gcc (mingw) neofera o biblioteca standard visual c++ ne ofera o alta biblioteca standard samd

Toate aceste biblioteci respecta mai mult sau mai putin un standard comun (standardul ISO C care specifica intregul limbaj ChttpenwikipediaryISO_Standard (httpenwikipediaorgwikiC_standard_libraryISO_Standard) ) de aceea nu conteaza cu cecompilator compilam un program care foloseste doar lucrurile standard

Noi vom folosi ca si pana acum compilatorul gcc cu biblioteca sa standard

Compileaza codul sursa anterior mainc al programului hello world astfel

gcc shynostdlib mainc

Parametrul shynostdlib ii spune linkerului (numit ldexe un program la fel ca gccexe) apelat in spatele cortinei de compilatorul gccexe sanu includa biblioteca standard in programul nostru

In output vedem concret cum gcc a generat acele fisiere temporare codshyobiect (o) si cum ld (ld returned 1 exit status) returneaza eroare (acelreturn 0 pe care il scrii tu in programe ii spune sistemului de operare ca procesul tau sshya terminat cu succes ei bine aici programul ldexeface pe undeva return 1 pentru ashyi spune apelantului (aici gccexe si nu sistemul de operare pentru ca nu ai introdus tu ldexe pentru alinka manual codul obiect al lui maino cu biblioteca standard) ca procesul sshya terminat cu o eroare

Quote

TempccD9bI55omainc(text+0xa) undefined reference to amp96__main

TempccD9bI55omainc(text+0x16) undefined reference to amp96printf

collect2 ld returned 1 exit status

Hai sa incercam acelasi lucru si manual generarea de cod obiect si linkshyarea manuala

Introdu

gcc shyc mainc

Acum pentru a linka invoca linkershyul ld (toti parametrii trebuiesc scrisi pe o singura linie)

Quote

ld shyBdynamic

cprogramarecompilatorlibcrt2o cprogramarecompilatorlibgccmingw32441crtbeginoshyLCprogramarecompilatorlibgccmingw32441 shyLcprogramarecompilatorlibgcc shyLCprogramarecompilatormingw32lib shyLCprogramarecompilatorlib

maino

shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt shyluser32 shylkernel32 shyladvapi32 shylshell32 shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt

cprogramarecompilatorlibgccmingw32441crtendo

(Nota 441 ar trebui sa fie inlocuit cu versiunea gcc folosita de tine)

Asupra parametrului shyBdynamic voi reveni mai tarziu

Dupa cum vezi sunt linkshyate mai intai doua fisiere codshyobiect pe care nu leshyam scris noi crt2o si crtbegino Hai sa vedem ce se afla in crt2oIntroducd Cprogramarecompilatorlibnm crt2o

aceasta ultima comanda va afisa toate simbolurile dintrshyun fisier codshyobiect (lib o a la) Printre acele simboluri vedem si simbolul__main despre care se plangea ld ca nushyl gaseste atunci cand am folosit parametrul shynostdlib pentru gcc

Dupa cum stii din unele din punctele anterioare simbolul printf nu exista este numit _printf deci hai sa ne uitam dupa el (ca sa neasiguram ca exista si ca nimic nu e magic) in biblioteca msvcrt

nm cprogramarecompilatorliblibmsvcrta gt libmsvcrtnm

apoi deschide fisierul text nou creat libmsvcrtnm si cauta dupa _printf shy vei vedea ca e acolo

Parametrul shyBdynamic de mai sus spune ca se va linka dinamic cu biblioteca standard O linkare dinamica sub windows inseamna ca intrshyun final se vor apela functii aflate in fisiere dll (precum _printf) shy de exemplu in msvcrt70dll (70 e versiunea) Asa cum exista o linkaredinamica exista si una statica shy o linkare statica (analog cu o alocare statica a unei variabile) inseamna ca acea biblioteca ar deveni parte afisierului nostru exe si in consecinta marimea lui ar creste cu cativa Mb

Parametrii de mai sus care incep cu shyLltcalegt ii spun linkerului in ce directoare sa se uite dupa biblioteci apoi atunci cand acestea vor fispecificate cu parametrii shylltnumegt

De exemplu biblioteca msvcrt se afla in directorul cprogramarecompilatorlib Standardul de denumire al fisierelor ce constituie bibliotecieste libltnumegta ltnumegt putand fi apoi folosit la linia de comanda pentru a linka (a lipi unul de altul) mai multe biblioteci si fisiere codshyobiect (precum maino al nostru shy care si el este specificat pe linia de comanda)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 814

Uitashyte atent la acesti parametri pentru ld si exploreaza si singur pentru ca nu voi mai intra in detaliiToate bibliotecile specificate cu parametrul shyl sunt necesare pentru ca programul final sa functioneze sub windows

La sfarsit de tot mai adaugam si codulshyobiect crtendo care se ocupa cu terminarea corecta a procesuluiDeci contrar credintelor tale de pana acum return 0 nu este nicidecum ultima instructiune executata de un proces la fel cum nici main nueste primul lucru executat de un proces shy se trece mai intai prin functia __main care pregateste mai intai functia main() scrisa de tine pentrua fi apelata

Concluzia ceea ce scriem noi un amarat de fisier maino este doar o mica parte din program Acest cod va fi inconjurat de cateva biblioteciin functie de sistemul de operare (aici windows)

15 O credinta populara

O credinta populara spune ca fisierele header precum stdioh contin functii Nimic mai gresit Functiile sunt implementate in biblioteci nistefisiere binare pe care ai invatat sa le inspectezi cu comanda nm

Atunci cand linkam (ldexe) doua fisiere codshyobiect o (sau la sau a) nu stim ce se afla in acele fisiere shy doar le lipim unul de altul sirezulta un fisier executabil

Insa un compilator (gccexe) are nevoie sa stie cum arata o functie inainte de a o apela informatiile necesare fiind tipul de date alparametrilor si ordinea acestora

Cumulul intre tip de date si ordine al parametrilor unei functii constituie semnatura functiei Multi numesc aceasta semnatura si antetulfunctiei dar acest termen face mai mult aluzie la codul sursa C shy semnatura functiei in schimb indica natura binara a codului obiect

Haideti sa vedem ce se intampla atunci cand compilam un cod sursa fara ashyi spune compilatorului semnaturile functiilor (precum _printf dinlibmsvcrta)

cod

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilaregcc shyWall shyo helloexe mainc

Ne va spune

Quote

warning implicit declaration of function printf

ATENTIE compilatorul spune foarte corect declaration pentru ca intrshyadevar este vorba despre declararea functiei printfImplementarea functiei printf (instructiunile binare CPU ce o definesc) sta bine mersi in libmsvcrta

Deci hai sa ii dam compilatorului ce ne cere Cod

int printf(char fmt )

define EXIT_SUCCESS 0

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilam

gcc shyWall shyo helloexe mainc

Dupa cum vezi in loc sa ne folosim de declaratia functiei printf existenta in stdioh si a constantei EXIT_SUCCESS din stdlibh pur si simpluleshyam declarat direct in codul nostru sursa intrshyun mod similar in care sunt declarate in acele fisiere

Concluzie mare atentie la cei doi termeni declararea (antetul semnatura) unei functii vs implementarea unei functii (instructiunileCPU din codul obiect sau lista de instructiuni din codul sursa shy blocul de instructiuni al functiei shy caci si functii ca printf trebuiesc sa fi fostimplementate pe undeva nu pica din cer shy deschide Cprogramarecompilatorincludestdioh si convingeshyte ca acolo chiar nu se aflaabsolut nicio implementare)

16 Lucrul cu mai multe fisiere codshyobiect intrshyun proiect

Intrshyunul din experimentele anterioare am vazut cum codul nostru obiect maino era linkat cu alte coduri obiecte o si biblioteci a pentru aforma fisierul exe final

Ei bine putem crea si noi mai multe fisiere o (vom vorbi si despre biblioteci intrshyun punct urmator) pe care sa le linkam alaturi de acestmaino Asta duce la o reutilizare mai usoara a codului

Reutilizarea codului se face prin impartirea functionalitatii mari in functionalitati mai mici prin functii Aceasta impartire in functii se mainumeste si modularizarea codului Fisierele o sau bibliotecile a ar putea fi deci considerate module de functii

Deci vom face un nou proiect prime ceea ce nu inseamna nimic mai mult decat un director nou gol in workspaceshyul nostruCprogramareproiecte

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 914

Comenzi

cd Cprogramareproiecte

mkdir prime

Si gata proiectul shy)

cream un nou fisier primec

int is_prime(unsigned int n)

unsigned int i

for(i=2 i lt= n2 i++)

if(ni == 0)

return 0

return 1

(nota stiu ca exista algoritmi mai buni aici vreau sa ilustrez altceva nu sa fac kungshyfu in algoritmica)

Perfect acum il putem compila

gcc shyc shyWall primec

si neshyam ales cu un fisier primeo

scriem mainc

include ltstdiohgt

include ltstdlibhgt

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

CompilamCprogramareproiecteprimegt gcc shyWall shyc maincPrimim eroarea

Quote

mainc In function main

mainc8 warning implicit declaration of function is_prime

Dupa cum observam (inca o data) compilatorul nu stie cum arata semnatura functiei is_prime() Ne da totusi doar o avertizare nu o eroare sine genereaza totusi codul obiect maino deci desi stim ca ar trebui sa adaugam declaratia functiei is_prime inaintea implementarii luimain() hai sa testam care ii sunt limitele si ce se intampla daca nu o facem

Deci trecem la pasul urmator de a linka cele doua fisiere codshyobiect

gcc shyo primeexe shyWall maino primeo

apoi executam primeexe

Procesul primeexe va cere numarul insa atunci cand va ajunge la apelul functiei is_prime va crapa

Inca o dovada ca chiar si doar avertizarile trebuiesc luate in serios si reparate

Deci adaugam semnatura functiei inaintea lui main()

int is_prime(unsigned int)

Atentie semnatura unei functii nu are nevoie de identificatorii parametrilor ci doar de tipul de date

Acum recompilam mainc (primec e deja compilat si nu am schimbat nimic in acel fisier deci primeo e la fel de util ca si inainte)

gcc shyc shyWall mainc

si linkam

gcc shyo primeexe shyWall maino primeo

Perfect primeexe functioneaza Totusi avem o problema pe parcurs vom mai adauga functii in primec pentru lucrul cu numerele primeProblema este ca1 in toate celelalte fisiere c unde vom vrea sa apelam acele functii va trebui sa declaram functiile cu exact aceleasi semnaturi ca in primecDaca cumva o semnatura a unei functii se schimba in primec va trebui sa cautam in toate celelalte fisiere si sa modificam semnatura

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 2: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 214

asain spiritul punctului anterior imaginatia joaca un rol important trebuie sashyti imaginezi toate felurile de input chiar si cele pentrucare programul nu este gandit defapt

In plus trebuie sa incerci sashyti dezvolti capacitatea de analiza si sinteza Este un proces anevoios si continuu si merge manashynmana cu imaginatia insa la un moment dat iti vei dezvolta un simt pentru cum trebuie impartita o problema mai mare in subproblemecare nu numai ca sunt mai mici dar sunt si reutilizabile si (cu timpul) fara greseli (bugshyfree)

Reutilizarea codului in noi proiecte nu numai ca va conduce la mai putine erori (deoarece codul e bugshyfree) ci iti va creste si ritmul derezolvare a problemei sau vei putea aborda probleme mai complexe fara sa te concentrezi mereu asupra acelorasi (sub)problemesimple si frustrante pe care leshyai rezolvat deja in proiectele trecute

Cu ajutorul imaginatiei si in spiritul reutilizarii codului iti poti imagina ce functii sau clase noi trebuie sa introduci care nu numai cashyti rezolva problema curenta ci pe care le vei putea reutiliza in proiectele urmatoareshyshyshy acesta este secretul meseriei in programareInvata engleza Obisnuiesteshyte sa acumulezi cunostinte in engleza deoarece resursele in engleza sunt cele mai actuale si cele maicorecte Cele in romana pur si simplu sunt inconsistente datorita lipsei celui mai important aspect terminologiaSfat pentru liceeni sunteţi icircn perioada icircn care vă dezvoltaţi gacircndirea deci faceţi exact asta dezvoltaţishyvă gacircndirea inginerească

Nu aveţi nevoie de icircmbuibare cu algoritmi cacircnd sunteţi icircn liceu e suficient să exploraţi cacirct mai multe structuri de date şi să vă gacircndiţi lautilitatea fiecăreia icircn natură apoi să rezolvaţi probleme cu ele eventual combinate Nu probleme din culegere ci probleme propriiinventate shy chiar dacă e vorba doar despre parcurgerea unui arbore sau a unui graf

Icircnvăţaţi icircn primul racircnd limbajul foarte bine Apoi treceţi la cel puţin alte două limbaje shy icircnvăţate foarte bine Nu contează care fiecarelimbaj icircţi lărgeşte orizontul

Apoi folosiţi diferite biblioteci librării vedeţi cum rezolvă şi alţii probleme cum scriu cod şi de ce Implicaţishyvă icircn openshysource lachestii simple shy exersaţi icircnţelegerea şi corectarea de cod care nshya fost scris de voi Obişnuiţishyvă să citiţi specificaţii formale şi săexploraţi necunoscutul

Acest gen de aptitudini sunt mult mai importante icircn perioada icircn care icircncă eşti icircn formare

Cacircnd veţi intra la facultate veţi avea toate sculele necesare pentru a vă focusa pe problemele cu adevărat interesante rezolvate prinalgoritmicămatematică fără a mai pierde timpul cu acele lucruri mărunte pe care le ştiţi deja

PS Nu aveţi nevoie de icircmbuibare cu algoritmi nu icircnseamnă să fugiţi de algoritmi Cacircnd rezolvaţi probleme practice veţi vedea la ce ebună sortarea unui vector sau generarea tuturor permutaţiilor sau care poate fi legătura dintre arbori şi O(log(N)) etc shy ideea estedezvoltaţishyvă intuiţia faţă de acest gen de icircntrebări e mult mai importantă decacirct algoritm peste algoritm peste algoritm Aveţi timpdestul pentru algoritmi şi oricum mereu veţi da de ceva algoritmi specializaţi de care nshyaţi auzit pacircnă atunci şi pe care trebuie săshyicombinaţi Iar icircn acest caz intuiţia soft skills şi capacitatea de a lucra cu necunoscutul sunt mult mai de ajutor decacirct studierea timp de4 ani a algoritmilor (care icircntre noi fie vorba icircn şcoală e o rasoleală oricum)

2 Cu ce sa incep cu C sau cu C++Cu C Motive

1 tot ce inveti intrshyunul din limbaje poate fi usor transpus in celalalt deci ce inveti in C iti va fi util in C++ mai tarziu2 Cshyul pur este mai curat decat C++ cu cin si cout In C vei programa procedural Treci la C++ cand incepi sa programezi obiectual3 C si C++ sunt ambele limbaje foarte puternice si des folosite4 C++ nu este neaparat mai bun decat C Exista lucruri care sunt cel mai bine facute in C si nu in C++5 Incepand cu C te poti opri la un moment dat (dupa mine punctul ideal este dupa intelegerea pointerilor si lucrul dinamic cu memoria)

si intelege ce faci cu adevarat ce este un program un proces ce inseamna compilare linkare si in mod ideal si un mic excurs in ASM(1shy2 saptamani poate mai mult dupa interes)C++ insa iti ascunde sau mai bine zis prin multitudinea de features pe care le pune la dispozitie nu iti stimuleaza curiozitateacatre lowshylevel

6 Daca in liceu (sau chiar facultate) ti sshya spus ca programezi in C++ insa nu ai intalnit sau folosit termeni precum clasa templateSTL atunci tin sa te dezamagesc limbajul pe careshyl folosesti este defapt C si tot ce ai folosit din C++ sunt cel mai probabil obiectelestdcin si stdcout declarate in iostream (numit mai sus C cu cin si cout)

daimon on 25th May 2009 1621 said

O mica obiectie daca icirci pot spune asa legata de ordinea icircnvatarii limbajelor La facultatea mea (si din cacircte stiu la toate) ordinea de

icircnvatare a limbajelor este C shy CPP shy JAVA Or pe mine ca beginner C mshya icircnnebunit Pacircna si Pascal avea un mod primitiv pentru a declara

obiecte C icircn schimb mshya azvacircrlit icircn hardware calcule cu pointeri prin stive si alte chestii care pe un icircncepator sigur nushyl coafeaza Nushyi

vorba de skill e vorba de atractivitate Bun noi trebuie icircn final sa stim tot deci nu se pune Icircnsa

Eu unul sugerez oricui sa icircnceapa cu Java sau Cpp partea cu obiecte E intuitiva si pentru tembeli testat icircn practica Poate nu ajungi mai

mult de un codeshymonkey cu asta dar macar faci primul pas si nushyti bagi piciorul dupa cacircteva scanf() mai dure Plus ca un obiect pot sa tishyl

desenez folosind UML si are logica direct vizual Nu degeaab un program C odata ce creste devine din ce icircn ce mai greu de depanat daca

nu lshyai icircmpartit de la icircnceput prin fisiere si headere ca sa nu icircncurci lucrurile

Just my two cents

Eu unul nu am avut probleme cu C ca primul meu limbaj E adevarat teoretic facusem algoritmica in pascal la scoala (in generala)

Teoretic practic insa la scoala invatam algoritmii pe de rost si nu pricepeam nici macar de ce se numeste writeln si nu readln eramde parere ca ar trebui numite invers (nu pricepeam ca sunt numite din perspectiva masinii nu a omului) Nu radeti atat de jalnic eramla programare

In timpul liceului mshyam apucat de C (ca hobby nu la scoala) si fara profesor doar cu carti si resurse de pe web am inteles zic eu mai

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 314

mult decat ma asteptam Deci cred ca asta cu limbajul tine mai mult de cat de copt la minte dar mai ales cat de entuziasmat esti cand teapuci sa studiezi si nu de limbajul in sine Totul poate fi inteles daca te pasioneaza chiar si pointerii si chiar si fara profesor (si ca saplusez chiar si in limbi straine pe care nu le stapanesti cum trebuie engleza (teoretic o invatam de 5 ani practic insa de 2 ani shy si laasta eram mizerabil in generala ) si germana (de 1 an si totusi am inteles bine multe cu cartea de pe pronixde shy una din cele mai

bune carti IT care mishya cazut in mana si pe care ishyo recomand oricarui vorbitor de lb germana))

Deci stereotipul cum ca C este greu este doar o chestiune de atitudine si entuziasm care sunt si abordate in punctul 1 al sfaturilor mele(care au bineinteles o alura de subiectivitate shy stim bine ca obiectivitate absoluta nu exista)

PS nu degeaba am tinut sa mentionez ce elev mediocru eram in relatia mea cu informatica ci tocmai pentru a sublinia ca nu sunt cinestie ce geniu si ca entuziasmul chiar conteaza

PPS un debugger este pentru elevul C similar cu UML pentru elevul C++JavaDelphi shy iti arata exact ce se intampla doar ca lowshylevelE foarte important sa inveti sashyl manuiesti (cel putin cateva comenzi de baza) chiar daca iti e greu ca incepator

3 Ce fac defapt cand programezCand programezi scrii un text cu o anumita sintaxa si semantica text care contine descrierea unor algoritmi Acest text urmeaza sa fieconvertit din limbajul folosit si inteles de oameni (C sau C++ de exemplu) intrshyun limbaj binar inteles de CPU

4 De ce are un compilator nevoie de o sintaxa fixaDeoarece un compilator nu este nimic altceva decat un program iar programele care sunt executate de procesoarele actuale nu suntinteligente

5 Ce inseamna defapt sintaxaSintaxa unui limbaj de programare este setul de reguli din care este compus un limbaj De exemplu o regula sintactica ne spune ca un tip dedate (de exemplu int) trebuie sa fie urmat de unul sau mai multe spatii sau linii noi si apoi unul sau mai multi identificatori de variabileseparati prin virgula iar la sfarsit caracterul Alta regula sintactica ne spune ca un identificator este o litera sau caracterul _ urmat de zerosau mai multe litere caracterul _ sau cifre

Atat si nimic mai mult Nu este corect sa te intrebi care este sintaxa pentru a afla daca un numar este prim ci care este algoritmul pentru aafla daca un numar este prim sau nu

6 Ce inseamna semanticaSemantica inseamna semnificatie int de exemplu inseamna numar intreg iar int ialtfel spus int urmat de un identificator inseamnadeclara si aloca identificatorul i de tip numar intreg

7 Ce este un algoritmUn algoritm este un set de instructiuni care rezulta in cod executat de CPU pentru a rezolva o problema De exemplu pentru a numaradescrescator de la 10 pana la 0 algoritmul ar arata astfel1 initializeaza numarul cu valoarea 102 afiseaza numarul3 daca numarul este mai mare decat zero atunci31 scade 1 din numar32 sari la pasul 24 altfel41 sfarsit program

Posibile solutii in C ar arata astfel

int i

for(i=10igt=0ishyshy)

printf(d i)

sau (tradus cuvant cu cuvant)

int i

i=10

pas2

printf(d i)

if(igt0)

ishyshy

goto pas2

sau (cel mai elegant dupa parerea mea)

int i

i = 10

do

printf(d i)

while(ishyshy)

Atentie int i nu face parte din algoritm pentru ca instructiunea e folosita de compilator la compilare si nu va deveni parte a programuluiexe rezultat ca atare ci intrshyun alt mod (vezi mai jos despre alocarea statica a memoriei)

8 Ce inseamna declararea unei noi variabileAtunci cand declari o variabila ceea ce faci se numeste alocarea statica a memoriei Dupa cum iti poti imagina daca exista o alocarestatica atunci exista si una dinamica dar despre asta mai tarziu

Corect spus insa nu tu aloci memorie ci ii spui compilatorului sa o faca Acea variabila va fi inclusa in fisierul exe generat Din astadeducem ca cu cat declaram mai multe variabile cu atat marimea fisierului exe generat creste Continuarea explicatiei in urmatoareaintrebare

9 De ce o variabila are nevoie de un tip de date (precum int in exemplul de mai sus)Variabila in sine asa cum va fi folosita in programul exe binar nu va avea un tip de date explicit insa compilatorul are nevoie de tipul dedate pentru a sti cati bytes sa aloce si deci implicit cu cati bytes sa mareasca executabilul

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 414

Pentru a afla cu cat creste un executabil cu fiecare variabila foloseste operatorul sizeof()

printf(un int ocupa d bytessizeof(int))

shyshyshy defapt tipul de date este folosit de compilator si pentru a decide ce instructiuni binare pentru CPU sa scrie in executabil pentru ca atribuireaunei valori de tip char are o alta instructiune CPU decat cea pentru atribuirea unei valori de tip integer (e doar un exemplu dar exemple sunt ogramada) in practica trebuie sa aloci static foarte multe variabile pentru a observa o diferenta in marime sizeof() este un operator nu o functie si este evaluat la compilare ca orice alt operator

intrebare de profunzime pur teoretic daca CPUshyul tau si sistemul de operare sunt pe 64 biti si scrii si compilezi un program care afiseazamarimea unui integer program pe care ishyl trimiti si unui prieten cu un sistem pe 32 biti de ce pe ambele calculatoare ar afisa 8 chiar dacape calculatorul prietenului tau marimea unui integer este defapt 4

10 Ce este defapt o variabilaO variabila asa cum este ea folosita de un programator este o colectie de patru elemente

1 un nume sau identificator util compilatorului si programatorului2 o valoare3 un tip de date util compilatorului pentru a sti cum sa manipuleze acea variabila4 o adresa de memorie

11 Cum aflu adresa de memorie a unei variabileFolosind operatorul unar amp de exemplu

int i

printf(adresa variabilei i este pampi)

In C cu siguranta ai folosit deja scanf() pentru a citi valoarea unei variabile

int i

printf(introduceti i)

scanf(dampi)

Ei bine acel apel la scanf() se traduce cam asa citeste un numar intreg (specificat de d) si salveazashyl la adresa variabilei i12 Cand foloseste compilatorul valoarea unei variabile si cand foloseste adresa sa

In afara de cazul explicit in care folosesti operatorul amp compilatorul foloseste cele doua caracteristici (din totalul de patru) la compilare astfel

atunci cand atribui o valoare (constanta precum 10 mai sus sau variabila) unei variabile i compilatorul foloseste adresa acesteia

i = 10

j = n

prima instructiune se citeste copiaza constanta 10 la adresa variabilei i iar a doua copiaza valoarea variabilei n la adresa variabileijIn termeni tehnici ceea ce se afla in stanga operatorului de atribuire se numeste left value sau pe scurt lvalueIn exemplul de mai sus insa variabila n este tratata ca rvalue iar pe compilator il intereseaza valoarea sa

13 Ajutor Toti termenii astia ma deruteazacompilare linkare header IDE biblioteca

Scopul acestei sectiuni este sa iti explice teoria si utilitatea practica a tuturor acestor notiuni Categoric trebuie sa le intelegi Vei instala unmediu curat de programare de la zero componenta cu componenta si vei invata cum conlucreaza acestea si ce rol are fiecare

Intra pe httptdmshygcctdragonnetdownload (httptdmshygcctdragonnetdownload) si descarca OnshyDemand Installer Acest program vainstala compilatorul numit gcc Mai exact va instala portul gcc pentru windows numit MinGW (minimalist GNU for windows) gcc fiindcompilatorul standard pentru lumea GNULinux

Un port al unui program este o adaptare a acelui program pentru o alta platforma

Vrem sa folosim TDM pentru a instala MinGW deoarece MinGW nu dispune de un instalator comun si fara el ar trebui sa instalam totulmanual ceea ce e destul de complicat

Muta instalatorul intrshyun director nou creat Cprogramare Cu el vei putea si administra instalarile TDM deja existente (ca cea pe careurmeaza sa o creezi)

Nota poti instala orice oriunde vrei tu insa in continuare voi folosi foarte mult aceste cai deci tishyai face un bine daca ai urma exactinstructiunile mele

Daca ceva nu functioneaza cum trebuie si ai instalate alte scule de programare precum DevshyCpp CodeBlocks sau altele dezinstaleazashyletemporar Nu vei fi nevoit sa dezinstalezi Visual Studio sau Borland C++

Alege optiunea Create pentru a crea o noua instalare In urmatoarea pagina pentru Installation Directory introduCprogramarecompilator (fara ghilimele)

In rest instalarea cu valorile predefinite ar trebui sa fie perfecta

Acum in StartshygtAll programsshygtMinGW ai o legatura catre interfata CLI (httpenwikipediaorgwikiCommandshyline_interface) a sistemuluide operare cunoscuta sub windows si ca msshydos prompt Ceea ce face aceasta legatura este practic sa importe niste setari prin fisierulCprogramarecompilatormingwvarsbat

Cand ii dam drumul ne va pune automat in directorul Cprogramarecompilator Asta nu este neaparat o problema insa mult mai bine ar fidaca neshyar pune intrshyun director special unde ne vom tine noi proiectele Insa pentru asta trebuie mai intai sa cream un astfel de director Deci

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 514

creaza directorul Cprogramareproiecte

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vinede la change directory) in proiecte

cd proiecte

Inchide orice msshydos prompt daca il mai ai deschis si relanseazashyl Acum ar trebui sa te afli in Cprogramareproiecte

Bun avem totul setat si organizat intrshyun mod curat Acum hai sa cream un nou proiectAsta nu inseamna nimic mai mult sau mai putin decat a crea un nou subdirector in proiecte numit hello in care ne vom salva toatefisierele proiectului Deci introdu comanda necesara

mkdir hello

(mkdir = make directory)apoi schimba directorul curent in noul subdirector creat

cd hello

Hai sa facem ceva ce probabil stii sa scriem un cod sursa si sa testam in final daca totul functioneaza cum trebuie

edit mainc

Apoi introdu codul sursa

include ltstdiohgt

include ltstdlibhgt

int main(void)

printf(hello world)

return EXIT_SUCCESS

(nota la sfarsitul fisierului se afla o linie noua goala Asta este parte din standardul actual si modern al limbajului C)

In meniul editorului selecteaza File shygt Save si apoi File shygt Exit

Acum avem un fisier mainc care abia asteapta sa fie compilat Deci introdu comanda

gcc shyWall mainc

shyWall este un parametru si ii spune compilatorului sa genereze avertizari (W vine de la warnings) pentru toti (all) pasii ce implica ocompilare Este bine sa pui shyWall de fiecare data astfel compilatorul te va avertiza despre eventualele greseli pe care leshyai facut

Daca nu ai facut nicio greseala atunci compilatorul nu va afisa nimic El va genera insa un fisier aexeIl poti lansa in executie introducand in prompt

aexe

Ar trebui sa vezi pe ecran textul hello world

Fisierul se numeste din motive istorice aexe Daca vrem ca outputul compilatorului sa se numeasca altfel trebuie sashyi spunem asta prinparametrul shyo ltnume programgt shyo vine de la output Asadar ar trebui sa introducem

gcc shyWall shyo helloexe mainc

Am testat deci instalarea si totul functioneaza perfect Insa noi nu neshyam indeplinit misiunea sa intelegem sculele pe care le folosim si cumfunctioneaza acestea macar cat de cat Asta ne va face niste programatori mai buni

Deci vom face cateva experimente pe care le vom analiza pentru a ne putea explica cele mai importante concepte Unele dintre experimentevor genera erori ceea ce e dorit (eu vreau sa fac lucruri anormale pentru a demonstra ceva) Experimentele contin si explicatii teoretice sidemonstratii practice

1 Experiment 1 compilare si linkare

Compilatorul nostru numit gccexe (gcc vine de la GNU C Compiler) neshya compilat anterior codul sursa si a generat directexecutabilul Compilarea este constituita insa din mai multi pasi de la codul sursa scris in C pana la fisierul executabil care contineinstructiuni executate de electronica din CPU e drum lung Pe rand pasii acestia sunt

a preprocesare preprocesorul proceseaza toate instructiunile dedicate lui adica toate instructiunile care incep cu astainclude si directiva preprocesor include pe care am folositshyo si noi in programul nostru include practic include un fisieriar rezultatul arata de ca si cum continutul fisierului inclus ar fi fost scris de noi manual in maincPentru a vedea rezultatul acestui pas trebuie sa ii pasam compilatorului parametrul shyE care ii spune sa se opreasca imediatdupa pasul de preprocesare

gcc shyWall shyE shyo maini mainc

Deschide fisierul generat maini si wow o gramada de cod sunt peste 600 de linii de cod C foarte valid si necesar pentru caamarata noastra de functie main() (care se afla la sfarsitul fisierului) sa functioneze cum trebuie

b asamblare outputul acestui pas este inrudit cu un alt limbaj numit limbaj de asamblare (sau scurt ASM) InstructiunileASM coincid aproape 11 cu instructiunile binare care vor fi executate de CPU Acesta este ultimul pas care va fi inteligibil destulincat sa ne ofere informatii despre ce va face procesorul Outputul urmatorului pas (compilarea) este deja mult prea binar pentruun programator ordinar

Lui gcc ii spunem sa se opreasca dupa pasul de ansamblare cu parametrul shyS

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 614

Putem refolosi fisierul preprocesat maini astfel

gcc shyWall shyS shyo mains maini

sau ii putem spune compilatorului sa o ia de la capat incepand cu mainc sa salveze temporar un nou fisier preprocesat si sashylasambleze pe acela oprindushyse dupa pasul de asamblare

gcc shyWall shyS shyo mains mainc

In ambele cazuri comenzile sunt aceleasi Ceea ce difera este extensia fisierului de input (i sau c) in functie de care gcc decidece este de facut (daca mai este necesara o preprocesare sau nu)

Aruncand un ochi in fisierul asamblat mains ne regasim stringul ascii hello world0 care ne arata clar ca un string in C setermina in caracterul NUL (nu NULL) vedem si numele functiilor folosite precum main sau printf chiar daca acestea suntprecedate de unul sau doua _ si mai vedem si instructiuni ASM De exemplu instructiunea ASM

call __main

apeleaza functia noastra main() Insa dupa cum observi ea nu este nicidecum primul lucru executat de procesor (desi cusiguranta ti sshya spus la scoala main shy aici incepe programul) Compilatorul a adaugat automat pentru noi alte instructiuniinaintea sa instructiuni care pregatesc apelul efectiv Pentru a intelege cu adevarat ce se intampla aici este necesara studierealimbajului ASMc compilare in acest pas datele preprocesate sunt compilate iar outputul se numeste codshyobiect Acest cod obiect continepractic instructiunile CPU care vor constitui programul nostru efectiv Insa el nu contine detaliile care fac un executabil sa fie unexecutabil recunoscut ca atare de sistemul de operare El contine insa referinte la alte resurse (mai mult sau mai putin) externedespre care vom vorbi intrshyun experiment viitor referinte pe care leshyai vazut si in fisierul ASM precum _printf Codul obiectcontine simplificat vorbind instructiunile pure binare si nimic altceva

Si la acest pas putem refolosi outputul oricaruia dintre pasii anteriori ca input insa ii putem spune lui gcc sa se opreasca dupapasul de compilare cu parametrul shyc

gcc shyWall shyc shyo maino mains

sau

gcc shyWall shyc shyo maino maini

sau

gcc shyWall shyc shyo maino mainc

Gcc va decide in functie de tipul inputului ce fisiere temporare trebuie sa genereze Insa cum noi avem deja cel mai apropiat tipde input (fisierul asamblat) de ceea ce vrem (codul obiect) doar prima varianta are sens Astfel putem creste viteza de compilare(deoarece pasii intermediari de preprocesare si asamblare nu mai sunt necesari)

Insa de la orice input am pleca outputul maino va fi identic

Aruncand un ochi pe fisierul rezultat maino observam ca nu pricepem mare lucru deoarece outputul compilarii nu mai este untext cum a fost in cazul preprocesarii si al asamblarii ci un fisier binar cu instructiuni CPU Acele instructiuni vor fi executatede circuitele electronice din CPU

Totusi ne regasim textul hello world si vedem si nume precum printf sau main functii care apar si in programDeci rezultatul compilarii maino cel putin pare a reflecta in mare ce am scris noi in mainc si deci secvential si in maini simainsd linkareAcesta este ultimul pas in traducerea lui mainc din limbajul C in limbajul binar al CPUshyului Deoarece e ultimul pas lui GCC nutrebuie sashyi spui sa se opreasca la un anumit pas cum ai facut cu shyE pentru procesare shyS pentru asamblare sau shyc pentrucompilare Nu trebuie decat sashyl hranesti cu input provenit de la oricare output din pasii anteriori sau cu mainc insusi GCC isiva genera fisierele temporare de care are nevoie Cum noi avem insa outputul cel mai apropiat de ceea ce vrem cel mai eficienteste sashyl linkam pe acesta

gcc shyWall shyo helloexe maino

A linka inseamna a crea legaturi Pasul acesta creaza legatura dintre codul obiect din fisierul o si biblioteca standard C (pescurt libc stdlibc sau sub windows vei mai intalni si numele de msvcrt) In experimentul urmator vom vedea ce este aceastastdlibc si ce rol areConcluziiAm aflat ca ceea ce numeam pana acum compilare este defapt o serie de pasi (preprocesare asamblare compilare linkare)ordonati iar fiecare pas are ca input outputul pasului anterior Totul pleaca de la codul sursa scris de programator si se ajungela fisierul executabil care este (in principiu) inputul unei alte componente de data aceasta una hardware procesorul insusi

Compilarea este defapt tehnic corect vorbind doar acesta al treilea pas din ceea ce intelegeam inainte prin compilare

Compilatorul GCC ne lasa sa ne oprim dupa oricare dintre acesti pasi cu unul dintre parametrii shyE shyS sau shyc Astfel putem vedeaexact ce se intampla sub capota

In experimentele viitoare vei vedea ca in mod obisnuit nu vei avea deshya face cu datele de iesire ale pasilor de preprocesare siasamblare insa des vei fi confruntat cu utilizarea parametrului shyc chiar si in viata de zi cu zi de programator

Urmatoarele experimente vor vorbi mai indeaproape despre sculele de programa existente despre biblioteci IDEshyuri si alte detalii

Asigurashyte ca ai inteles mai intai toate lucrurile de mai sus pentru a castiga o claritate cat mai mare din cele ce urmeaza shy altfel nu

vei intelege mare lucru din experimentele viitoare

14 Ce este biblioteca standard

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 714

Biblioteca standard este o biblioteca care ii este pusa implicit la dispozitie unui cod sursa Limbajul C are o biblioteca standard numitacolocvial stdlibc limbajul C++ are o biblioteca standard numita colocvial stdlibc++

Bibliotecile standard vin de obicei la pachet cu setul de scule (compilator linker etc) de programare folosit Astfel se face ca gcc (mingw) neofera o biblioteca standard visual c++ ne ofera o alta biblioteca standard samd

Toate aceste biblioteci respecta mai mult sau mai putin un standard comun (standardul ISO C care specifica intregul limbaj ChttpenwikipediaryISO_Standard (httpenwikipediaorgwikiC_standard_libraryISO_Standard) ) de aceea nu conteaza cu cecompilator compilam un program care foloseste doar lucrurile standard

Noi vom folosi ca si pana acum compilatorul gcc cu biblioteca sa standard

Compileaza codul sursa anterior mainc al programului hello world astfel

gcc shynostdlib mainc

Parametrul shynostdlib ii spune linkerului (numit ldexe un program la fel ca gccexe) apelat in spatele cortinei de compilatorul gccexe sanu includa biblioteca standard in programul nostru

In output vedem concret cum gcc a generat acele fisiere temporare codshyobiect (o) si cum ld (ld returned 1 exit status) returneaza eroare (acelreturn 0 pe care il scrii tu in programe ii spune sistemului de operare ca procesul tau sshya terminat cu succes ei bine aici programul ldexeface pe undeva return 1 pentru ashyi spune apelantului (aici gccexe si nu sistemul de operare pentru ca nu ai introdus tu ldexe pentru alinka manual codul obiect al lui maino cu biblioteca standard) ca procesul sshya terminat cu o eroare

Quote

TempccD9bI55omainc(text+0xa) undefined reference to amp96__main

TempccD9bI55omainc(text+0x16) undefined reference to amp96printf

collect2 ld returned 1 exit status

Hai sa incercam acelasi lucru si manual generarea de cod obiect si linkshyarea manuala

Introdu

gcc shyc mainc

Acum pentru a linka invoca linkershyul ld (toti parametrii trebuiesc scrisi pe o singura linie)

Quote

ld shyBdynamic

cprogramarecompilatorlibcrt2o cprogramarecompilatorlibgccmingw32441crtbeginoshyLCprogramarecompilatorlibgccmingw32441 shyLcprogramarecompilatorlibgcc shyLCprogramarecompilatormingw32lib shyLCprogramarecompilatorlib

maino

shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt shyluser32 shylkernel32 shyladvapi32 shylshell32 shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt

cprogramarecompilatorlibgccmingw32441crtendo

(Nota 441 ar trebui sa fie inlocuit cu versiunea gcc folosita de tine)

Asupra parametrului shyBdynamic voi reveni mai tarziu

Dupa cum vezi sunt linkshyate mai intai doua fisiere codshyobiect pe care nu leshyam scris noi crt2o si crtbegino Hai sa vedem ce se afla in crt2oIntroducd Cprogramarecompilatorlibnm crt2o

aceasta ultima comanda va afisa toate simbolurile dintrshyun fisier codshyobiect (lib o a la) Printre acele simboluri vedem si simbolul__main despre care se plangea ld ca nushyl gaseste atunci cand am folosit parametrul shynostdlib pentru gcc

Dupa cum stii din unele din punctele anterioare simbolul printf nu exista este numit _printf deci hai sa ne uitam dupa el (ca sa neasiguram ca exista si ca nimic nu e magic) in biblioteca msvcrt

nm cprogramarecompilatorliblibmsvcrta gt libmsvcrtnm

apoi deschide fisierul text nou creat libmsvcrtnm si cauta dupa _printf shy vei vedea ca e acolo

Parametrul shyBdynamic de mai sus spune ca se va linka dinamic cu biblioteca standard O linkare dinamica sub windows inseamna ca intrshyun final se vor apela functii aflate in fisiere dll (precum _printf) shy de exemplu in msvcrt70dll (70 e versiunea) Asa cum exista o linkaredinamica exista si una statica shy o linkare statica (analog cu o alocare statica a unei variabile) inseamna ca acea biblioteca ar deveni parte afisierului nostru exe si in consecinta marimea lui ar creste cu cativa Mb

Parametrii de mai sus care incep cu shyLltcalegt ii spun linkerului in ce directoare sa se uite dupa biblioteci apoi atunci cand acestea vor fispecificate cu parametrii shylltnumegt

De exemplu biblioteca msvcrt se afla in directorul cprogramarecompilatorlib Standardul de denumire al fisierelor ce constituie bibliotecieste libltnumegta ltnumegt putand fi apoi folosit la linia de comanda pentru a linka (a lipi unul de altul) mai multe biblioteci si fisiere codshyobiect (precum maino al nostru shy care si el este specificat pe linia de comanda)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 814

Uitashyte atent la acesti parametri pentru ld si exploreaza si singur pentru ca nu voi mai intra in detaliiToate bibliotecile specificate cu parametrul shyl sunt necesare pentru ca programul final sa functioneze sub windows

La sfarsit de tot mai adaugam si codulshyobiect crtendo care se ocupa cu terminarea corecta a procesuluiDeci contrar credintelor tale de pana acum return 0 nu este nicidecum ultima instructiune executata de un proces la fel cum nici main nueste primul lucru executat de un proces shy se trece mai intai prin functia __main care pregateste mai intai functia main() scrisa de tine pentrua fi apelata

Concluzia ceea ce scriem noi un amarat de fisier maino este doar o mica parte din program Acest cod va fi inconjurat de cateva biblioteciin functie de sistemul de operare (aici windows)

15 O credinta populara

O credinta populara spune ca fisierele header precum stdioh contin functii Nimic mai gresit Functiile sunt implementate in biblioteci nistefisiere binare pe care ai invatat sa le inspectezi cu comanda nm

Atunci cand linkam (ldexe) doua fisiere codshyobiect o (sau la sau a) nu stim ce se afla in acele fisiere shy doar le lipim unul de altul sirezulta un fisier executabil

Insa un compilator (gccexe) are nevoie sa stie cum arata o functie inainte de a o apela informatiile necesare fiind tipul de date alparametrilor si ordinea acestora

Cumulul intre tip de date si ordine al parametrilor unei functii constituie semnatura functiei Multi numesc aceasta semnatura si antetulfunctiei dar acest termen face mai mult aluzie la codul sursa C shy semnatura functiei in schimb indica natura binara a codului obiect

Haideti sa vedem ce se intampla atunci cand compilam un cod sursa fara ashyi spune compilatorului semnaturile functiilor (precum _printf dinlibmsvcrta)

cod

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilaregcc shyWall shyo helloexe mainc

Ne va spune

Quote

warning implicit declaration of function printf

ATENTIE compilatorul spune foarte corect declaration pentru ca intrshyadevar este vorba despre declararea functiei printfImplementarea functiei printf (instructiunile binare CPU ce o definesc) sta bine mersi in libmsvcrta

Deci hai sa ii dam compilatorului ce ne cere Cod

int printf(char fmt )

define EXIT_SUCCESS 0

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilam

gcc shyWall shyo helloexe mainc

Dupa cum vezi in loc sa ne folosim de declaratia functiei printf existenta in stdioh si a constantei EXIT_SUCCESS din stdlibh pur si simpluleshyam declarat direct in codul nostru sursa intrshyun mod similar in care sunt declarate in acele fisiere

Concluzie mare atentie la cei doi termeni declararea (antetul semnatura) unei functii vs implementarea unei functii (instructiunileCPU din codul obiect sau lista de instructiuni din codul sursa shy blocul de instructiuni al functiei shy caci si functii ca printf trebuiesc sa fi fostimplementate pe undeva nu pica din cer shy deschide Cprogramarecompilatorincludestdioh si convingeshyte ca acolo chiar nu se aflaabsolut nicio implementare)

16 Lucrul cu mai multe fisiere codshyobiect intrshyun proiect

Intrshyunul din experimentele anterioare am vazut cum codul nostru obiect maino era linkat cu alte coduri obiecte o si biblioteci a pentru aforma fisierul exe final

Ei bine putem crea si noi mai multe fisiere o (vom vorbi si despre biblioteci intrshyun punct urmator) pe care sa le linkam alaturi de acestmaino Asta duce la o reutilizare mai usoara a codului

Reutilizarea codului se face prin impartirea functionalitatii mari in functionalitati mai mici prin functii Aceasta impartire in functii se mainumeste si modularizarea codului Fisierele o sau bibliotecile a ar putea fi deci considerate module de functii

Deci vom face un nou proiect prime ceea ce nu inseamna nimic mai mult decat un director nou gol in workspaceshyul nostruCprogramareproiecte

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 914

Comenzi

cd Cprogramareproiecte

mkdir prime

Si gata proiectul shy)

cream un nou fisier primec

int is_prime(unsigned int n)

unsigned int i

for(i=2 i lt= n2 i++)

if(ni == 0)

return 0

return 1

(nota stiu ca exista algoritmi mai buni aici vreau sa ilustrez altceva nu sa fac kungshyfu in algoritmica)

Perfect acum il putem compila

gcc shyc shyWall primec

si neshyam ales cu un fisier primeo

scriem mainc

include ltstdiohgt

include ltstdlibhgt

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

CompilamCprogramareproiecteprimegt gcc shyWall shyc maincPrimim eroarea

Quote

mainc In function main

mainc8 warning implicit declaration of function is_prime

Dupa cum observam (inca o data) compilatorul nu stie cum arata semnatura functiei is_prime() Ne da totusi doar o avertizare nu o eroare sine genereaza totusi codul obiect maino deci desi stim ca ar trebui sa adaugam declaratia functiei is_prime inaintea implementarii luimain() hai sa testam care ii sunt limitele si ce se intampla daca nu o facem

Deci trecem la pasul urmator de a linka cele doua fisiere codshyobiect

gcc shyo primeexe shyWall maino primeo

apoi executam primeexe

Procesul primeexe va cere numarul insa atunci cand va ajunge la apelul functiei is_prime va crapa

Inca o dovada ca chiar si doar avertizarile trebuiesc luate in serios si reparate

Deci adaugam semnatura functiei inaintea lui main()

int is_prime(unsigned int)

Atentie semnatura unei functii nu are nevoie de identificatorii parametrilor ci doar de tipul de date

Acum recompilam mainc (primec e deja compilat si nu am schimbat nimic in acel fisier deci primeo e la fel de util ca si inainte)

gcc shyc shyWall mainc

si linkam

gcc shyo primeexe shyWall maino primeo

Perfect primeexe functioneaza Totusi avem o problema pe parcurs vom mai adauga functii in primec pentru lucrul cu numerele primeProblema este ca1 in toate celelalte fisiere c unde vom vrea sa apelam acele functii va trebui sa declaram functiile cu exact aceleasi semnaturi ca in primecDaca cumva o semnatura a unei functii se schimba in primec va trebui sa cautam in toate celelalte fisiere si sa modificam semnatura

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 3: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 314

mult decat ma asteptam Deci cred ca asta cu limbajul tine mai mult de cat de copt la minte dar mai ales cat de entuziasmat esti cand teapuci sa studiezi si nu de limbajul in sine Totul poate fi inteles daca te pasioneaza chiar si pointerii si chiar si fara profesor (si ca saplusez chiar si in limbi straine pe care nu le stapanesti cum trebuie engleza (teoretic o invatam de 5 ani practic insa de 2 ani shy si laasta eram mizerabil in generala ) si germana (de 1 an si totusi am inteles bine multe cu cartea de pe pronixde shy una din cele mai

bune carti IT care mishya cazut in mana si pe care ishyo recomand oricarui vorbitor de lb germana))

Deci stereotipul cum ca C este greu este doar o chestiune de atitudine si entuziasm care sunt si abordate in punctul 1 al sfaturilor mele(care au bineinteles o alura de subiectivitate shy stim bine ca obiectivitate absoluta nu exista)

PS nu degeaba am tinut sa mentionez ce elev mediocru eram in relatia mea cu informatica ci tocmai pentru a sublinia ca nu sunt cinestie ce geniu si ca entuziasmul chiar conteaza

PPS un debugger este pentru elevul C similar cu UML pentru elevul C++JavaDelphi shy iti arata exact ce se intampla doar ca lowshylevelE foarte important sa inveti sashyl manuiesti (cel putin cateva comenzi de baza) chiar daca iti e greu ca incepator

3 Ce fac defapt cand programezCand programezi scrii un text cu o anumita sintaxa si semantica text care contine descrierea unor algoritmi Acest text urmeaza sa fieconvertit din limbajul folosit si inteles de oameni (C sau C++ de exemplu) intrshyun limbaj binar inteles de CPU

4 De ce are un compilator nevoie de o sintaxa fixaDeoarece un compilator nu este nimic altceva decat un program iar programele care sunt executate de procesoarele actuale nu suntinteligente

5 Ce inseamna defapt sintaxaSintaxa unui limbaj de programare este setul de reguli din care este compus un limbaj De exemplu o regula sintactica ne spune ca un tip dedate (de exemplu int) trebuie sa fie urmat de unul sau mai multe spatii sau linii noi si apoi unul sau mai multi identificatori de variabileseparati prin virgula iar la sfarsit caracterul Alta regula sintactica ne spune ca un identificator este o litera sau caracterul _ urmat de zerosau mai multe litere caracterul _ sau cifre

Atat si nimic mai mult Nu este corect sa te intrebi care este sintaxa pentru a afla daca un numar este prim ci care este algoritmul pentru aafla daca un numar este prim sau nu

6 Ce inseamna semanticaSemantica inseamna semnificatie int de exemplu inseamna numar intreg iar int ialtfel spus int urmat de un identificator inseamnadeclara si aloca identificatorul i de tip numar intreg

7 Ce este un algoritmUn algoritm este un set de instructiuni care rezulta in cod executat de CPU pentru a rezolva o problema De exemplu pentru a numaradescrescator de la 10 pana la 0 algoritmul ar arata astfel1 initializeaza numarul cu valoarea 102 afiseaza numarul3 daca numarul este mai mare decat zero atunci31 scade 1 din numar32 sari la pasul 24 altfel41 sfarsit program

Posibile solutii in C ar arata astfel

int i

for(i=10igt=0ishyshy)

printf(d i)

sau (tradus cuvant cu cuvant)

int i

i=10

pas2

printf(d i)

if(igt0)

ishyshy

goto pas2

sau (cel mai elegant dupa parerea mea)

int i

i = 10

do

printf(d i)

while(ishyshy)

Atentie int i nu face parte din algoritm pentru ca instructiunea e folosita de compilator la compilare si nu va deveni parte a programuluiexe rezultat ca atare ci intrshyun alt mod (vezi mai jos despre alocarea statica a memoriei)

8 Ce inseamna declararea unei noi variabileAtunci cand declari o variabila ceea ce faci se numeste alocarea statica a memoriei Dupa cum iti poti imagina daca exista o alocarestatica atunci exista si una dinamica dar despre asta mai tarziu

Corect spus insa nu tu aloci memorie ci ii spui compilatorului sa o faca Acea variabila va fi inclusa in fisierul exe generat Din astadeducem ca cu cat declaram mai multe variabile cu atat marimea fisierului exe generat creste Continuarea explicatiei in urmatoareaintrebare

9 De ce o variabila are nevoie de un tip de date (precum int in exemplul de mai sus)Variabila in sine asa cum va fi folosita in programul exe binar nu va avea un tip de date explicit insa compilatorul are nevoie de tipul dedate pentru a sti cati bytes sa aloce si deci implicit cu cati bytes sa mareasca executabilul

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 414

Pentru a afla cu cat creste un executabil cu fiecare variabila foloseste operatorul sizeof()

printf(un int ocupa d bytessizeof(int))

shyshyshy defapt tipul de date este folosit de compilator si pentru a decide ce instructiuni binare pentru CPU sa scrie in executabil pentru ca atribuireaunei valori de tip char are o alta instructiune CPU decat cea pentru atribuirea unei valori de tip integer (e doar un exemplu dar exemple sunt ogramada) in practica trebuie sa aloci static foarte multe variabile pentru a observa o diferenta in marime sizeof() este un operator nu o functie si este evaluat la compilare ca orice alt operator

intrebare de profunzime pur teoretic daca CPUshyul tau si sistemul de operare sunt pe 64 biti si scrii si compilezi un program care afiseazamarimea unui integer program pe care ishyl trimiti si unui prieten cu un sistem pe 32 biti de ce pe ambele calculatoare ar afisa 8 chiar dacape calculatorul prietenului tau marimea unui integer este defapt 4

10 Ce este defapt o variabilaO variabila asa cum este ea folosita de un programator este o colectie de patru elemente

1 un nume sau identificator util compilatorului si programatorului2 o valoare3 un tip de date util compilatorului pentru a sti cum sa manipuleze acea variabila4 o adresa de memorie

11 Cum aflu adresa de memorie a unei variabileFolosind operatorul unar amp de exemplu

int i

printf(adresa variabilei i este pampi)

In C cu siguranta ai folosit deja scanf() pentru a citi valoarea unei variabile

int i

printf(introduceti i)

scanf(dampi)

Ei bine acel apel la scanf() se traduce cam asa citeste un numar intreg (specificat de d) si salveazashyl la adresa variabilei i12 Cand foloseste compilatorul valoarea unei variabile si cand foloseste adresa sa

In afara de cazul explicit in care folosesti operatorul amp compilatorul foloseste cele doua caracteristici (din totalul de patru) la compilare astfel

atunci cand atribui o valoare (constanta precum 10 mai sus sau variabila) unei variabile i compilatorul foloseste adresa acesteia

i = 10

j = n

prima instructiune se citeste copiaza constanta 10 la adresa variabilei i iar a doua copiaza valoarea variabilei n la adresa variabileijIn termeni tehnici ceea ce se afla in stanga operatorului de atribuire se numeste left value sau pe scurt lvalueIn exemplul de mai sus insa variabila n este tratata ca rvalue iar pe compilator il intereseaza valoarea sa

13 Ajutor Toti termenii astia ma deruteazacompilare linkare header IDE biblioteca

Scopul acestei sectiuni este sa iti explice teoria si utilitatea practica a tuturor acestor notiuni Categoric trebuie sa le intelegi Vei instala unmediu curat de programare de la zero componenta cu componenta si vei invata cum conlucreaza acestea si ce rol are fiecare

Intra pe httptdmshygcctdragonnetdownload (httptdmshygcctdragonnetdownload) si descarca OnshyDemand Installer Acest program vainstala compilatorul numit gcc Mai exact va instala portul gcc pentru windows numit MinGW (minimalist GNU for windows) gcc fiindcompilatorul standard pentru lumea GNULinux

Un port al unui program este o adaptare a acelui program pentru o alta platforma

Vrem sa folosim TDM pentru a instala MinGW deoarece MinGW nu dispune de un instalator comun si fara el ar trebui sa instalam totulmanual ceea ce e destul de complicat

Muta instalatorul intrshyun director nou creat Cprogramare Cu el vei putea si administra instalarile TDM deja existente (ca cea pe careurmeaza sa o creezi)

Nota poti instala orice oriunde vrei tu insa in continuare voi folosi foarte mult aceste cai deci tishyai face un bine daca ai urma exactinstructiunile mele

Daca ceva nu functioneaza cum trebuie si ai instalate alte scule de programare precum DevshyCpp CodeBlocks sau altele dezinstaleazashyletemporar Nu vei fi nevoit sa dezinstalezi Visual Studio sau Borland C++

Alege optiunea Create pentru a crea o noua instalare In urmatoarea pagina pentru Installation Directory introduCprogramarecompilator (fara ghilimele)

In rest instalarea cu valorile predefinite ar trebui sa fie perfecta

Acum in StartshygtAll programsshygtMinGW ai o legatura catre interfata CLI (httpenwikipediaorgwikiCommandshyline_interface) a sistemuluide operare cunoscuta sub windows si ca msshydos prompt Ceea ce face aceasta legatura este practic sa importe niste setari prin fisierulCprogramarecompilatormingwvarsbat

Cand ii dam drumul ne va pune automat in directorul Cprogramarecompilator Asta nu este neaparat o problema insa mult mai bine ar fidaca neshyar pune intrshyun director special unde ne vom tine noi proiectele Insa pentru asta trebuie mai intai sa cream un astfel de director Deci

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 514

creaza directorul Cprogramareproiecte

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vinede la change directory) in proiecte

cd proiecte

Inchide orice msshydos prompt daca il mai ai deschis si relanseazashyl Acum ar trebui sa te afli in Cprogramareproiecte

Bun avem totul setat si organizat intrshyun mod curat Acum hai sa cream un nou proiectAsta nu inseamna nimic mai mult sau mai putin decat a crea un nou subdirector in proiecte numit hello in care ne vom salva toatefisierele proiectului Deci introdu comanda necesara

mkdir hello

(mkdir = make directory)apoi schimba directorul curent in noul subdirector creat

cd hello

Hai sa facem ceva ce probabil stii sa scriem un cod sursa si sa testam in final daca totul functioneaza cum trebuie

edit mainc

Apoi introdu codul sursa

include ltstdiohgt

include ltstdlibhgt

int main(void)

printf(hello world)

return EXIT_SUCCESS

(nota la sfarsitul fisierului se afla o linie noua goala Asta este parte din standardul actual si modern al limbajului C)

In meniul editorului selecteaza File shygt Save si apoi File shygt Exit

Acum avem un fisier mainc care abia asteapta sa fie compilat Deci introdu comanda

gcc shyWall mainc

shyWall este un parametru si ii spune compilatorului sa genereze avertizari (W vine de la warnings) pentru toti (all) pasii ce implica ocompilare Este bine sa pui shyWall de fiecare data astfel compilatorul te va avertiza despre eventualele greseli pe care leshyai facut

Daca nu ai facut nicio greseala atunci compilatorul nu va afisa nimic El va genera insa un fisier aexeIl poti lansa in executie introducand in prompt

aexe

Ar trebui sa vezi pe ecran textul hello world

Fisierul se numeste din motive istorice aexe Daca vrem ca outputul compilatorului sa se numeasca altfel trebuie sashyi spunem asta prinparametrul shyo ltnume programgt shyo vine de la output Asadar ar trebui sa introducem

gcc shyWall shyo helloexe mainc

Am testat deci instalarea si totul functioneaza perfect Insa noi nu neshyam indeplinit misiunea sa intelegem sculele pe care le folosim si cumfunctioneaza acestea macar cat de cat Asta ne va face niste programatori mai buni

Deci vom face cateva experimente pe care le vom analiza pentru a ne putea explica cele mai importante concepte Unele dintre experimentevor genera erori ceea ce e dorit (eu vreau sa fac lucruri anormale pentru a demonstra ceva) Experimentele contin si explicatii teoretice sidemonstratii practice

1 Experiment 1 compilare si linkare

Compilatorul nostru numit gccexe (gcc vine de la GNU C Compiler) neshya compilat anterior codul sursa si a generat directexecutabilul Compilarea este constituita insa din mai multi pasi de la codul sursa scris in C pana la fisierul executabil care contineinstructiuni executate de electronica din CPU e drum lung Pe rand pasii acestia sunt

a preprocesare preprocesorul proceseaza toate instructiunile dedicate lui adica toate instructiunile care incep cu astainclude si directiva preprocesor include pe care am folositshyo si noi in programul nostru include practic include un fisieriar rezultatul arata de ca si cum continutul fisierului inclus ar fi fost scris de noi manual in maincPentru a vedea rezultatul acestui pas trebuie sa ii pasam compilatorului parametrul shyE care ii spune sa se opreasca imediatdupa pasul de preprocesare

gcc shyWall shyE shyo maini mainc

Deschide fisierul generat maini si wow o gramada de cod sunt peste 600 de linii de cod C foarte valid si necesar pentru caamarata noastra de functie main() (care se afla la sfarsitul fisierului) sa functioneze cum trebuie

b asamblare outputul acestui pas este inrudit cu un alt limbaj numit limbaj de asamblare (sau scurt ASM) InstructiunileASM coincid aproape 11 cu instructiunile binare care vor fi executate de CPU Acesta este ultimul pas care va fi inteligibil destulincat sa ne ofere informatii despre ce va face procesorul Outputul urmatorului pas (compilarea) este deja mult prea binar pentruun programator ordinar

Lui gcc ii spunem sa se opreasca dupa pasul de ansamblare cu parametrul shyS

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 614

Putem refolosi fisierul preprocesat maini astfel

gcc shyWall shyS shyo mains maini

sau ii putem spune compilatorului sa o ia de la capat incepand cu mainc sa salveze temporar un nou fisier preprocesat si sashylasambleze pe acela oprindushyse dupa pasul de asamblare

gcc shyWall shyS shyo mains mainc

In ambele cazuri comenzile sunt aceleasi Ceea ce difera este extensia fisierului de input (i sau c) in functie de care gcc decidece este de facut (daca mai este necesara o preprocesare sau nu)

Aruncand un ochi in fisierul asamblat mains ne regasim stringul ascii hello world0 care ne arata clar ca un string in C setermina in caracterul NUL (nu NULL) vedem si numele functiilor folosite precum main sau printf chiar daca acestea suntprecedate de unul sau doua _ si mai vedem si instructiuni ASM De exemplu instructiunea ASM

call __main

apeleaza functia noastra main() Insa dupa cum observi ea nu este nicidecum primul lucru executat de procesor (desi cusiguranta ti sshya spus la scoala main shy aici incepe programul) Compilatorul a adaugat automat pentru noi alte instructiuniinaintea sa instructiuni care pregatesc apelul efectiv Pentru a intelege cu adevarat ce se intampla aici este necesara studierealimbajului ASMc compilare in acest pas datele preprocesate sunt compilate iar outputul se numeste codshyobiect Acest cod obiect continepractic instructiunile CPU care vor constitui programul nostru efectiv Insa el nu contine detaliile care fac un executabil sa fie unexecutabil recunoscut ca atare de sistemul de operare El contine insa referinte la alte resurse (mai mult sau mai putin) externedespre care vom vorbi intrshyun experiment viitor referinte pe care leshyai vazut si in fisierul ASM precum _printf Codul obiectcontine simplificat vorbind instructiunile pure binare si nimic altceva

Si la acest pas putem refolosi outputul oricaruia dintre pasii anteriori ca input insa ii putem spune lui gcc sa se opreasca dupapasul de compilare cu parametrul shyc

gcc shyWall shyc shyo maino mains

sau

gcc shyWall shyc shyo maino maini

sau

gcc shyWall shyc shyo maino mainc

Gcc va decide in functie de tipul inputului ce fisiere temporare trebuie sa genereze Insa cum noi avem deja cel mai apropiat tipde input (fisierul asamblat) de ceea ce vrem (codul obiect) doar prima varianta are sens Astfel putem creste viteza de compilare(deoarece pasii intermediari de preprocesare si asamblare nu mai sunt necesari)

Insa de la orice input am pleca outputul maino va fi identic

Aruncand un ochi pe fisierul rezultat maino observam ca nu pricepem mare lucru deoarece outputul compilarii nu mai este untext cum a fost in cazul preprocesarii si al asamblarii ci un fisier binar cu instructiuni CPU Acele instructiuni vor fi executatede circuitele electronice din CPU

Totusi ne regasim textul hello world si vedem si nume precum printf sau main functii care apar si in programDeci rezultatul compilarii maino cel putin pare a reflecta in mare ce am scris noi in mainc si deci secvential si in maini simainsd linkareAcesta este ultimul pas in traducerea lui mainc din limbajul C in limbajul binar al CPUshyului Deoarece e ultimul pas lui GCC nutrebuie sashyi spui sa se opreasca la un anumit pas cum ai facut cu shyE pentru procesare shyS pentru asamblare sau shyc pentrucompilare Nu trebuie decat sashyl hranesti cu input provenit de la oricare output din pasii anteriori sau cu mainc insusi GCC isiva genera fisierele temporare de care are nevoie Cum noi avem insa outputul cel mai apropiat de ceea ce vrem cel mai eficienteste sashyl linkam pe acesta

gcc shyWall shyo helloexe maino

A linka inseamna a crea legaturi Pasul acesta creaza legatura dintre codul obiect din fisierul o si biblioteca standard C (pescurt libc stdlibc sau sub windows vei mai intalni si numele de msvcrt) In experimentul urmator vom vedea ce este aceastastdlibc si ce rol areConcluziiAm aflat ca ceea ce numeam pana acum compilare este defapt o serie de pasi (preprocesare asamblare compilare linkare)ordonati iar fiecare pas are ca input outputul pasului anterior Totul pleaca de la codul sursa scris de programator si se ajungela fisierul executabil care este (in principiu) inputul unei alte componente de data aceasta una hardware procesorul insusi

Compilarea este defapt tehnic corect vorbind doar acesta al treilea pas din ceea ce intelegeam inainte prin compilare

Compilatorul GCC ne lasa sa ne oprim dupa oricare dintre acesti pasi cu unul dintre parametrii shyE shyS sau shyc Astfel putem vedeaexact ce se intampla sub capota

In experimentele viitoare vei vedea ca in mod obisnuit nu vei avea deshya face cu datele de iesire ale pasilor de preprocesare siasamblare insa des vei fi confruntat cu utilizarea parametrului shyc chiar si in viata de zi cu zi de programator

Urmatoarele experimente vor vorbi mai indeaproape despre sculele de programa existente despre biblioteci IDEshyuri si alte detalii

Asigurashyte ca ai inteles mai intai toate lucrurile de mai sus pentru a castiga o claritate cat mai mare din cele ce urmeaza shy altfel nu

vei intelege mare lucru din experimentele viitoare

14 Ce este biblioteca standard

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 714

Biblioteca standard este o biblioteca care ii este pusa implicit la dispozitie unui cod sursa Limbajul C are o biblioteca standard numitacolocvial stdlibc limbajul C++ are o biblioteca standard numita colocvial stdlibc++

Bibliotecile standard vin de obicei la pachet cu setul de scule (compilator linker etc) de programare folosit Astfel se face ca gcc (mingw) neofera o biblioteca standard visual c++ ne ofera o alta biblioteca standard samd

Toate aceste biblioteci respecta mai mult sau mai putin un standard comun (standardul ISO C care specifica intregul limbaj ChttpenwikipediaryISO_Standard (httpenwikipediaorgwikiC_standard_libraryISO_Standard) ) de aceea nu conteaza cu cecompilator compilam un program care foloseste doar lucrurile standard

Noi vom folosi ca si pana acum compilatorul gcc cu biblioteca sa standard

Compileaza codul sursa anterior mainc al programului hello world astfel

gcc shynostdlib mainc

Parametrul shynostdlib ii spune linkerului (numit ldexe un program la fel ca gccexe) apelat in spatele cortinei de compilatorul gccexe sanu includa biblioteca standard in programul nostru

In output vedem concret cum gcc a generat acele fisiere temporare codshyobiect (o) si cum ld (ld returned 1 exit status) returneaza eroare (acelreturn 0 pe care il scrii tu in programe ii spune sistemului de operare ca procesul tau sshya terminat cu succes ei bine aici programul ldexeface pe undeva return 1 pentru ashyi spune apelantului (aici gccexe si nu sistemul de operare pentru ca nu ai introdus tu ldexe pentru alinka manual codul obiect al lui maino cu biblioteca standard) ca procesul sshya terminat cu o eroare

Quote

TempccD9bI55omainc(text+0xa) undefined reference to amp96__main

TempccD9bI55omainc(text+0x16) undefined reference to amp96printf

collect2 ld returned 1 exit status

Hai sa incercam acelasi lucru si manual generarea de cod obiect si linkshyarea manuala

Introdu

gcc shyc mainc

Acum pentru a linka invoca linkershyul ld (toti parametrii trebuiesc scrisi pe o singura linie)

Quote

ld shyBdynamic

cprogramarecompilatorlibcrt2o cprogramarecompilatorlibgccmingw32441crtbeginoshyLCprogramarecompilatorlibgccmingw32441 shyLcprogramarecompilatorlibgcc shyLCprogramarecompilatormingw32lib shyLCprogramarecompilatorlib

maino

shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt shyluser32 shylkernel32 shyladvapi32 shylshell32 shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt

cprogramarecompilatorlibgccmingw32441crtendo

(Nota 441 ar trebui sa fie inlocuit cu versiunea gcc folosita de tine)

Asupra parametrului shyBdynamic voi reveni mai tarziu

Dupa cum vezi sunt linkshyate mai intai doua fisiere codshyobiect pe care nu leshyam scris noi crt2o si crtbegino Hai sa vedem ce se afla in crt2oIntroducd Cprogramarecompilatorlibnm crt2o

aceasta ultima comanda va afisa toate simbolurile dintrshyun fisier codshyobiect (lib o a la) Printre acele simboluri vedem si simbolul__main despre care se plangea ld ca nushyl gaseste atunci cand am folosit parametrul shynostdlib pentru gcc

Dupa cum stii din unele din punctele anterioare simbolul printf nu exista este numit _printf deci hai sa ne uitam dupa el (ca sa neasiguram ca exista si ca nimic nu e magic) in biblioteca msvcrt

nm cprogramarecompilatorliblibmsvcrta gt libmsvcrtnm

apoi deschide fisierul text nou creat libmsvcrtnm si cauta dupa _printf shy vei vedea ca e acolo

Parametrul shyBdynamic de mai sus spune ca se va linka dinamic cu biblioteca standard O linkare dinamica sub windows inseamna ca intrshyun final se vor apela functii aflate in fisiere dll (precum _printf) shy de exemplu in msvcrt70dll (70 e versiunea) Asa cum exista o linkaredinamica exista si una statica shy o linkare statica (analog cu o alocare statica a unei variabile) inseamna ca acea biblioteca ar deveni parte afisierului nostru exe si in consecinta marimea lui ar creste cu cativa Mb

Parametrii de mai sus care incep cu shyLltcalegt ii spun linkerului in ce directoare sa se uite dupa biblioteci apoi atunci cand acestea vor fispecificate cu parametrii shylltnumegt

De exemplu biblioteca msvcrt se afla in directorul cprogramarecompilatorlib Standardul de denumire al fisierelor ce constituie bibliotecieste libltnumegta ltnumegt putand fi apoi folosit la linia de comanda pentru a linka (a lipi unul de altul) mai multe biblioteci si fisiere codshyobiect (precum maino al nostru shy care si el este specificat pe linia de comanda)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 814

Uitashyte atent la acesti parametri pentru ld si exploreaza si singur pentru ca nu voi mai intra in detaliiToate bibliotecile specificate cu parametrul shyl sunt necesare pentru ca programul final sa functioneze sub windows

La sfarsit de tot mai adaugam si codulshyobiect crtendo care se ocupa cu terminarea corecta a procesuluiDeci contrar credintelor tale de pana acum return 0 nu este nicidecum ultima instructiune executata de un proces la fel cum nici main nueste primul lucru executat de un proces shy se trece mai intai prin functia __main care pregateste mai intai functia main() scrisa de tine pentrua fi apelata

Concluzia ceea ce scriem noi un amarat de fisier maino este doar o mica parte din program Acest cod va fi inconjurat de cateva biblioteciin functie de sistemul de operare (aici windows)

15 O credinta populara

O credinta populara spune ca fisierele header precum stdioh contin functii Nimic mai gresit Functiile sunt implementate in biblioteci nistefisiere binare pe care ai invatat sa le inspectezi cu comanda nm

Atunci cand linkam (ldexe) doua fisiere codshyobiect o (sau la sau a) nu stim ce se afla in acele fisiere shy doar le lipim unul de altul sirezulta un fisier executabil

Insa un compilator (gccexe) are nevoie sa stie cum arata o functie inainte de a o apela informatiile necesare fiind tipul de date alparametrilor si ordinea acestora

Cumulul intre tip de date si ordine al parametrilor unei functii constituie semnatura functiei Multi numesc aceasta semnatura si antetulfunctiei dar acest termen face mai mult aluzie la codul sursa C shy semnatura functiei in schimb indica natura binara a codului obiect

Haideti sa vedem ce se intampla atunci cand compilam un cod sursa fara ashyi spune compilatorului semnaturile functiilor (precum _printf dinlibmsvcrta)

cod

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilaregcc shyWall shyo helloexe mainc

Ne va spune

Quote

warning implicit declaration of function printf

ATENTIE compilatorul spune foarte corect declaration pentru ca intrshyadevar este vorba despre declararea functiei printfImplementarea functiei printf (instructiunile binare CPU ce o definesc) sta bine mersi in libmsvcrta

Deci hai sa ii dam compilatorului ce ne cere Cod

int printf(char fmt )

define EXIT_SUCCESS 0

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilam

gcc shyWall shyo helloexe mainc

Dupa cum vezi in loc sa ne folosim de declaratia functiei printf existenta in stdioh si a constantei EXIT_SUCCESS din stdlibh pur si simpluleshyam declarat direct in codul nostru sursa intrshyun mod similar in care sunt declarate in acele fisiere

Concluzie mare atentie la cei doi termeni declararea (antetul semnatura) unei functii vs implementarea unei functii (instructiunileCPU din codul obiect sau lista de instructiuni din codul sursa shy blocul de instructiuni al functiei shy caci si functii ca printf trebuiesc sa fi fostimplementate pe undeva nu pica din cer shy deschide Cprogramarecompilatorincludestdioh si convingeshyte ca acolo chiar nu se aflaabsolut nicio implementare)

16 Lucrul cu mai multe fisiere codshyobiect intrshyun proiect

Intrshyunul din experimentele anterioare am vazut cum codul nostru obiect maino era linkat cu alte coduri obiecte o si biblioteci a pentru aforma fisierul exe final

Ei bine putem crea si noi mai multe fisiere o (vom vorbi si despre biblioteci intrshyun punct urmator) pe care sa le linkam alaturi de acestmaino Asta duce la o reutilizare mai usoara a codului

Reutilizarea codului se face prin impartirea functionalitatii mari in functionalitati mai mici prin functii Aceasta impartire in functii se mainumeste si modularizarea codului Fisierele o sau bibliotecile a ar putea fi deci considerate module de functii

Deci vom face un nou proiect prime ceea ce nu inseamna nimic mai mult decat un director nou gol in workspaceshyul nostruCprogramareproiecte

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 914

Comenzi

cd Cprogramareproiecte

mkdir prime

Si gata proiectul shy)

cream un nou fisier primec

int is_prime(unsigned int n)

unsigned int i

for(i=2 i lt= n2 i++)

if(ni == 0)

return 0

return 1

(nota stiu ca exista algoritmi mai buni aici vreau sa ilustrez altceva nu sa fac kungshyfu in algoritmica)

Perfect acum il putem compila

gcc shyc shyWall primec

si neshyam ales cu un fisier primeo

scriem mainc

include ltstdiohgt

include ltstdlibhgt

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

CompilamCprogramareproiecteprimegt gcc shyWall shyc maincPrimim eroarea

Quote

mainc In function main

mainc8 warning implicit declaration of function is_prime

Dupa cum observam (inca o data) compilatorul nu stie cum arata semnatura functiei is_prime() Ne da totusi doar o avertizare nu o eroare sine genereaza totusi codul obiect maino deci desi stim ca ar trebui sa adaugam declaratia functiei is_prime inaintea implementarii luimain() hai sa testam care ii sunt limitele si ce se intampla daca nu o facem

Deci trecem la pasul urmator de a linka cele doua fisiere codshyobiect

gcc shyo primeexe shyWall maino primeo

apoi executam primeexe

Procesul primeexe va cere numarul insa atunci cand va ajunge la apelul functiei is_prime va crapa

Inca o dovada ca chiar si doar avertizarile trebuiesc luate in serios si reparate

Deci adaugam semnatura functiei inaintea lui main()

int is_prime(unsigned int)

Atentie semnatura unei functii nu are nevoie de identificatorii parametrilor ci doar de tipul de date

Acum recompilam mainc (primec e deja compilat si nu am schimbat nimic in acel fisier deci primeo e la fel de util ca si inainte)

gcc shyc shyWall mainc

si linkam

gcc shyo primeexe shyWall maino primeo

Perfect primeexe functioneaza Totusi avem o problema pe parcurs vom mai adauga functii in primec pentru lucrul cu numerele primeProblema este ca1 in toate celelalte fisiere c unde vom vrea sa apelam acele functii va trebui sa declaram functiile cu exact aceleasi semnaturi ca in primecDaca cumva o semnatura a unei functii se schimba in primec va trebui sa cautam in toate celelalte fisiere si sa modificam semnatura

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 4: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 414

Pentru a afla cu cat creste un executabil cu fiecare variabila foloseste operatorul sizeof()

printf(un int ocupa d bytessizeof(int))

shyshyshy defapt tipul de date este folosit de compilator si pentru a decide ce instructiuni binare pentru CPU sa scrie in executabil pentru ca atribuireaunei valori de tip char are o alta instructiune CPU decat cea pentru atribuirea unei valori de tip integer (e doar un exemplu dar exemple sunt ogramada) in practica trebuie sa aloci static foarte multe variabile pentru a observa o diferenta in marime sizeof() este un operator nu o functie si este evaluat la compilare ca orice alt operator

intrebare de profunzime pur teoretic daca CPUshyul tau si sistemul de operare sunt pe 64 biti si scrii si compilezi un program care afiseazamarimea unui integer program pe care ishyl trimiti si unui prieten cu un sistem pe 32 biti de ce pe ambele calculatoare ar afisa 8 chiar dacape calculatorul prietenului tau marimea unui integer este defapt 4

10 Ce este defapt o variabilaO variabila asa cum este ea folosita de un programator este o colectie de patru elemente

1 un nume sau identificator util compilatorului si programatorului2 o valoare3 un tip de date util compilatorului pentru a sti cum sa manipuleze acea variabila4 o adresa de memorie

11 Cum aflu adresa de memorie a unei variabileFolosind operatorul unar amp de exemplu

int i

printf(adresa variabilei i este pampi)

In C cu siguranta ai folosit deja scanf() pentru a citi valoarea unei variabile

int i

printf(introduceti i)

scanf(dampi)

Ei bine acel apel la scanf() se traduce cam asa citeste un numar intreg (specificat de d) si salveazashyl la adresa variabilei i12 Cand foloseste compilatorul valoarea unei variabile si cand foloseste adresa sa

In afara de cazul explicit in care folosesti operatorul amp compilatorul foloseste cele doua caracteristici (din totalul de patru) la compilare astfel

atunci cand atribui o valoare (constanta precum 10 mai sus sau variabila) unei variabile i compilatorul foloseste adresa acesteia

i = 10

j = n

prima instructiune se citeste copiaza constanta 10 la adresa variabilei i iar a doua copiaza valoarea variabilei n la adresa variabileijIn termeni tehnici ceea ce se afla in stanga operatorului de atribuire se numeste left value sau pe scurt lvalueIn exemplul de mai sus insa variabila n este tratata ca rvalue iar pe compilator il intereseaza valoarea sa

13 Ajutor Toti termenii astia ma deruteazacompilare linkare header IDE biblioteca

Scopul acestei sectiuni este sa iti explice teoria si utilitatea practica a tuturor acestor notiuni Categoric trebuie sa le intelegi Vei instala unmediu curat de programare de la zero componenta cu componenta si vei invata cum conlucreaza acestea si ce rol are fiecare

Intra pe httptdmshygcctdragonnetdownload (httptdmshygcctdragonnetdownload) si descarca OnshyDemand Installer Acest program vainstala compilatorul numit gcc Mai exact va instala portul gcc pentru windows numit MinGW (minimalist GNU for windows) gcc fiindcompilatorul standard pentru lumea GNULinux

Un port al unui program este o adaptare a acelui program pentru o alta platforma

Vrem sa folosim TDM pentru a instala MinGW deoarece MinGW nu dispune de un instalator comun si fara el ar trebui sa instalam totulmanual ceea ce e destul de complicat

Muta instalatorul intrshyun director nou creat Cprogramare Cu el vei putea si administra instalarile TDM deja existente (ca cea pe careurmeaza sa o creezi)

Nota poti instala orice oriunde vrei tu insa in continuare voi folosi foarte mult aceste cai deci tishyai face un bine daca ai urma exactinstructiunile mele

Daca ceva nu functioneaza cum trebuie si ai instalate alte scule de programare precum DevshyCpp CodeBlocks sau altele dezinstaleazashyletemporar Nu vei fi nevoit sa dezinstalezi Visual Studio sau Borland C++

Alege optiunea Create pentru a crea o noua instalare In urmatoarea pagina pentru Installation Directory introduCprogramarecompilator (fara ghilimele)

In rest instalarea cu valorile predefinite ar trebui sa fie perfecta

Acum in StartshygtAll programsshygtMinGW ai o legatura catre interfata CLI (httpenwikipediaorgwikiCommandshyline_interface) a sistemuluide operare cunoscuta sub windows si ca msshydos prompt Ceea ce face aceasta legatura este practic sa importe niste setari prin fisierulCprogramarecompilatormingwvarsbat

Cand ii dam drumul ne va pune automat in directorul Cprogramarecompilator Asta nu este neaparat o problema insa mult mai bine ar fidaca neshyar pune intrshyun director special unde ne vom tine noi proiectele Insa pentru asta trebuie mai intai sa cream un astfel de director Deci

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 514

creaza directorul Cprogramareproiecte

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vinede la change directory) in proiecte

cd proiecte

Inchide orice msshydos prompt daca il mai ai deschis si relanseazashyl Acum ar trebui sa te afli in Cprogramareproiecte

Bun avem totul setat si organizat intrshyun mod curat Acum hai sa cream un nou proiectAsta nu inseamna nimic mai mult sau mai putin decat a crea un nou subdirector in proiecte numit hello in care ne vom salva toatefisierele proiectului Deci introdu comanda necesara

mkdir hello

(mkdir = make directory)apoi schimba directorul curent in noul subdirector creat

cd hello

Hai sa facem ceva ce probabil stii sa scriem un cod sursa si sa testam in final daca totul functioneaza cum trebuie

edit mainc

Apoi introdu codul sursa

include ltstdiohgt

include ltstdlibhgt

int main(void)

printf(hello world)

return EXIT_SUCCESS

(nota la sfarsitul fisierului se afla o linie noua goala Asta este parte din standardul actual si modern al limbajului C)

In meniul editorului selecteaza File shygt Save si apoi File shygt Exit

Acum avem un fisier mainc care abia asteapta sa fie compilat Deci introdu comanda

gcc shyWall mainc

shyWall este un parametru si ii spune compilatorului sa genereze avertizari (W vine de la warnings) pentru toti (all) pasii ce implica ocompilare Este bine sa pui shyWall de fiecare data astfel compilatorul te va avertiza despre eventualele greseli pe care leshyai facut

Daca nu ai facut nicio greseala atunci compilatorul nu va afisa nimic El va genera insa un fisier aexeIl poti lansa in executie introducand in prompt

aexe

Ar trebui sa vezi pe ecran textul hello world

Fisierul se numeste din motive istorice aexe Daca vrem ca outputul compilatorului sa se numeasca altfel trebuie sashyi spunem asta prinparametrul shyo ltnume programgt shyo vine de la output Asadar ar trebui sa introducem

gcc shyWall shyo helloexe mainc

Am testat deci instalarea si totul functioneaza perfect Insa noi nu neshyam indeplinit misiunea sa intelegem sculele pe care le folosim si cumfunctioneaza acestea macar cat de cat Asta ne va face niste programatori mai buni

Deci vom face cateva experimente pe care le vom analiza pentru a ne putea explica cele mai importante concepte Unele dintre experimentevor genera erori ceea ce e dorit (eu vreau sa fac lucruri anormale pentru a demonstra ceva) Experimentele contin si explicatii teoretice sidemonstratii practice

1 Experiment 1 compilare si linkare

Compilatorul nostru numit gccexe (gcc vine de la GNU C Compiler) neshya compilat anterior codul sursa si a generat directexecutabilul Compilarea este constituita insa din mai multi pasi de la codul sursa scris in C pana la fisierul executabil care contineinstructiuni executate de electronica din CPU e drum lung Pe rand pasii acestia sunt

a preprocesare preprocesorul proceseaza toate instructiunile dedicate lui adica toate instructiunile care incep cu astainclude si directiva preprocesor include pe care am folositshyo si noi in programul nostru include practic include un fisieriar rezultatul arata de ca si cum continutul fisierului inclus ar fi fost scris de noi manual in maincPentru a vedea rezultatul acestui pas trebuie sa ii pasam compilatorului parametrul shyE care ii spune sa se opreasca imediatdupa pasul de preprocesare

gcc shyWall shyE shyo maini mainc

Deschide fisierul generat maini si wow o gramada de cod sunt peste 600 de linii de cod C foarte valid si necesar pentru caamarata noastra de functie main() (care se afla la sfarsitul fisierului) sa functioneze cum trebuie

b asamblare outputul acestui pas este inrudit cu un alt limbaj numit limbaj de asamblare (sau scurt ASM) InstructiunileASM coincid aproape 11 cu instructiunile binare care vor fi executate de CPU Acesta este ultimul pas care va fi inteligibil destulincat sa ne ofere informatii despre ce va face procesorul Outputul urmatorului pas (compilarea) este deja mult prea binar pentruun programator ordinar

Lui gcc ii spunem sa se opreasca dupa pasul de ansamblare cu parametrul shyS

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 614

Putem refolosi fisierul preprocesat maini astfel

gcc shyWall shyS shyo mains maini

sau ii putem spune compilatorului sa o ia de la capat incepand cu mainc sa salveze temporar un nou fisier preprocesat si sashylasambleze pe acela oprindushyse dupa pasul de asamblare

gcc shyWall shyS shyo mains mainc

In ambele cazuri comenzile sunt aceleasi Ceea ce difera este extensia fisierului de input (i sau c) in functie de care gcc decidece este de facut (daca mai este necesara o preprocesare sau nu)

Aruncand un ochi in fisierul asamblat mains ne regasim stringul ascii hello world0 care ne arata clar ca un string in C setermina in caracterul NUL (nu NULL) vedem si numele functiilor folosite precum main sau printf chiar daca acestea suntprecedate de unul sau doua _ si mai vedem si instructiuni ASM De exemplu instructiunea ASM

call __main

apeleaza functia noastra main() Insa dupa cum observi ea nu este nicidecum primul lucru executat de procesor (desi cusiguranta ti sshya spus la scoala main shy aici incepe programul) Compilatorul a adaugat automat pentru noi alte instructiuniinaintea sa instructiuni care pregatesc apelul efectiv Pentru a intelege cu adevarat ce se intampla aici este necesara studierealimbajului ASMc compilare in acest pas datele preprocesate sunt compilate iar outputul se numeste codshyobiect Acest cod obiect continepractic instructiunile CPU care vor constitui programul nostru efectiv Insa el nu contine detaliile care fac un executabil sa fie unexecutabil recunoscut ca atare de sistemul de operare El contine insa referinte la alte resurse (mai mult sau mai putin) externedespre care vom vorbi intrshyun experiment viitor referinte pe care leshyai vazut si in fisierul ASM precum _printf Codul obiectcontine simplificat vorbind instructiunile pure binare si nimic altceva

Si la acest pas putem refolosi outputul oricaruia dintre pasii anteriori ca input insa ii putem spune lui gcc sa se opreasca dupapasul de compilare cu parametrul shyc

gcc shyWall shyc shyo maino mains

sau

gcc shyWall shyc shyo maino maini

sau

gcc shyWall shyc shyo maino mainc

Gcc va decide in functie de tipul inputului ce fisiere temporare trebuie sa genereze Insa cum noi avem deja cel mai apropiat tipde input (fisierul asamblat) de ceea ce vrem (codul obiect) doar prima varianta are sens Astfel putem creste viteza de compilare(deoarece pasii intermediari de preprocesare si asamblare nu mai sunt necesari)

Insa de la orice input am pleca outputul maino va fi identic

Aruncand un ochi pe fisierul rezultat maino observam ca nu pricepem mare lucru deoarece outputul compilarii nu mai este untext cum a fost in cazul preprocesarii si al asamblarii ci un fisier binar cu instructiuni CPU Acele instructiuni vor fi executatede circuitele electronice din CPU

Totusi ne regasim textul hello world si vedem si nume precum printf sau main functii care apar si in programDeci rezultatul compilarii maino cel putin pare a reflecta in mare ce am scris noi in mainc si deci secvential si in maini simainsd linkareAcesta este ultimul pas in traducerea lui mainc din limbajul C in limbajul binar al CPUshyului Deoarece e ultimul pas lui GCC nutrebuie sashyi spui sa se opreasca la un anumit pas cum ai facut cu shyE pentru procesare shyS pentru asamblare sau shyc pentrucompilare Nu trebuie decat sashyl hranesti cu input provenit de la oricare output din pasii anteriori sau cu mainc insusi GCC isiva genera fisierele temporare de care are nevoie Cum noi avem insa outputul cel mai apropiat de ceea ce vrem cel mai eficienteste sashyl linkam pe acesta

gcc shyWall shyo helloexe maino

A linka inseamna a crea legaturi Pasul acesta creaza legatura dintre codul obiect din fisierul o si biblioteca standard C (pescurt libc stdlibc sau sub windows vei mai intalni si numele de msvcrt) In experimentul urmator vom vedea ce este aceastastdlibc si ce rol areConcluziiAm aflat ca ceea ce numeam pana acum compilare este defapt o serie de pasi (preprocesare asamblare compilare linkare)ordonati iar fiecare pas are ca input outputul pasului anterior Totul pleaca de la codul sursa scris de programator si se ajungela fisierul executabil care este (in principiu) inputul unei alte componente de data aceasta una hardware procesorul insusi

Compilarea este defapt tehnic corect vorbind doar acesta al treilea pas din ceea ce intelegeam inainte prin compilare

Compilatorul GCC ne lasa sa ne oprim dupa oricare dintre acesti pasi cu unul dintre parametrii shyE shyS sau shyc Astfel putem vedeaexact ce se intampla sub capota

In experimentele viitoare vei vedea ca in mod obisnuit nu vei avea deshya face cu datele de iesire ale pasilor de preprocesare siasamblare insa des vei fi confruntat cu utilizarea parametrului shyc chiar si in viata de zi cu zi de programator

Urmatoarele experimente vor vorbi mai indeaproape despre sculele de programa existente despre biblioteci IDEshyuri si alte detalii

Asigurashyte ca ai inteles mai intai toate lucrurile de mai sus pentru a castiga o claritate cat mai mare din cele ce urmeaza shy altfel nu

vei intelege mare lucru din experimentele viitoare

14 Ce este biblioteca standard

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 714

Biblioteca standard este o biblioteca care ii este pusa implicit la dispozitie unui cod sursa Limbajul C are o biblioteca standard numitacolocvial stdlibc limbajul C++ are o biblioteca standard numita colocvial stdlibc++

Bibliotecile standard vin de obicei la pachet cu setul de scule (compilator linker etc) de programare folosit Astfel se face ca gcc (mingw) neofera o biblioteca standard visual c++ ne ofera o alta biblioteca standard samd

Toate aceste biblioteci respecta mai mult sau mai putin un standard comun (standardul ISO C care specifica intregul limbaj ChttpenwikipediaryISO_Standard (httpenwikipediaorgwikiC_standard_libraryISO_Standard) ) de aceea nu conteaza cu cecompilator compilam un program care foloseste doar lucrurile standard

Noi vom folosi ca si pana acum compilatorul gcc cu biblioteca sa standard

Compileaza codul sursa anterior mainc al programului hello world astfel

gcc shynostdlib mainc

Parametrul shynostdlib ii spune linkerului (numit ldexe un program la fel ca gccexe) apelat in spatele cortinei de compilatorul gccexe sanu includa biblioteca standard in programul nostru

In output vedem concret cum gcc a generat acele fisiere temporare codshyobiect (o) si cum ld (ld returned 1 exit status) returneaza eroare (acelreturn 0 pe care il scrii tu in programe ii spune sistemului de operare ca procesul tau sshya terminat cu succes ei bine aici programul ldexeface pe undeva return 1 pentru ashyi spune apelantului (aici gccexe si nu sistemul de operare pentru ca nu ai introdus tu ldexe pentru alinka manual codul obiect al lui maino cu biblioteca standard) ca procesul sshya terminat cu o eroare

Quote

TempccD9bI55omainc(text+0xa) undefined reference to amp96__main

TempccD9bI55omainc(text+0x16) undefined reference to amp96printf

collect2 ld returned 1 exit status

Hai sa incercam acelasi lucru si manual generarea de cod obiect si linkshyarea manuala

Introdu

gcc shyc mainc

Acum pentru a linka invoca linkershyul ld (toti parametrii trebuiesc scrisi pe o singura linie)

Quote

ld shyBdynamic

cprogramarecompilatorlibcrt2o cprogramarecompilatorlibgccmingw32441crtbeginoshyLCprogramarecompilatorlibgccmingw32441 shyLcprogramarecompilatorlibgcc shyLCprogramarecompilatormingw32lib shyLCprogramarecompilatorlib

maino

shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt shyluser32 shylkernel32 shyladvapi32 shylshell32 shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt

cprogramarecompilatorlibgccmingw32441crtendo

(Nota 441 ar trebui sa fie inlocuit cu versiunea gcc folosita de tine)

Asupra parametrului shyBdynamic voi reveni mai tarziu

Dupa cum vezi sunt linkshyate mai intai doua fisiere codshyobiect pe care nu leshyam scris noi crt2o si crtbegino Hai sa vedem ce se afla in crt2oIntroducd Cprogramarecompilatorlibnm crt2o

aceasta ultima comanda va afisa toate simbolurile dintrshyun fisier codshyobiect (lib o a la) Printre acele simboluri vedem si simbolul__main despre care se plangea ld ca nushyl gaseste atunci cand am folosit parametrul shynostdlib pentru gcc

Dupa cum stii din unele din punctele anterioare simbolul printf nu exista este numit _printf deci hai sa ne uitam dupa el (ca sa neasiguram ca exista si ca nimic nu e magic) in biblioteca msvcrt

nm cprogramarecompilatorliblibmsvcrta gt libmsvcrtnm

apoi deschide fisierul text nou creat libmsvcrtnm si cauta dupa _printf shy vei vedea ca e acolo

Parametrul shyBdynamic de mai sus spune ca se va linka dinamic cu biblioteca standard O linkare dinamica sub windows inseamna ca intrshyun final se vor apela functii aflate in fisiere dll (precum _printf) shy de exemplu in msvcrt70dll (70 e versiunea) Asa cum exista o linkaredinamica exista si una statica shy o linkare statica (analog cu o alocare statica a unei variabile) inseamna ca acea biblioteca ar deveni parte afisierului nostru exe si in consecinta marimea lui ar creste cu cativa Mb

Parametrii de mai sus care incep cu shyLltcalegt ii spun linkerului in ce directoare sa se uite dupa biblioteci apoi atunci cand acestea vor fispecificate cu parametrii shylltnumegt

De exemplu biblioteca msvcrt se afla in directorul cprogramarecompilatorlib Standardul de denumire al fisierelor ce constituie bibliotecieste libltnumegta ltnumegt putand fi apoi folosit la linia de comanda pentru a linka (a lipi unul de altul) mai multe biblioteci si fisiere codshyobiect (precum maino al nostru shy care si el este specificat pe linia de comanda)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 814

Uitashyte atent la acesti parametri pentru ld si exploreaza si singur pentru ca nu voi mai intra in detaliiToate bibliotecile specificate cu parametrul shyl sunt necesare pentru ca programul final sa functioneze sub windows

La sfarsit de tot mai adaugam si codulshyobiect crtendo care se ocupa cu terminarea corecta a procesuluiDeci contrar credintelor tale de pana acum return 0 nu este nicidecum ultima instructiune executata de un proces la fel cum nici main nueste primul lucru executat de un proces shy se trece mai intai prin functia __main care pregateste mai intai functia main() scrisa de tine pentrua fi apelata

Concluzia ceea ce scriem noi un amarat de fisier maino este doar o mica parte din program Acest cod va fi inconjurat de cateva biblioteciin functie de sistemul de operare (aici windows)

15 O credinta populara

O credinta populara spune ca fisierele header precum stdioh contin functii Nimic mai gresit Functiile sunt implementate in biblioteci nistefisiere binare pe care ai invatat sa le inspectezi cu comanda nm

Atunci cand linkam (ldexe) doua fisiere codshyobiect o (sau la sau a) nu stim ce se afla in acele fisiere shy doar le lipim unul de altul sirezulta un fisier executabil

Insa un compilator (gccexe) are nevoie sa stie cum arata o functie inainte de a o apela informatiile necesare fiind tipul de date alparametrilor si ordinea acestora

Cumulul intre tip de date si ordine al parametrilor unei functii constituie semnatura functiei Multi numesc aceasta semnatura si antetulfunctiei dar acest termen face mai mult aluzie la codul sursa C shy semnatura functiei in schimb indica natura binara a codului obiect

Haideti sa vedem ce se intampla atunci cand compilam un cod sursa fara ashyi spune compilatorului semnaturile functiilor (precum _printf dinlibmsvcrta)

cod

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilaregcc shyWall shyo helloexe mainc

Ne va spune

Quote

warning implicit declaration of function printf

ATENTIE compilatorul spune foarte corect declaration pentru ca intrshyadevar este vorba despre declararea functiei printfImplementarea functiei printf (instructiunile binare CPU ce o definesc) sta bine mersi in libmsvcrta

Deci hai sa ii dam compilatorului ce ne cere Cod

int printf(char fmt )

define EXIT_SUCCESS 0

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilam

gcc shyWall shyo helloexe mainc

Dupa cum vezi in loc sa ne folosim de declaratia functiei printf existenta in stdioh si a constantei EXIT_SUCCESS din stdlibh pur si simpluleshyam declarat direct in codul nostru sursa intrshyun mod similar in care sunt declarate in acele fisiere

Concluzie mare atentie la cei doi termeni declararea (antetul semnatura) unei functii vs implementarea unei functii (instructiunileCPU din codul obiect sau lista de instructiuni din codul sursa shy blocul de instructiuni al functiei shy caci si functii ca printf trebuiesc sa fi fostimplementate pe undeva nu pica din cer shy deschide Cprogramarecompilatorincludestdioh si convingeshyte ca acolo chiar nu se aflaabsolut nicio implementare)

16 Lucrul cu mai multe fisiere codshyobiect intrshyun proiect

Intrshyunul din experimentele anterioare am vazut cum codul nostru obiect maino era linkat cu alte coduri obiecte o si biblioteci a pentru aforma fisierul exe final

Ei bine putem crea si noi mai multe fisiere o (vom vorbi si despre biblioteci intrshyun punct urmator) pe care sa le linkam alaturi de acestmaino Asta duce la o reutilizare mai usoara a codului

Reutilizarea codului se face prin impartirea functionalitatii mari in functionalitati mai mici prin functii Aceasta impartire in functii se mainumeste si modularizarea codului Fisierele o sau bibliotecile a ar putea fi deci considerate module de functii

Deci vom face un nou proiect prime ceea ce nu inseamna nimic mai mult decat un director nou gol in workspaceshyul nostruCprogramareproiecte

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 914

Comenzi

cd Cprogramareproiecte

mkdir prime

Si gata proiectul shy)

cream un nou fisier primec

int is_prime(unsigned int n)

unsigned int i

for(i=2 i lt= n2 i++)

if(ni == 0)

return 0

return 1

(nota stiu ca exista algoritmi mai buni aici vreau sa ilustrez altceva nu sa fac kungshyfu in algoritmica)

Perfect acum il putem compila

gcc shyc shyWall primec

si neshyam ales cu un fisier primeo

scriem mainc

include ltstdiohgt

include ltstdlibhgt

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

CompilamCprogramareproiecteprimegt gcc shyWall shyc maincPrimim eroarea

Quote

mainc In function main

mainc8 warning implicit declaration of function is_prime

Dupa cum observam (inca o data) compilatorul nu stie cum arata semnatura functiei is_prime() Ne da totusi doar o avertizare nu o eroare sine genereaza totusi codul obiect maino deci desi stim ca ar trebui sa adaugam declaratia functiei is_prime inaintea implementarii luimain() hai sa testam care ii sunt limitele si ce se intampla daca nu o facem

Deci trecem la pasul urmator de a linka cele doua fisiere codshyobiect

gcc shyo primeexe shyWall maino primeo

apoi executam primeexe

Procesul primeexe va cere numarul insa atunci cand va ajunge la apelul functiei is_prime va crapa

Inca o dovada ca chiar si doar avertizarile trebuiesc luate in serios si reparate

Deci adaugam semnatura functiei inaintea lui main()

int is_prime(unsigned int)

Atentie semnatura unei functii nu are nevoie de identificatorii parametrilor ci doar de tipul de date

Acum recompilam mainc (primec e deja compilat si nu am schimbat nimic in acel fisier deci primeo e la fel de util ca si inainte)

gcc shyc shyWall mainc

si linkam

gcc shyo primeexe shyWall maino primeo

Perfect primeexe functioneaza Totusi avem o problema pe parcurs vom mai adauga functii in primec pentru lucrul cu numerele primeProblema este ca1 in toate celelalte fisiere c unde vom vrea sa apelam acele functii va trebui sa declaram functiile cu exact aceleasi semnaturi ca in primecDaca cumva o semnatura a unei functii se schimba in primec va trebui sa cautam in toate celelalte fisiere si sa modificam semnatura

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 5: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 514

creaza directorul Cprogramareproiecte

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vinede la change directory) in proiecte

cd proiecte

Inchide orice msshydos prompt daca il mai ai deschis si relanseazashyl Acum ar trebui sa te afli in Cprogramareproiecte

Bun avem totul setat si organizat intrshyun mod curat Acum hai sa cream un nou proiectAsta nu inseamna nimic mai mult sau mai putin decat a crea un nou subdirector in proiecte numit hello in care ne vom salva toatefisierele proiectului Deci introdu comanda necesara

mkdir hello

(mkdir = make directory)apoi schimba directorul curent in noul subdirector creat

cd hello

Hai sa facem ceva ce probabil stii sa scriem un cod sursa si sa testam in final daca totul functioneaza cum trebuie

edit mainc

Apoi introdu codul sursa

include ltstdiohgt

include ltstdlibhgt

int main(void)

printf(hello world)

return EXIT_SUCCESS

(nota la sfarsitul fisierului se afla o linie noua goala Asta este parte din standardul actual si modern al limbajului C)

In meniul editorului selecteaza File shygt Save si apoi File shygt Exit

Acum avem un fisier mainc care abia asteapta sa fie compilat Deci introdu comanda

gcc shyWall mainc

shyWall este un parametru si ii spune compilatorului sa genereze avertizari (W vine de la warnings) pentru toti (all) pasii ce implica ocompilare Este bine sa pui shyWall de fiecare data astfel compilatorul te va avertiza despre eventualele greseli pe care leshyai facut

Daca nu ai facut nicio greseala atunci compilatorul nu va afisa nimic El va genera insa un fisier aexeIl poti lansa in executie introducand in prompt

aexe

Ar trebui sa vezi pe ecran textul hello world

Fisierul se numeste din motive istorice aexe Daca vrem ca outputul compilatorului sa se numeasca altfel trebuie sashyi spunem asta prinparametrul shyo ltnume programgt shyo vine de la output Asadar ar trebui sa introducem

gcc shyWall shyo helloexe mainc

Am testat deci instalarea si totul functioneaza perfect Insa noi nu neshyam indeplinit misiunea sa intelegem sculele pe care le folosim si cumfunctioneaza acestea macar cat de cat Asta ne va face niste programatori mai buni

Deci vom face cateva experimente pe care le vom analiza pentru a ne putea explica cele mai importante concepte Unele dintre experimentevor genera erori ceea ce e dorit (eu vreau sa fac lucruri anormale pentru a demonstra ceva) Experimentele contin si explicatii teoretice sidemonstratii practice

1 Experiment 1 compilare si linkare

Compilatorul nostru numit gccexe (gcc vine de la GNU C Compiler) neshya compilat anterior codul sursa si a generat directexecutabilul Compilarea este constituita insa din mai multi pasi de la codul sursa scris in C pana la fisierul executabil care contineinstructiuni executate de electronica din CPU e drum lung Pe rand pasii acestia sunt

a preprocesare preprocesorul proceseaza toate instructiunile dedicate lui adica toate instructiunile care incep cu astainclude si directiva preprocesor include pe care am folositshyo si noi in programul nostru include practic include un fisieriar rezultatul arata de ca si cum continutul fisierului inclus ar fi fost scris de noi manual in maincPentru a vedea rezultatul acestui pas trebuie sa ii pasam compilatorului parametrul shyE care ii spune sa se opreasca imediatdupa pasul de preprocesare

gcc shyWall shyE shyo maini mainc

Deschide fisierul generat maini si wow o gramada de cod sunt peste 600 de linii de cod C foarte valid si necesar pentru caamarata noastra de functie main() (care se afla la sfarsitul fisierului) sa functioneze cum trebuie

b asamblare outputul acestui pas este inrudit cu un alt limbaj numit limbaj de asamblare (sau scurt ASM) InstructiunileASM coincid aproape 11 cu instructiunile binare care vor fi executate de CPU Acesta este ultimul pas care va fi inteligibil destulincat sa ne ofere informatii despre ce va face procesorul Outputul urmatorului pas (compilarea) este deja mult prea binar pentruun programator ordinar

Lui gcc ii spunem sa se opreasca dupa pasul de ansamblare cu parametrul shyS

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 614

Putem refolosi fisierul preprocesat maini astfel

gcc shyWall shyS shyo mains maini

sau ii putem spune compilatorului sa o ia de la capat incepand cu mainc sa salveze temporar un nou fisier preprocesat si sashylasambleze pe acela oprindushyse dupa pasul de asamblare

gcc shyWall shyS shyo mains mainc

In ambele cazuri comenzile sunt aceleasi Ceea ce difera este extensia fisierului de input (i sau c) in functie de care gcc decidece este de facut (daca mai este necesara o preprocesare sau nu)

Aruncand un ochi in fisierul asamblat mains ne regasim stringul ascii hello world0 care ne arata clar ca un string in C setermina in caracterul NUL (nu NULL) vedem si numele functiilor folosite precum main sau printf chiar daca acestea suntprecedate de unul sau doua _ si mai vedem si instructiuni ASM De exemplu instructiunea ASM

call __main

apeleaza functia noastra main() Insa dupa cum observi ea nu este nicidecum primul lucru executat de procesor (desi cusiguranta ti sshya spus la scoala main shy aici incepe programul) Compilatorul a adaugat automat pentru noi alte instructiuniinaintea sa instructiuni care pregatesc apelul efectiv Pentru a intelege cu adevarat ce se intampla aici este necesara studierealimbajului ASMc compilare in acest pas datele preprocesate sunt compilate iar outputul se numeste codshyobiect Acest cod obiect continepractic instructiunile CPU care vor constitui programul nostru efectiv Insa el nu contine detaliile care fac un executabil sa fie unexecutabil recunoscut ca atare de sistemul de operare El contine insa referinte la alte resurse (mai mult sau mai putin) externedespre care vom vorbi intrshyun experiment viitor referinte pe care leshyai vazut si in fisierul ASM precum _printf Codul obiectcontine simplificat vorbind instructiunile pure binare si nimic altceva

Si la acest pas putem refolosi outputul oricaruia dintre pasii anteriori ca input insa ii putem spune lui gcc sa se opreasca dupapasul de compilare cu parametrul shyc

gcc shyWall shyc shyo maino mains

sau

gcc shyWall shyc shyo maino maini

sau

gcc shyWall shyc shyo maino mainc

Gcc va decide in functie de tipul inputului ce fisiere temporare trebuie sa genereze Insa cum noi avem deja cel mai apropiat tipde input (fisierul asamblat) de ceea ce vrem (codul obiect) doar prima varianta are sens Astfel putem creste viteza de compilare(deoarece pasii intermediari de preprocesare si asamblare nu mai sunt necesari)

Insa de la orice input am pleca outputul maino va fi identic

Aruncand un ochi pe fisierul rezultat maino observam ca nu pricepem mare lucru deoarece outputul compilarii nu mai este untext cum a fost in cazul preprocesarii si al asamblarii ci un fisier binar cu instructiuni CPU Acele instructiuni vor fi executatede circuitele electronice din CPU

Totusi ne regasim textul hello world si vedem si nume precum printf sau main functii care apar si in programDeci rezultatul compilarii maino cel putin pare a reflecta in mare ce am scris noi in mainc si deci secvential si in maini simainsd linkareAcesta este ultimul pas in traducerea lui mainc din limbajul C in limbajul binar al CPUshyului Deoarece e ultimul pas lui GCC nutrebuie sashyi spui sa se opreasca la un anumit pas cum ai facut cu shyE pentru procesare shyS pentru asamblare sau shyc pentrucompilare Nu trebuie decat sashyl hranesti cu input provenit de la oricare output din pasii anteriori sau cu mainc insusi GCC isiva genera fisierele temporare de care are nevoie Cum noi avem insa outputul cel mai apropiat de ceea ce vrem cel mai eficienteste sashyl linkam pe acesta

gcc shyWall shyo helloexe maino

A linka inseamna a crea legaturi Pasul acesta creaza legatura dintre codul obiect din fisierul o si biblioteca standard C (pescurt libc stdlibc sau sub windows vei mai intalni si numele de msvcrt) In experimentul urmator vom vedea ce este aceastastdlibc si ce rol areConcluziiAm aflat ca ceea ce numeam pana acum compilare este defapt o serie de pasi (preprocesare asamblare compilare linkare)ordonati iar fiecare pas are ca input outputul pasului anterior Totul pleaca de la codul sursa scris de programator si se ajungela fisierul executabil care este (in principiu) inputul unei alte componente de data aceasta una hardware procesorul insusi

Compilarea este defapt tehnic corect vorbind doar acesta al treilea pas din ceea ce intelegeam inainte prin compilare

Compilatorul GCC ne lasa sa ne oprim dupa oricare dintre acesti pasi cu unul dintre parametrii shyE shyS sau shyc Astfel putem vedeaexact ce se intampla sub capota

In experimentele viitoare vei vedea ca in mod obisnuit nu vei avea deshya face cu datele de iesire ale pasilor de preprocesare siasamblare insa des vei fi confruntat cu utilizarea parametrului shyc chiar si in viata de zi cu zi de programator

Urmatoarele experimente vor vorbi mai indeaproape despre sculele de programa existente despre biblioteci IDEshyuri si alte detalii

Asigurashyte ca ai inteles mai intai toate lucrurile de mai sus pentru a castiga o claritate cat mai mare din cele ce urmeaza shy altfel nu

vei intelege mare lucru din experimentele viitoare

14 Ce este biblioteca standard

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 714

Biblioteca standard este o biblioteca care ii este pusa implicit la dispozitie unui cod sursa Limbajul C are o biblioteca standard numitacolocvial stdlibc limbajul C++ are o biblioteca standard numita colocvial stdlibc++

Bibliotecile standard vin de obicei la pachet cu setul de scule (compilator linker etc) de programare folosit Astfel se face ca gcc (mingw) neofera o biblioteca standard visual c++ ne ofera o alta biblioteca standard samd

Toate aceste biblioteci respecta mai mult sau mai putin un standard comun (standardul ISO C care specifica intregul limbaj ChttpenwikipediaryISO_Standard (httpenwikipediaorgwikiC_standard_libraryISO_Standard) ) de aceea nu conteaza cu cecompilator compilam un program care foloseste doar lucrurile standard

Noi vom folosi ca si pana acum compilatorul gcc cu biblioteca sa standard

Compileaza codul sursa anterior mainc al programului hello world astfel

gcc shynostdlib mainc

Parametrul shynostdlib ii spune linkerului (numit ldexe un program la fel ca gccexe) apelat in spatele cortinei de compilatorul gccexe sanu includa biblioteca standard in programul nostru

In output vedem concret cum gcc a generat acele fisiere temporare codshyobiect (o) si cum ld (ld returned 1 exit status) returneaza eroare (acelreturn 0 pe care il scrii tu in programe ii spune sistemului de operare ca procesul tau sshya terminat cu succes ei bine aici programul ldexeface pe undeva return 1 pentru ashyi spune apelantului (aici gccexe si nu sistemul de operare pentru ca nu ai introdus tu ldexe pentru alinka manual codul obiect al lui maino cu biblioteca standard) ca procesul sshya terminat cu o eroare

Quote

TempccD9bI55omainc(text+0xa) undefined reference to amp96__main

TempccD9bI55omainc(text+0x16) undefined reference to amp96printf

collect2 ld returned 1 exit status

Hai sa incercam acelasi lucru si manual generarea de cod obiect si linkshyarea manuala

Introdu

gcc shyc mainc

Acum pentru a linka invoca linkershyul ld (toti parametrii trebuiesc scrisi pe o singura linie)

Quote

ld shyBdynamic

cprogramarecompilatorlibcrt2o cprogramarecompilatorlibgccmingw32441crtbeginoshyLCprogramarecompilatorlibgccmingw32441 shyLcprogramarecompilatorlibgcc shyLCprogramarecompilatormingw32lib shyLCprogramarecompilatorlib

maino

shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt shyluser32 shylkernel32 shyladvapi32 shylshell32 shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt

cprogramarecompilatorlibgccmingw32441crtendo

(Nota 441 ar trebui sa fie inlocuit cu versiunea gcc folosita de tine)

Asupra parametrului shyBdynamic voi reveni mai tarziu

Dupa cum vezi sunt linkshyate mai intai doua fisiere codshyobiect pe care nu leshyam scris noi crt2o si crtbegino Hai sa vedem ce se afla in crt2oIntroducd Cprogramarecompilatorlibnm crt2o

aceasta ultima comanda va afisa toate simbolurile dintrshyun fisier codshyobiect (lib o a la) Printre acele simboluri vedem si simbolul__main despre care se plangea ld ca nushyl gaseste atunci cand am folosit parametrul shynostdlib pentru gcc

Dupa cum stii din unele din punctele anterioare simbolul printf nu exista este numit _printf deci hai sa ne uitam dupa el (ca sa neasiguram ca exista si ca nimic nu e magic) in biblioteca msvcrt

nm cprogramarecompilatorliblibmsvcrta gt libmsvcrtnm

apoi deschide fisierul text nou creat libmsvcrtnm si cauta dupa _printf shy vei vedea ca e acolo

Parametrul shyBdynamic de mai sus spune ca se va linka dinamic cu biblioteca standard O linkare dinamica sub windows inseamna ca intrshyun final se vor apela functii aflate in fisiere dll (precum _printf) shy de exemplu in msvcrt70dll (70 e versiunea) Asa cum exista o linkaredinamica exista si una statica shy o linkare statica (analog cu o alocare statica a unei variabile) inseamna ca acea biblioteca ar deveni parte afisierului nostru exe si in consecinta marimea lui ar creste cu cativa Mb

Parametrii de mai sus care incep cu shyLltcalegt ii spun linkerului in ce directoare sa se uite dupa biblioteci apoi atunci cand acestea vor fispecificate cu parametrii shylltnumegt

De exemplu biblioteca msvcrt se afla in directorul cprogramarecompilatorlib Standardul de denumire al fisierelor ce constituie bibliotecieste libltnumegta ltnumegt putand fi apoi folosit la linia de comanda pentru a linka (a lipi unul de altul) mai multe biblioteci si fisiere codshyobiect (precum maino al nostru shy care si el este specificat pe linia de comanda)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 814

Uitashyte atent la acesti parametri pentru ld si exploreaza si singur pentru ca nu voi mai intra in detaliiToate bibliotecile specificate cu parametrul shyl sunt necesare pentru ca programul final sa functioneze sub windows

La sfarsit de tot mai adaugam si codulshyobiect crtendo care se ocupa cu terminarea corecta a procesuluiDeci contrar credintelor tale de pana acum return 0 nu este nicidecum ultima instructiune executata de un proces la fel cum nici main nueste primul lucru executat de un proces shy se trece mai intai prin functia __main care pregateste mai intai functia main() scrisa de tine pentrua fi apelata

Concluzia ceea ce scriem noi un amarat de fisier maino este doar o mica parte din program Acest cod va fi inconjurat de cateva biblioteciin functie de sistemul de operare (aici windows)

15 O credinta populara

O credinta populara spune ca fisierele header precum stdioh contin functii Nimic mai gresit Functiile sunt implementate in biblioteci nistefisiere binare pe care ai invatat sa le inspectezi cu comanda nm

Atunci cand linkam (ldexe) doua fisiere codshyobiect o (sau la sau a) nu stim ce se afla in acele fisiere shy doar le lipim unul de altul sirezulta un fisier executabil

Insa un compilator (gccexe) are nevoie sa stie cum arata o functie inainte de a o apela informatiile necesare fiind tipul de date alparametrilor si ordinea acestora

Cumulul intre tip de date si ordine al parametrilor unei functii constituie semnatura functiei Multi numesc aceasta semnatura si antetulfunctiei dar acest termen face mai mult aluzie la codul sursa C shy semnatura functiei in schimb indica natura binara a codului obiect

Haideti sa vedem ce se intampla atunci cand compilam un cod sursa fara ashyi spune compilatorului semnaturile functiilor (precum _printf dinlibmsvcrta)

cod

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilaregcc shyWall shyo helloexe mainc

Ne va spune

Quote

warning implicit declaration of function printf

ATENTIE compilatorul spune foarte corect declaration pentru ca intrshyadevar este vorba despre declararea functiei printfImplementarea functiei printf (instructiunile binare CPU ce o definesc) sta bine mersi in libmsvcrta

Deci hai sa ii dam compilatorului ce ne cere Cod

int printf(char fmt )

define EXIT_SUCCESS 0

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilam

gcc shyWall shyo helloexe mainc

Dupa cum vezi in loc sa ne folosim de declaratia functiei printf existenta in stdioh si a constantei EXIT_SUCCESS din stdlibh pur si simpluleshyam declarat direct in codul nostru sursa intrshyun mod similar in care sunt declarate in acele fisiere

Concluzie mare atentie la cei doi termeni declararea (antetul semnatura) unei functii vs implementarea unei functii (instructiunileCPU din codul obiect sau lista de instructiuni din codul sursa shy blocul de instructiuni al functiei shy caci si functii ca printf trebuiesc sa fi fostimplementate pe undeva nu pica din cer shy deschide Cprogramarecompilatorincludestdioh si convingeshyte ca acolo chiar nu se aflaabsolut nicio implementare)

16 Lucrul cu mai multe fisiere codshyobiect intrshyun proiect

Intrshyunul din experimentele anterioare am vazut cum codul nostru obiect maino era linkat cu alte coduri obiecte o si biblioteci a pentru aforma fisierul exe final

Ei bine putem crea si noi mai multe fisiere o (vom vorbi si despre biblioteci intrshyun punct urmator) pe care sa le linkam alaturi de acestmaino Asta duce la o reutilizare mai usoara a codului

Reutilizarea codului se face prin impartirea functionalitatii mari in functionalitati mai mici prin functii Aceasta impartire in functii se mainumeste si modularizarea codului Fisierele o sau bibliotecile a ar putea fi deci considerate module de functii

Deci vom face un nou proiect prime ceea ce nu inseamna nimic mai mult decat un director nou gol in workspaceshyul nostruCprogramareproiecte

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 914

Comenzi

cd Cprogramareproiecte

mkdir prime

Si gata proiectul shy)

cream un nou fisier primec

int is_prime(unsigned int n)

unsigned int i

for(i=2 i lt= n2 i++)

if(ni == 0)

return 0

return 1

(nota stiu ca exista algoritmi mai buni aici vreau sa ilustrez altceva nu sa fac kungshyfu in algoritmica)

Perfect acum il putem compila

gcc shyc shyWall primec

si neshyam ales cu un fisier primeo

scriem mainc

include ltstdiohgt

include ltstdlibhgt

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

CompilamCprogramareproiecteprimegt gcc shyWall shyc maincPrimim eroarea

Quote

mainc In function main

mainc8 warning implicit declaration of function is_prime

Dupa cum observam (inca o data) compilatorul nu stie cum arata semnatura functiei is_prime() Ne da totusi doar o avertizare nu o eroare sine genereaza totusi codul obiect maino deci desi stim ca ar trebui sa adaugam declaratia functiei is_prime inaintea implementarii luimain() hai sa testam care ii sunt limitele si ce se intampla daca nu o facem

Deci trecem la pasul urmator de a linka cele doua fisiere codshyobiect

gcc shyo primeexe shyWall maino primeo

apoi executam primeexe

Procesul primeexe va cere numarul insa atunci cand va ajunge la apelul functiei is_prime va crapa

Inca o dovada ca chiar si doar avertizarile trebuiesc luate in serios si reparate

Deci adaugam semnatura functiei inaintea lui main()

int is_prime(unsigned int)

Atentie semnatura unei functii nu are nevoie de identificatorii parametrilor ci doar de tipul de date

Acum recompilam mainc (primec e deja compilat si nu am schimbat nimic in acel fisier deci primeo e la fel de util ca si inainte)

gcc shyc shyWall mainc

si linkam

gcc shyo primeexe shyWall maino primeo

Perfect primeexe functioneaza Totusi avem o problema pe parcurs vom mai adauga functii in primec pentru lucrul cu numerele primeProblema este ca1 in toate celelalte fisiere c unde vom vrea sa apelam acele functii va trebui sa declaram functiile cu exact aceleasi semnaturi ca in primecDaca cumva o semnatura a unei functii se schimba in primec va trebui sa cautam in toate celelalte fisiere si sa modificam semnatura

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 6: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 614

Putem refolosi fisierul preprocesat maini astfel

gcc shyWall shyS shyo mains maini

sau ii putem spune compilatorului sa o ia de la capat incepand cu mainc sa salveze temporar un nou fisier preprocesat si sashylasambleze pe acela oprindushyse dupa pasul de asamblare

gcc shyWall shyS shyo mains mainc

In ambele cazuri comenzile sunt aceleasi Ceea ce difera este extensia fisierului de input (i sau c) in functie de care gcc decidece este de facut (daca mai este necesara o preprocesare sau nu)

Aruncand un ochi in fisierul asamblat mains ne regasim stringul ascii hello world0 care ne arata clar ca un string in C setermina in caracterul NUL (nu NULL) vedem si numele functiilor folosite precum main sau printf chiar daca acestea suntprecedate de unul sau doua _ si mai vedem si instructiuni ASM De exemplu instructiunea ASM

call __main

apeleaza functia noastra main() Insa dupa cum observi ea nu este nicidecum primul lucru executat de procesor (desi cusiguranta ti sshya spus la scoala main shy aici incepe programul) Compilatorul a adaugat automat pentru noi alte instructiuniinaintea sa instructiuni care pregatesc apelul efectiv Pentru a intelege cu adevarat ce se intampla aici este necesara studierealimbajului ASMc compilare in acest pas datele preprocesate sunt compilate iar outputul se numeste codshyobiect Acest cod obiect continepractic instructiunile CPU care vor constitui programul nostru efectiv Insa el nu contine detaliile care fac un executabil sa fie unexecutabil recunoscut ca atare de sistemul de operare El contine insa referinte la alte resurse (mai mult sau mai putin) externedespre care vom vorbi intrshyun experiment viitor referinte pe care leshyai vazut si in fisierul ASM precum _printf Codul obiectcontine simplificat vorbind instructiunile pure binare si nimic altceva

Si la acest pas putem refolosi outputul oricaruia dintre pasii anteriori ca input insa ii putem spune lui gcc sa se opreasca dupapasul de compilare cu parametrul shyc

gcc shyWall shyc shyo maino mains

sau

gcc shyWall shyc shyo maino maini

sau

gcc shyWall shyc shyo maino mainc

Gcc va decide in functie de tipul inputului ce fisiere temporare trebuie sa genereze Insa cum noi avem deja cel mai apropiat tipde input (fisierul asamblat) de ceea ce vrem (codul obiect) doar prima varianta are sens Astfel putem creste viteza de compilare(deoarece pasii intermediari de preprocesare si asamblare nu mai sunt necesari)

Insa de la orice input am pleca outputul maino va fi identic

Aruncand un ochi pe fisierul rezultat maino observam ca nu pricepem mare lucru deoarece outputul compilarii nu mai este untext cum a fost in cazul preprocesarii si al asamblarii ci un fisier binar cu instructiuni CPU Acele instructiuni vor fi executatede circuitele electronice din CPU

Totusi ne regasim textul hello world si vedem si nume precum printf sau main functii care apar si in programDeci rezultatul compilarii maino cel putin pare a reflecta in mare ce am scris noi in mainc si deci secvential si in maini simainsd linkareAcesta este ultimul pas in traducerea lui mainc din limbajul C in limbajul binar al CPUshyului Deoarece e ultimul pas lui GCC nutrebuie sashyi spui sa se opreasca la un anumit pas cum ai facut cu shyE pentru procesare shyS pentru asamblare sau shyc pentrucompilare Nu trebuie decat sashyl hranesti cu input provenit de la oricare output din pasii anteriori sau cu mainc insusi GCC isiva genera fisierele temporare de care are nevoie Cum noi avem insa outputul cel mai apropiat de ceea ce vrem cel mai eficienteste sashyl linkam pe acesta

gcc shyWall shyo helloexe maino

A linka inseamna a crea legaturi Pasul acesta creaza legatura dintre codul obiect din fisierul o si biblioteca standard C (pescurt libc stdlibc sau sub windows vei mai intalni si numele de msvcrt) In experimentul urmator vom vedea ce este aceastastdlibc si ce rol areConcluziiAm aflat ca ceea ce numeam pana acum compilare este defapt o serie de pasi (preprocesare asamblare compilare linkare)ordonati iar fiecare pas are ca input outputul pasului anterior Totul pleaca de la codul sursa scris de programator si se ajungela fisierul executabil care este (in principiu) inputul unei alte componente de data aceasta una hardware procesorul insusi

Compilarea este defapt tehnic corect vorbind doar acesta al treilea pas din ceea ce intelegeam inainte prin compilare

Compilatorul GCC ne lasa sa ne oprim dupa oricare dintre acesti pasi cu unul dintre parametrii shyE shyS sau shyc Astfel putem vedeaexact ce se intampla sub capota

In experimentele viitoare vei vedea ca in mod obisnuit nu vei avea deshya face cu datele de iesire ale pasilor de preprocesare siasamblare insa des vei fi confruntat cu utilizarea parametrului shyc chiar si in viata de zi cu zi de programator

Urmatoarele experimente vor vorbi mai indeaproape despre sculele de programa existente despre biblioteci IDEshyuri si alte detalii

Asigurashyte ca ai inteles mai intai toate lucrurile de mai sus pentru a castiga o claritate cat mai mare din cele ce urmeaza shy altfel nu

vei intelege mare lucru din experimentele viitoare

14 Ce este biblioteca standard

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 714

Biblioteca standard este o biblioteca care ii este pusa implicit la dispozitie unui cod sursa Limbajul C are o biblioteca standard numitacolocvial stdlibc limbajul C++ are o biblioteca standard numita colocvial stdlibc++

Bibliotecile standard vin de obicei la pachet cu setul de scule (compilator linker etc) de programare folosit Astfel se face ca gcc (mingw) neofera o biblioteca standard visual c++ ne ofera o alta biblioteca standard samd

Toate aceste biblioteci respecta mai mult sau mai putin un standard comun (standardul ISO C care specifica intregul limbaj ChttpenwikipediaryISO_Standard (httpenwikipediaorgwikiC_standard_libraryISO_Standard) ) de aceea nu conteaza cu cecompilator compilam un program care foloseste doar lucrurile standard

Noi vom folosi ca si pana acum compilatorul gcc cu biblioteca sa standard

Compileaza codul sursa anterior mainc al programului hello world astfel

gcc shynostdlib mainc

Parametrul shynostdlib ii spune linkerului (numit ldexe un program la fel ca gccexe) apelat in spatele cortinei de compilatorul gccexe sanu includa biblioteca standard in programul nostru

In output vedem concret cum gcc a generat acele fisiere temporare codshyobiect (o) si cum ld (ld returned 1 exit status) returneaza eroare (acelreturn 0 pe care il scrii tu in programe ii spune sistemului de operare ca procesul tau sshya terminat cu succes ei bine aici programul ldexeface pe undeva return 1 pentru ashyi spune apelantului (aici gccexe si nu sistemul de operare pentru ca nu ai introdus tu ldexe pentru alinka manual codul obiect al lui maino cu biblioteca standard) ca procesul sshya terminat cu o eroare

Quote

TempccD9bI55omainc(text+0xa) undefined reference to amp96__main

TempccD9bI55omainc(text+0x16) undefined reference to amp96printf

collect2 ld returned 1 exit status

Hai sa incercam acelasi lucru si manual generarea de cod obiect si linkshyarea manuala

Introdu

gcc shyc mainc

Acum pentru a linka invoca linkershyul ld (toti parametrii trebuiesc scrisi pe o singura linie)

Quote

ld shyBdynamic

cprogramarecompilatorlibcrt2o cprogramarecompilatorlibgccmingw32441crtbeginoshyLCprogramarecompilatorlibgccmingw32441 shyLcprogramarecompilatorlibgcc shyLCprogramarecompilatormingw32lib shyLCprogramarecompilatorlib

maino

shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt shyluser32 shylkernel32 shyladvapi32 shylshell32 shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt

cprogramarecompilatorlibgccmingw32441crtendo

(Nota 441 ar trebui sa fie inlocuit cu versiunea gcc folosita de tine)

Asupra parametrului shyBdynamic voi reveni mai tarziu

Dupa cum vezi sunt linkshyate mai intai doua fisiere codshyobiect pe care nu leshyam scris noi crt2o si crtbegino Hai sa vedem ce se afla in crt2oIntroducd Cprogramarecompilatorlibnm crt2o

aceasta ultima comanda va afisa toate simbolurile dintrshyun fisier codshyobiect (lib o a la) Printre acele simboluri vedem si simbolul__main despre care se plangea ld ca nushyl gaseste atunci cand am folosit parametrul shynostdlib pentru gcc

Dupa cum stii din unele din punctele anterioare simbolul printf nu exista este numit _printf deci hai sa ne uitam dupa el (ca sa neasiguram ca exista si ca nimic nu e magic) in biblioteca msvcrt

nm cprogramarecompilatorliblibmsvcrta gt libmsvcrtnm

apoi deschide fisierul text nou creat libmsvcrtnm si cauta dupa _printf shy vei vedea ca e acolo

Parametrul shyBdynamic de mai sus spune ca se va linka dinamic cu biblioteca standard O linkare dinamica sub windows inseamna ca intrshyun final se vor apela functii aflate in fisiere dll (precum _printf) shy de exemplu in msvcrt70dll (70 e versiunea) Asa cum exista o linkaredinamica exista si una statica shy o linkare statica (analog cu o alocare statica a unei variabile) inseamna ca acea biblioteca ar deveni parte afisierului nostru exe si in consecinta marimea lui ar creste cu cativa Mb

Parametrii de mai sus care incep cu shyLltcalegt ii spun linkerului in ce directoare sa se uite dupa biblioteci apoi atunci cand acestea vor fispecificate cu parametrii shylltnumegt

De exemplu biblioteca msvcrt se afla in directorul cprogramarecompilatorlib Standardul de denumire al fisierelor ce constituie bibliotecieste libltnumegta ltnumegt putand fi apoi folosit la linia de comanda pentru a linka (a lipi unul de altul) mai multe biblioteci si fisiere codshyobiect (precum maino al nostru shy care si el este specificat pe linia de comanda)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 814

Uitashyte atent la acesti parametri pentru ld si exploreaza si singur pentru ca nu voi mai intra in detaliiToate bibliotecile specificate cu parametrul shyl sunt necesare pentru ca programul final sa functioneze sub windows

La sfarsit de tot mai adaugam si codulshyobiect crtendo care se ocupa cu terminarea corecta a procesuluiDeci contrar credintelor tale de pana acum return 0 nu este nicidecum ultima instructiune executata de un proces la fel cum nici main nueste primul lucru executat de un proces shy se trece mai intai prin functia __main care pregateste mai intai functia main() scrisa de tine pentrua fi apelata

Concluzia ceea ce scriem noi un amarat de fisier maino este doar o mica parte din program Acest cod va fi inconjurat de cateva biblioteciin functie de sistemul de operare (aici windows)

15 O credinta populara

O credinta populara spune ca fisierele header precum stdioh contin functii Nimic mai gresit Functiile sunt implementate in biblioteci nistefisiere binare pe care ai invatat sa le inspectezi cu comanda nm

Atunci cand linkam (ldexe) doua fisiere codshyobiect o (sau la sau a) nu stim ce se afla in acele fisiere shy doar le lipim unul de altul sirezulta un fisier executabil

Insa un compilator (gccexe) are nevoie sa stie cum arata o functie inainte de a o apela informatiile necesare fiind tipul de date alparametrilor si ordinea acestora

Cumulul intre tip de date si ordine al parametrilor unei functii constituie semnatura functiei Multi numesc aceasta semnatura si antetulfunctiei dar acest termen face mai mult aluzie la codul sursa C shy semnatura functiei in schimb indica natura binara a codului obiect

Haideti sa vedem ce se intampla atunci cand compilam un cod sursa fara ashyi spune compilatorului semnaturile functiilor (precum _printf dinlibmsvcrta)

cod

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilaregcc shyWall shyo helloexe mainc

Ne va spune

Quote

warning implicit declaration of function printf

ATENTIE compilatorul spune foarte corect declaration pentru ca intrshyadevar este vorba despre declararea functiei printfImplementarea functiei printf (instructiunile binare CPU ce o definesc) sta bine mersi in libmsvcrta

Deci hai sa ii dam compilatorului ce ne cere Cod

int printf(char fmt )

define EXIT_SUCCESS 0

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilam

gcc shyWall shyo helloexe mainc

Dupa cum vezi in loc sa ne folosim de declaratia functiei printf existenta in stdioh si a constantei EXIT_SUCCESS din stdlibh pur si simpluleshyam declarat direct in codul nostru sursa intrshyun mod similar in care sunt declarate in acele fisiere

Concluzie mare atentie la cei doi termeni declararea (antetul semnatura) unei functii vs implementarea unei functii (instructiunileCPU din codul obiect sau lista de instructiuni din codul sursa shy blocul de instructiuni al functiei shy caci si functii ca printf trebuiesc sa fi fostimplementate pe undeva nu pica din cer shy deschide Cprogramarecompilatorincludestdioh si convingeshyte ca acolo chiar nu se aflaabsolut nicio implementare)

16 Lucrul cu mai multe fisiere codshyobiect intrshyun proiect

Intrshyunul din experimentele anterioare am vazut cum codul nostru obiect maino era linkat cu alte coduri obiecte o si biblioteci a pentru aforma fisierul exe final

Ei bine putem crea si noi mai multe fisiere o (vom vorbi si despre biblioteci intrshyun punct urmator) pe care sa le linkam alaturi de acestmaino Asta duce la o reutilizare mai usoara a codului

Reutilizarea codului se face prin impartirea functionalitatii mari in functionalitati mai mici prin functii Aceasta impartire in functii se mainumeste si modularizarea codului Fisierele o sau bibliotecile a ar putea fi deci considerate module de functii

Deci vom face un nou proiect prime ceea ce nu inseamna nimic mai mult decat un director nou gol in workspaceshyul nostruCprogramareproiecte

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 914

Comenzi

cd Cprogramareproiecte

mkdir prime

Si gata proiectul shy)

cream un nou fisier primec

int is_prime(unsigned int n)

unsigned int i

for(i=2 i lt= n2 i++)

if(ni == 0)

return 0

return 1

(nota stiu ca exista algoritmi mai buni aici vreau sa ilustrez altceva nu sa fac kungshyfu in algoritmica)

Perfect acum il putem compila

gcc shyc shyWall primec

si neshyam ales cu un fisier primeo

scriem mainc

include ltstdiohgt

include ltstdlibhgt

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

CompilamCprogramareproiecteprimegt gcc shyWall shyc maincPrimim eroarea

Quote

mainc In function main

mainc8 warning implicit declaration of function is_prime

Dupa cum observam (inca o data) compilatorul nu stie cum arata semnatura functiei is_prime() Ne da totusi doar o avertizare nu o eroare sine genereaza totusi codul obiect maino deci desi stim ca ar trebui sa adaugam declaratia functiei is_prime inaintea implementarii luimain() hai sa testam care ii sunt limitele si ce se intampla daca nu o facem

Deci trecem la pasul urmator de a linka cele doua fisiere codshyobiect

gcc shyo primeexe shyWall maino primeo

apoi executam primeexe

Procesul primeexe va cere numarul insa atunci cand va ajunge la apelul functiei is_prime va crapa

Inca o dovada ca chiar si doar avertizarile trebuiesc luate in serios si reparate

Deci adaugam semnatura functiei inaintea lui main()

int is_prime(unsigned int)

Atentie semnatura unei functii nu are nevoie de identificatorii parametrilor ci doar de tipul de date

Acum recompilam mainc (primec e deja compilat si nu am schimbat nimic in acel fisier deci primeo e la fel de util ca si inainte)

gcc shyc shyWall mainc

si linkam

gcc shyo primeexe shyWall maino primeo

Perfect primeexe functioneaza Totusi avem o problema pe parcurs vom mai adauga functii in primec pentru lucrul cu numerele primeProblema este ca1 in toate celelalte fisiere c unde vom vrea sa apelam acele functii va trebui sa declaram functiile cu exact aceleasi semnaturi ca in primecDaca cumva o semnatura a unei functii se schimba in primec va trebui sa cautam in toate celelalte fisiere si sa modificam semnatura

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 7: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 714

Biblioteca standard este o biblioteca care ii este pusa implicit la dispozitie unui cod sursa Limbajul C are o biblioteca standard numitacolocvial stdlibc limbajul C++ are o biblioteca standard numita colocvial stdlibc++

Bibliotecile standard vin de obicei la pachet cu setul de scule (compilator linker etc) de programare folosit Astfel se face ca gcc (mingw) neofera o biblioteca standard visual c++ ne ofera o alta biblioteca standard samd

Toate aceste biblioteci respecta mai mult sau mai putin un standard comun (standardul ISO C care specifica intregul limbaj ChttpenwikipediaryISO_Standard (httpenwikipediaorgwikiC_standard_libraryISO_Standard) ) de aceea nu conteaza cu cecompilator compilam un program care foloseste doar lucrurile standard

Noi vom folosi ca si pana acum compilatorul gcc cu biblioteca sa standard

Compileaza codul sursa anterior mainc al programului hello world astfel

gcc shynostdlib mainc

Parametrul shynostdlib ii spune linkerului (numit ldexe un program la fel ca gccexe) apelat in spatele cortinei de compilatorul gccexe sanu includa biblioteca standard in programul nostru

In output vedem concret cum gcc a generat acele fisiere temporare codshyobiect (o) si cum ld (ld returned 1 exit status) returneaza eroare (acelreturn 0 pe care il scrii tu in programe ii spune sistemului de operare ca procesul tau sshya terminat cu succes ei bine aici programul ldexeface pe undeva return 1 pentru ashyi spune apelantului (aici gccexe si nu sistemul de operare pentru ca nu ai introdus tu ldexe pentru alinka manual codul obiect al lui maino cu biblioteca standard) ca procesul sshya terminat cu o eroare

Quote

TempccD9bI55omainc(text+0xa) undefined reference to amp96__main

TempccD9bI55omainc(text+0x16) undefined reference to amp96printf

collect2 ld returned 1 exit status

Hai sa incercam acelasi lucru si manual generarea de cod obiect si linkshyarea manuala

Introdu

gcc shyc mainc

Acum pentru a linka invoca linkershyul ld (toti parametrii trebuiesc scrisi pe o singura linie)

Quote

ld shyBdynamic

cprogramarecompilatorlibcrt2o cprogramarecompilatorlibgccmingw32441crtbeginoshyLCprogramarecompilatorlibgccmingw32441 shyLcprogramarecompilatorlibgcc shyLCprogramarecompilatormingw32lib shyLCprogramarecompilatorlib

maino

shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt shyluser32 shylkernel32 shyladvapi32 shylshell32 shylmingw32 shylgcc shylmoldname shylmingwex shylmsvcrt

cprogramarecompilatorlibgccmingw32441crtendo

(Nota 441 ar trebui sa fie inlocuit cu versiunea gcc folosita de tine)

Asupra parametrului shyBdynamic voi reveni mai tarziu

Dupa cum vezi sunt linkshyate mai intai doua fisiere codshyobiect pe care nu leshyam scris noi crt2o si crtbegino Hai sa vedem ce se afla in crt2oIntroducd Cprogramarecompilatorlibnm crt2o

aceasta ultima comanda va afisa toate simbolurile dintrshyun fisier codshyobiect (lib o a la) Printre acele simboluri vedem si simbolul__main despre care se plangea ld ca nushyl gaseste atunci cand am folosit parametrul shynostdlib pentru gcc

Dupa cum stii din unele din punctele anterioare simbolul printf nu exista este numit _printf deci hai sa ne uitam dupa el (ca sa neasiguram ca exista si ca nimic nu e magic) in biblioteca msvcrt

nm cprogramarecompilatorliblibmsvcrta gt libmsvcrtnm

apoi deschide fisierul text nou creat libmsvcrtnm si cauta dupa _printf shy vei vedea ca e acolo

Parametrul shyBdynamic de mai sus spune ca se va linka dinamic cu biblioteca standard O linkare dinamica sub windows inseamna ca intrshyun final se vor apela functii aflate in fisiere dll (precum _printf) shy de exemplu in msvcrt70dll (70 e versiunea) Asa cum exista o linkaredinamica exista si una statica shy o linkare statica (analog cu o alocare statica a unei variabile) inseamna ca acea biblioteca ar deveni parte afisierului nostru exe si in consecinta marimea lui ar creste cu cativa Mb

Parametrii de mai sus care incep cu shyLltcalegt ii spun linkerului in ce directoare sa se uite dupa biblioteci apoi atunci cand acestea vor fispecificate cu parametrii shylltnumegt

De exemplu biblioteca msvcrt se afla in directorul cprogramarecompilatorlib Standardul de denumire al fisierelor ce constituie bibliotecieste libltnumegta ltnumegt putand fi apoi folosit la linia de comanda pentru a linka (a lipi unul de altul) mai multe biblioteci si fisiere codshyobiect (precum maino al nostru shy care si el este specificat pe linia de comanda)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 814

Uitashyte atent la acesti parametri pentru ld si exploreaza si singur pentru ca nu voi mai intra in detaliiToate bibliotecile specificate cu parametrul shyl sunt necesare pentru ca programul final sa functioneze sub windows

La sfarsit de tot mai adaugam si codulshyobiect crtendo care se ocupa cu terminarea corecta a procesuluiDeci contrar credintelor tale de pana acum return 0 nu este nicidecum ultima instructiune executata de un proces la fel cum nici main nueste primul lucru executat de un proces shy se trece mai intai prin functia __main care pregateste mai intai functia main() scrisa de tine pentrua fi apelata

Concluzia ceea ce scriem noi un amarat de fisier maino este doar o mica parte din program Acest cod va fi inconjurat de cateva biblioteciin functie de sistemul de operare (aici windows)

15 O credinta populara

O credinta populara spune ca fisierele header precum stdioh contin functii Nimic mai gresit Functiile sunt implementate in biblioteci nistefisiere binare pe care ai invatat sa le inspectezi cu comanda nm

Atunci cand linkam (ldexe) doua fisiere codshyobiect o (sau la sau a) nu stim ce se afla in acele fisiere shy doar le lipim unul de altul sirezulta un fisier executabil

Insa un compilator (gccexe) are nevoie sa stie cum arata o functie inainte de a o apela informatiile necesare fiind tipul de date alparametrilor si ordinea acestora

Cumulul intre tip de date si ordine al parametrilor unei functii constituie semnatura functiei Multi numesc aceasta semnatura si antetulfunctiei dar acest termen face mai mult aluzie la codul sursa C shy semnatura functiei in schimb indica natura binara a codului obiect

Haideti sa vedem ce se intampla atunci cand compilam un cod sursa fara ashyi spune compilatorului semnaturile functiilor (precum _printf dinlibmsvcrta)

cod

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilaregcc shyWall shyo helloexe mainc

Ne va spune

Quote

warning implicit declaration of function printf

ATENTIE compilatorul spune foarte corect declaration pentru ca intrshyadevar este vorba despre declararea functiei printfImplementarea functiei printf (instructiunile binare CPU ce o definesc) sta bine mersi in libmsvcrta

Deci hai sa ii dam compilatorului ce ne cere Cod

int printf(char fmt )

define EXIT_SUCCESS 0

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilam

gcc shyWall shyo helloexe mainc

Dupa cum vezi in loc sa ne folosim de declaratia functiei printf existenta in stdioh si a constantei EXIT_SUCCESS din stdlibh pur si simpluleshyam declarat direct in codul nostru sursa intrshyun mod similar in care sunt declarate in acele fisiere

Concluzie mare atentie la cei doi termeni declararea (antetul semnatura) unei functii vs implementarea unei functii (instructiunileCPU din codul obiect sau lista de instructiuni din codul sursa shy blocul de instructiuni al functiei shy caci si functii ca printf trebuiesc sa fi fostimplementate pe undeva nu pica din cer shy deschide Cprogramarecompilatorincludestdioh si convingeshyte ca acolo chiar nu se aflaabsolut nicio implementare)

16 Lucrul cu mai multe fisiere codshyobiect intrshyun proiect

Intrshyunul din experimentele anterioare am vazut cum codul nostru obiect maino era linkat cu alte coduri obiecte o si biblioteci a pentru aforma fisierul exe final

Ei bine putem crea si noi mai multe fisiere o (vom vorbi si despre biblioteci intrshyun punct urmator) pe care sa le linkam alaturi de acestmaino Asta duce la o reutilizare mai usoara a codului

Reutilizarea codului se face prin impartirea functionalitatii mari in functionalitati mai mici prin functii Aceasta impartire in functii se mainumeste si modularizarea codului Fisierele o sau bibliotecile a ar putea fi deci considerate module de functii

Deci vom face un nou proiect prime ceea ce nu inseamna nimic mai mult decat un director nou gol in workspaceshyul nostruCprogramareproiecte

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 914

Comenzi

cd Cprogramareproiecte

mkdir prime

Si gata proiectul shy)

cream un nou fisier primec

int is_prime(unsigned int n)

unsigned int i

for(i=2 i lt= n2 i++)

if(ni == 0)

return 0

return 1

(nota stiu ca exista algoritmi mai buni aici vreau sa ilustrez altceva nu sa fac kungshyfu in algoritmica)

Perfect acum il putem compila

gcc shyc shyWall primec

si neshyam ales cu un fisier primeo

scriem mainc

include ltstdiohgt

include ltstdlibhgt

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

CompilamCprogramareproiecteprimegt gcc shyWall shyc maincPrimim eroarea

Quote

mainc In function main

mainc8 warning implicit declaration of function is_prime

Dupa cum observam (inca o data) compilatorul nu stie cum arata semnatura functiei is_prime() Ne da totusi doar o avertizare nu o eroare sine genereaza totusi codul obiect maino deci desi stim ca ar trebui sa adaugam declaratia functiei is_prime inaintea implementarii luimain() hai sa testam care ii sunt limitele si ce se intampla daca nu o facem

Deci trecem la pasul urmator de a linka cele doua fisiere codshyobiect

gcc shyo primeexe shyWall maino primeo

apoi executam primeexe

Procesul primeexe va cere numarul insa atunci cand va ajunge la apelul functiei is_prime va crapa

Inca o dovada ca chiar si doar avertizarile trebuiesc luate in serios si reparate

Deci adaugam semnatura functiei inaintea lui main()

int is_prime(unsigned int)

Atentie semnatura unei functii nu are nevoie de identificatorii parametrilor ci doar de tipul de date

Acum recompilam mainc (primec e deja compilat si nu am schimbat nimic in acel fisier deci primeo e la fel de util ca si inainte)

gcc shyc shyWall mainc

si linkam

gcc shyo primeexe shyWall maino primeo

Perfect primeexe functioneaza Totusi avem o problema pe parcurs vom mai adauga functii in primec pentru lucrul cu numerele primeProblema este ca1 in toate celelalte fisiere c unde vom vrea sa apelam acele functii va trebui sa declaram functiile cu exact aceleasi semnaturi ca in primecDaca cumva o semnatura a unei functii se schimba in primec va trebui sa cautam in toate celelalte fisiere si sa modificam semnatura

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 8: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 814

Uitashyte atent la acesti parametri pentru ld si exploreaza si singur pentru ca nu voi mai intra in detaliiToate bibliotecile specificate cu parametrul shyl sunt necesare pentru ca programul final sa functioneze sub windows

La sfarsit de tot mai adaugam si codulshyobiect crtendo care se ocupa cu terminarea corecta a procesuluiDeci contrar credintelor tale de pana acum return 0 nu este nicidecum ultima instructiune executata de un proces la fel cum nici main nueste primul lucru executat de un proces shy se trece mai intai prin functia __main care pregateste mai intai functia main() scrisa de tine pentrua fi apelata

Concluzia ceea ce scriem noi un amarat de fisier maino este doar o mica parte din program Acest cod va fi inconjurat de cateva biblioteciin functie de sistemul de operare (aici windows)

15 O credinta populara

O credinta populara spune ca fisierele header precum stdioh contin functii Nimic mai gresit Functiile sunt implementate in biblioteci nistefisiere binare pe care ai invatat sa le inspectezi cu comanda nm

Atunci cand linkam (ldexe) doua fisiere codshyobiect o (sau la sau a) nu stim ce se afla in acele fisiere shy doar le lipim unul de altul sirezulta un fisier executabil

Insa un compilator (gccexe) are nevoie sa stie cum arata o functie inainte de a o apela informatiile necesare fiind tipul de date alparametrilor si ordinea acestora

Cumulul intre tip de date si ordine al parametrilor unei functii constituie semnatura functiei Multi numesc aceasta semnatura si antetulfunctiei dar acest termen face mai mult aluzie la codul sursa C shy semnatura functiei in schimb indica natura binara a codului obiect

Haideti sa vedem ce se intampla atunci cand compilam un cod sursa fara ashyi spune compilatorului semnaturile functiilor (precum _printf dinlibmsvcrta)

cod

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilaregcc shyWall shyo helloexe mainc

Ne va spune

Quote

warning implicit declaration of function printf

ATENTIE compilatorul spune foarte corect declaration pentru ca intrshyadevar este vorba despre declararea functiei printfImplementarea functiei printf (instructiunile binare CPU ce o definesc) sta bine mersi in libmsvcrta

Deci hai sa ii dam compilatorului ce ne cere Cod

int printf(char fmt )

define EXIT_SUCCESS 0

int main(void)

printf(hello world)

return EXIT_SUCCESS

compilam

gcc shyWall shyo helloexe mainc

Dupa cum vezi in loc sa ne folosim de declaratia functiei printf existenta in stdioh si a constantei EXIT_SUCCESS din stdlibh pur si simpluleshyam declarat direct in codul nostru sursa intrshyun mod similar in care sunt declarate in acele fisiere

Concluzie mare atentie la cei doi termeni declararea (antetul semnatura) unei functii vs implementarea unei functii (instructiunileCPU din codul obiect sau lista de instructiuni din codul sursa shy blocul de instructiuni al functiei shy caci si functii ca printf trebuiesc sa fi fostimplementate pe undeva nu pica din cer shy deschide Cprogramarecompilatorincludestdioh si convingeshyte ca acolo chiar nu se aflaabsolut nicio implementare)

16 Lucrul cu mai multe fisiere codshyobiect intrshyun proiect

Intrshyunul din experimentele anterioare am vazut cum codul nostru obiect maino era linkat cu alte coduri obiecte o si biblioteci a pentru aforma fisierul exe final

Ei bine putem crea si noi mai multe fisiere o (vom vorbi si despre biblioteci intrshyun punct urmator) pe care sa le linkam alaturi de acestmaino Asta duce la o reutilizare mai usoara a codului

Reutilizarea codului se face prin impartirea functionalitatii mari in functionalitati mai mici prin functii Aceasta impartire in functii se mainumeste si modularizarea codului Fisierele o sau bibliotecile a ar putea fi deci considerate module de functii

Deci vom face un nou proiect prime ceea ce nu inseamna nimic mai mult decat un director nou gol in workspaceshyul nostruCprogramareproiecte

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 914

Comenzi

cd Cprogramareproiecte

mkdir prime

Si gata proiectul shy)

cream un nou fisier primec

int is_prime(unsigned int n)

unsigned int i

for(i=2 i lt= n2 i++)

if(ni == 0)

return 0

return 1

(nota stiu ca exista algoritmi mai buni aici vreau sa ilustrez altceva nu sa fac kungshyfu in algoritmica)

Perfect acum il putem compila

gcc shyc shyWall primec

si neshyam ales cu un fisier primeo

scriem mainc

include ltstdiohgt

include ltstdlibhgt

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

CompilamCprogramareproiecteprimegt gcc shyWall shyc maincPrimim eroarea

Quote

mainc In function main

mainc8 warning implicit declaration of function is_prime

Dupa cum observam (inca o data) compilatorul nu stie cum arata semnatura functiei is_prime() Ne da totusi doar o avertizare nu o eroare sine genereaza totusi codul obiect maino deci desi stim ca ar trebui sa adaugam declaratia functiei is_prime inaintea implementarii luimain() hai sa testam care ii sunt limitele si ce se intampla daca nu o facem

Deci trecem la pasul urmator de a linka cele doua fisiere codshyobiect

gcc shyo primeexe shyWall maino primeo

apoi executam primeexe

Procesul primeexe va cere numarul insa atunci cand va ajunge la apelul functiei is_prime va crapa

Inca o dovada ca chiar si doar avertizarile trebuiesc luate in serios si reparate

Deci adaugam semnatura functiei inaintea lui main()

int is_prime(unsigned int)

Atentie semnatura unei functii nu are nevoie de identificatorii parametrilor ci doar de tipul de date

Acum recompilam mainc (primec e deja compilat si nu am schimbat nimic in acel fisier deci primeo e la fel de util ca si inainte)

gcc shyc shyWall mainc

si linkam

gcc shyo primeexe shyWall maino primeo

Perfect primeexe functioneaza Totusi avem o problema pe parcurs vom mai adauga functii in primec pentru lucrul cu numerele primeProblema este ca1 in toate celelalte fisiere c unde vom vrea sa apelam acele functii va trebui sa declaram functiile cu exact aceleasi semnaturi ca in primecDaca cumva o semnatura a unei functii se schimba in primec va trebui sa cautam in toate celelalte fisiere si sa modificam semnatura

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 9: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 914

Comenzi

cd Cprogramareproiecte

mkdir prime

Si gata proiectul shy)

cream un nou fisier primec

int is_prime(unsigned int n)

unsigned int i

for(i=2 i lt= n2 i++)

if(ni == 0)

return 0

return 1

(nota stiu ca exista algoritmi mai buni aici vreau sa ilustrez altceva nu sa fac kungshyfu in algoritmica)

Perfect acum il putem compila

gcc shyc shyWall primec

si neshyam ales cu un fisier primeo

scriem mainc

include ltstdiohgt

include ltstdlibhgt

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

CompilamCprogramareproiecteprimegt gcc shyWall shyc maincPrimim eroarea

Quote

mainc In function main

mainc8 warning implicit declaration of function is_prime

Dupa cum observam (inca o data) compilatorul nu stie cum arata semnatura functiei is_prime() Ne da totusi doar o avertizare nu o eroare sine genereaza totusi codul obiect maino deci desi stim ca ar trebui sa adaugam declaratia functiei is_prime inaintea implementarii luimain() hai sa testam care ii sunt limitele si ce se intampla daca nu o facem

Deci trecem la pasul urmator de a linka cele doua fisiere codshyobiect

gcc shyo primeexe shyWall maino primeo

apoi executam primeexe

Procesul primeexe va cere numarul insa atunci cand va ajunge la apelul functiei is_prime va crapa

Inca o dovada ca chiar si doar avertizarile trebuiesc luate in serios si reparate

Deci adaugam semnatura functiei inaintea lui main()

int is_prime(unsigned int)

Atentie semnatura unei functii nu are nevoie de identificatorii parametrilor ci doar de tipul de date

Acum recompilam mainc (primec e deja compilat si nu am schimbat nimic in acel fisier deci primeo e la fel de util ca si inainte)

gcc shyc shyWall mainc

si linkam

gcc shyo primeexe shyWall maino primeo

Perfect primeexe functioneaza Totusi avem o problema pe parcurs vom mai adauga functii in primec pentru lucrul cu numerele primeProblema este ca1 in toate celelalte fisiere c unde vom vrea sa apelam acele functii va trebui sa declaram functiile cu exact aceleasi semnaturi ca in primecDaca cumva o semnatura a unei functii se schimba in primec va trebui sa cautam in toate celelalte fisiere si sa modificam semnatura

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 10: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1014

2 daca vrem sa le dam prietenilor acest fisier primec lucrul pentru ei va deveni si mai dificil deoarece trebuie sa fie mereu la curent cuschimbarile pe care le faci in primec daca le faci

Atunci cand tu schimbi semnatura unei functii precum is_prime() care este gandita a fi reutilizabila (de tine si chiar si de alti programatori)iar schimbarea o faci asa incat toti utilizatorii tai vor trebui sashysi schimbe codul lor sursa in care apeleaza acea functie vorbim desprebreaking the backwards compatibility (abreviat BC)

Impotriva BC breaking nu te ajuta decat sashyti gandesti mai bine antetele functiilor din start In rest putem usura munca celorlalti preluandasupra noastra nu numai responsabilitatea asupra codului din primec ci si a semnaturilor functiilor din primec

Si dupa cum stii semnaturile functiilor se scriu in fisiere header h Deci vom scrie un nou fisier primeh

ifndef PRIME_H_

define PRIME_H_

check if a number is prime return 0 if it isnt 1 if it is

int is_prime(unsigned int)

endif doubleshyinclusion guard

definitia unui simbol cu ajutor preprocesorului precum PRIME_H_ mai sus se numeste o garda impotriva includerii duble Daca vreunutilizator (adica un alt programator) al viitoarei noastre biblioteci prime include din greseala sau din nestiinta de doua ori fisierul primehaceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom vedea erori de la compilator de genul is_primealready defined

acum putem sterge declaratia functiei is_prime din mainc si folosi fisierul primeh in schimb

include ltstdiohgt

include ltstdlibhgt

include primeh

int main(void)

unsigned int n

printf(numar )

scanf(u ampn)

if(is_prime(n))

printf(u este prim n)

else

printf(u nu este prim n)

return EXIT_SUCCESS

17 crearea si folosirea unei biblioteci

Hai sa transformam primec intrshyo biblioteca reutilizabila numita prime (fisierul libprimea)Nimic mai simplu

ar rcs libprimea primeo

Si gata biblioteca shy)

Acum putem scapa de primeo

rm primeo

vom folosi in schimb biblioteca

gcc maino shyL shylprime shyo primeexe

Atentie parametrii shyL si shyl ii cunosti dintrshyun punct anterior inseamna directorul curent deci linkerul se va uita si in dupa bibliotecilespecificate cu parametrii shylltnumegt urmatori

Distribuirea bibliotecii

Acum poti distribui biblioteca ta libprimea (care nu este nimic altceva decat o arhiva cu codul obiect al lui primeo) prietenilor Nu uita catrebuie sa le trimiti si fisierele h care in mod normal contin si documentatia functiilor puse la dispozitie de libprime

Noua ta biblioteca libprime este la fel de biblioteca ca si biblioteca standard C stdlibc (care in cazul de fata este o colectie de fisiere a asacum leshyai pasat lui ldexe la un punct anterior)

18 Tutorial despre pointeri al lui Ted Jensen de la httphomenetcomctrpointershtm(httphomenetcomcom~tjensenptrpointershtm)

19 va continua20 Icircntrebări şi răspunsuri

1 Cum pot vedea cata memorie foloseste programul meu

1 in primul rand un program nu foloseste memorie (caci presupun ca te referi la memoria de lucru) un program doar ocupa spatiu pehdd memoria ocupata de un program o afli ca pentru orice alt fisier click dreapta si proprietati (sau programatic cu functiilefilesystemshyului folosit)2 depinde ce intelegi prin memoria folosita de un proces Poate fi marimea unui segment al procesului precum heapshyul sau marimeaintregului proces cum poţi vedea mai jos

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 11: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1114

lectia program = proces Sub windows componenta sistemului de operare numita PE Loader ia fisierul binar (programul) de pe hddil incarca in memorie si face multe alte lucruri ciudate pe care nici eu nu mi le mai amintesc exact (hint IAT shy import address table eunul din lucrurile importante) si il transforma intrshyun proces complet izolat in RAM Il virtualizeaza

Cod pentru windows (deoarece astfel de informaţii depind de sistemul de operare) autor neagu_laurentiu

include ltwindowshgt

include ltstdiohgt

include ltpsapihgt

void PrintMemoryInfo(DWORD processID)

HANDLE hProcess

PROCESS_MEMORY_COUNTERS pmc

Print the process identifier

printf(nProcess ID un processID)

Print information about the memory usage of the process

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ

FALSE processID)

if (NULL == hProcess)

return

if (GetProcessMemoryInfo( hProcess amppmc sizeof(pmc)))

printf( tPageFaultCount 0x08Xn pmcPageFaultCount )

printf( tPeakWorkingSetSize 0x08Xn

pmcPeakWorkingSetSize)

printf( tWorkingSetSize 0x08Xn pmcWorkingSetSize)

printf( tQuotaPeakPagedPoolUsage 0x08Xn

pmcQuotaPeakPagedPoolUsage)

printf( tQuotaPagedPoolUsage 0x08Xn

pmcQuotaPagedPoolUsage)

printf( tQuotaPeakNonPagedPoolUsage 0x08Xn

pmcQuotaPeakNonPagedPoolUsage)

printf( tQuotaNonPagedPoolUsage 0x08Xn

pmcQuotaNonPagedPoolUsage)

printf( tPagefileUsage 0x08Xn pmcPagefileUsage)

printf( tPeakPagefileUsage 0x08Xn

pmcPeakPagefileUsage)

CloseHandle( hProcess)

int main(void)

Get the list of process identifiers

DWORD aProcesses[1024] cbNeeded cProcesses

unsigned int i

if (EnumProcesses( aProcesses sizeof(aProcesses) ampcbNeeded))

return 1

Calculate how many process identifiers were returned

cProcesses = cbNeeded sizeof(DWORD)

Print the memory usage for each process

for ( i = 0 i lt cProcesses i++ )

PrintMemoryInfo( aProcesses[i])

return 0

( httpmsdnmicrosofv=VS85 (httpmsdnmicrosofv=VS85) )aspx )2 Este bine să faci type casting

Nu In C nu e nevoie sa faceti cast in urma unui malloc calloc realloc este chiar descurajathttpenwikipediaand_type_safety (httpenwikipediaorgwikiMallocCasting_and_type_safety) (contribuit degnomemory)

3 Cum pot compila si fisiere scrise in C++ (cpp)

g++ shyWall fisiercpp

Cu timpul ar trebui sa strang aici mai toate notiunile semiteoretice cu o alura de pragmatism care nu prea sunt predate prin invatamantul romanescastfel incat cine le cunoaste si intelege sa poata comunica pe meritate ca un homo sapiens cu alti homo sapiensi (read sa ne intelegem unii cu altiica intre programatori)

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 12: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1214

Daca iti place acest articol il poti imbunatatishy ca incepator poti pune intrebari legate de cele cititeshy ca avansat poti semnala eventuale greseli ambiguitati sau lucruri pe care iti doresti sa le fi stiut la inceput

Completari corecturi icircntrebari critica constructiva sau multumiri sunt ca de obicei bineveniteDupa ce sshya ajuns la o concluzie finala discutia va fi stearsa si concluzia mutata icircn postul initial Asa se poate pastra totul icircntrshyun loc si este usor deurmarit si de citit de oricine viziteaza aceasta arie aproape saptamacircnal cacirct si de cei care citesc acest topic pentru prima oara

msmihai Posted 05 December 2012 shy 1151

Quote

aceasta garda va avea ca efect sarirea peste intregul continut al fisierului si astfel nu vom

vedea erori de la compilator de genul is_prime already defined

Aici ar merge explicat pe scurt ce face compilatorul cu continutul fisierelor header)

pax0xFF Posted 01 January 2013 shy 2243

Dupa ce am citit articolul chiar mi sshyau clarificat unele lucruriIn schimb nu am inteles cum pot linkshya dinamic Poate pune cineva un exemplu cu legarea de un dll

Mersi

neagu_laurentiu Posted 01 January 2013 shy 2247

Citeste capitolul urmator httpmsdnmicrosof9(v=vs85)aspx (httpmsdnmicrosoftcomenshyuslibrarywindowsdesktopms68258928v=vs8529aspx) apoi intreaba ce nu intelegi

pax0xFF Posted 01 January 2013 shy 2257

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll siatunci cand am dllFolosind dlluri consumul de resurse scade sau ramane acelasi

OriginalCopy Posted 01 January 2013 shy 2312

pax0xFF on 01 ianuarie 2013 shy 2257 said

Am facut un dll care afiseaza un mesaj pe ecran si lshyam apelat din program De ce programul are aceeasi marime (27 kb) si atunci cand nu am dll si atunci

cand am dll

Deoarece codul binar se află icircn dll nu icircn exe Sistemul de operare face magicul atunci cacircnd PE loader (vezi şi icircn postul 1) icircncarcăvirtualizeazăprogramul făcacircndushyl proces

Şi probabil nu ai nici mii de linii de cod ca să observi o diferenţă şi nici alocări de date statice mari Uităshyte la diferenţele de mărime icircn bytes nu kb

pax0xFF on 01 ianuarie 2013 shy 2257 said

Folosind dlluri consumul de resurse scade sau ramane acelasi

Per total faţă de sistemul tău consumul de RAM este mai mic faţă de linkarea statică doar dacă acel dll este refolosit de mai multe procese ce ruleazăicircn paralel

Icircncearcă să deschizi mai multe instanţe ale aceluiaşi program (va trebui probabil să deschizi foarte multe ca să observi o diferenţă)

Edited by OriginalCopy 01 January 2013 shy 2318

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 13: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1314

OriginalCopy Posted 12 January 2013 shy 1413

Adăugat

Quote

Apoi deschide fisierul bat amintit mai sus cu notepad si adaugashyi la sfarsit instructiunea pentru a schimba directorul curent (comanda cd vine de lachange directory) in proiecte

Motiv httpforumsoftped8entry12518744 (httpforumsoftpediacomtopic905084shycshyinceputpage__st__18entry12518744)

Edited by OriginalCopy 12 January 2013 shy 1454

andrei_kick Posted 15 May 2013 shy 2128

icircnainte sa citesc articolul asta trebui sa stiu c nu eu nu prea inteleg mare lucru din articol ce tutorialcarte imi recomanzi multumesc

Edited by andrei_kick 15 May 2013 shy 2129

MarianG Posted 16 May 2013 shy 0000

tu vrei sa inveti peste noapte

andrei_kick Posted 16 May 2013 shy 0900

am intrebat daca inainte de a citi articolul trebuie sa stiu c sau sunt eu idiot si nu inteleg articolul daca imi trebuie c va rog sa imi ziceti o carte sauun tutorial bun multumesc

Linux programming Linux kernel Exe dll Gcc

neagu_laurentiu Posted 16 May 2013 shy 0918

andrei_kick on 16 mai 2013 shy 0900 said

o carte sau un tutorial bun

Acest bun e relativ si tine de fiecare persoana in parte Eu nu pot garanta care va prinde la tine (nici nu sunt profesor) de aceea iti recomand sa intripe amazoncom alegi cateva editii (le gasesti si pe net in lumea larga) si astfel tu decizi in cunostinta de cauza

Edited by neagu_laurentiu 16 May 2013 shy 0919

OriginalCopy Posted 16 June 2013 shy 1121

Adăugat Sfat pentru liceeni la punctul 1

EnachescuAlin Posted 30 December 2013 shy 2007

Foarte bun tutorialulAm ramas uimit sa vad ce se afla in spatele codului C pe care noi il scriemNu mshyam multumit sa vad doar ce e in spatele unui program care afiseaza hello world si mshyam uitat si la alte probleme mai mari si am ramas uimit

EDIT Totusi am cateva nelamuriri Fisierul maino ar trebui sa contina codul binar Ca as vrea sa vad din curiozitate si codul binar al unui programC

Edited by EnachescuAlin 30 December 2013 shy 2010

adrian93 Posted 30 December 2013 shy 2050

Păi conține cod mașină relocabil obținut după asamblare Dacă vrei să vezi ceea ce e icircn el (și dacă ești pe Linux) icirci poți da

objdump shys fisiero

Icircnsă nu prea e rdquodistractivrdquo pentru că o să vezi cam ce e relevant icircn hexa (icircn partea stacircnga apar octeții afișați icircn ASCII dar nici așa nu prea te ajutăfoarte mult)Icircncearcă să cauți partea de rdquorodatardquo acolo o să fie _chestiuni_ mai clare mai ales dacă ai un macro prin cod

Cel mai interesant e să icircl dezasamblezi (parametrul shyd sau shyshydisassemble la objdump) pentru a vedea codul icircn limbaj de asamblare

Edited by adrian93 30 December 2013 shy 2101

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa

Page 14: Lucruri pe care orice programator ar trebui să le ştie - Forumul Softpedia.pdf

2222015 Lucruri pe care orice programator ar trebui să le ştie shy Forumul Softpedia

httpforumsoftpediacomtopic899129shylucrurishypeshycareshyoriceshyprogramatorshyarshytrebuishysashyleshytie 1414

Page 1 of 2 Back to Articole si cod sursa

Forumul Softpedia rarr Professional Zone rarr Programming rarr C amp C++ rarr Articole si cod sursa

EnachescuAlin Posted 30 December 2013 shy 2054

Merge Interesant ce se afla acolodar totusi nu se poate vedea codul binar al unui fisier C

OriginalCopy Posted 30 December 2013 shy 2121

Codul e deja binar dacă icircl deschizi (icircn windows cu notepad++ şi te joci prin meniu cu nişte pluginuri parcă) vei vedea fix codul binar

Ceea ce vrei este să vezi reprezentarea icircn ASCII (adică să vezi caracterele 0 şi 1) a codului binar

Icircn linux

xxd shyb fileo

EnachescuAlin Posted 30 December 2013 shy 2126

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nubinar

OriginalCopy Posted 30 December 2013 shy 2148

EnachescuAlin on 30 decembrie 2013 shy 2126 said

Pai eu asta vreau sa vad fisierul cu caractere 0 si 1 dar am Windows iar comanda pe care mishya datshyo Adrian e buna afiseaza ceva pe acolo dar nu binar

Stimate utilizator

Ţishyam dat şi o soluţie pentru windows Nu trebuie decacirct să citeşti ce am scris

Şi ţishyam spus şi că nu vrei săshyţi afişeze binar (binar e ce vezi cacircnd icircl deschizi cu notepad) ci vrei săshyţi afişeze reprezentarea icircn ASCII aconţinutului binar

binar icircnseamnă că un bit ocupă 1 bit Ori un bit nu poate fi vizualizat e prea mic

Atunci cacircnd vrei să vezi text cel mai simplu mod e săshyl vezi folosind standardul ASCII

Icircnsă un simbol icircn ASCII ocupă 7 biţi (hai 8) Deci ca să vezi reprezentarea icircn ASCII a acelui un bit trebuie săshyl umfli la 8 biţi ca să poţi vedea icircnfapt ceva

Bitul 0 va fi reprezentat ca byteshyul 0011 0000 iar bitul 1 va fi reprezentat ca byteshyul 0011 0001 (vezi aici tabelulhttpenwikipediaable_characters (httpenwikipediaorgwikiASCIIASCII_printable_characters) )

Asta dacă ai un editor text pentru ASCII Dacă nshyai (glumă racirczi) va trebui să umfli acel bit 0 respectiv 1 la numărul de biţi pentru ceea ce poateinterpreta editorul tău text

Reclamă

Bun venit pe Forumul Softpedia

Forumul Softpedia gt Professional Zone gt Programming gt C amp C++ gt Articole si cod sursa