Upload
georgescu-gabriel
View
93
Download
1
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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
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