Chirurgia cranio-cerebrală minim invazivă
Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne. Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale. www.neurohope.ro |
Misterele bibliotecilor (DLL-urilor)
Last Updated: Jun 16 2014 14:53, Started by
dani.user
, Feb 28 2013 23:24
·
0
#1
Posted 28 February 2013 - 23:24
Quote DLL-uri ... e plin Windows-ul de eleș când instalam un program mai apar nu știu câte ... dar ce sunt ele? Care-i rolul lor? Asa cum le zice și numele (DLL - Dynamic Link Library - Bibliotecă legată dinamic), DLL-urile sunt biblioteci de funcții. Quote Biblioteci de functii? Ce-s astea și de ce am nevoie de ele? Atunci când scrii un program, pe lângă celebra funcție int main() (ar trebui să) mai ai o gramadă de funcții care rezolvă diverse parți individuale ale problemei. Când scrii tot mai multe aplicații, începi să observi că o grămadă de funcții se tot repetă. Quote Bun, bun ... dar mi-e greu să copiez codul acelor funcții în fiecare program? Da ... ce faci dacă constați o greșeală în implementarea unei funcții? Te pui sa cauți toate proiectele în care ai folosit-o pentru a o actualiza? Bibliotecile legate dinamic (.dll în cazul MS Windows, .so în cazul *nix) vin ca o soluție la aceste probleme. Ele conțin implementarea (codul obiect - compilat) a diverselor funcții. De exemplu: biblioteca standard C msvcrt.dll conține implementarea funcțiilor des utilizate în C precum printf(), pow() etc. Ați văzut pe undeva codul sursă al acestor funcții? Nu, și nici nu aveți nevoie de el. Trebuie să știți semnătura funcției (nume, parametrii, ce returnează) și unde ii găsiți implementarea, lăsând pe seama celor ce au dezvoltat biblioteca standard să se ocupe de codul ei efectiv. Quote Ok ... si cum vad ce funcții îmi pune la dispoziție un DLL? Foarte simplu, utilizând Dependency Walker dll1.png 81.99K 234 downloads Dupa cum se poate observa, biblioteca din imagine conține implementarea a peste 1000 de funcții. Se mai observă însă și că, în cazul funcțiilor "C", putem vedea doar numele funcției. Cel ce a dezvoltat biblioteca trebuie să ne ofere semnătura acesteia.
Edited by dani.user, 05 February 2014 - 18:36. |
#2
Posted 28 February 2013 - 23:32
O mica sugestie, conceptul il intalnim si in Unix-like: http://www.yolinux.c...AndDynamic.html
|
#5
Posted 05 March 2013 - 13:04
Crezi ca are rost sa scrie tot ce include o carte sau documentatia furnizorului ? Te-a introdus in poveste, ai o idee iar mai departe e numai munca ta, literatura de specialitate exista.
Edited by neagu_laurentiu, 05 March 2013 - 13:05. |
#6
Posted 06 March 2013 - 10:33
M-am referit la continuarea scrierii de tutoriale despre anumite concepte, nu si dezvoltarea lor. Dezvoltarea stiu ca se gaseste in carti de specialitate. Dar ca sa iti iei startul, sunt foarte bune.
Sincer sa fiu, ce a scris el in acest tutorial nu am gasit in carti. In carti am gasit conceptul de biblioteca, nu de DLL. Un mic tutorial ca cel de sus e binevenit oricand. Edited by pax0xFF, 06 March 2013 - 10:41. |
#7
Posted 06 March 2013 - 10:53
pax0xFF, on 06 martie 2013 - 10:33, said:
In carti am gasit conceptul de biblioteca, nu de DLL. http://www.scribd.co...mming-WindowsÂź |
#8
Posted 12 March 2013 - 19:36
Acum că am atins toate subpunctele, urmează şi o temă de casă
Să se scrie o aplicaţie ce va sorta un vector (mare, câţiva zeci de MB) de întregi prin diverşi algoritmi şi care va cronometra cât durează fiecare sortare.
|
#9
Posted 13 March 2013 - 05:20
Cred că ar mai fi bună o funcţie (sau un câmp) char* GetAuthor(void), pentru a putea testa acelaşi algoritm implementat de diferiţi autori, şi a şti care rezultat al cui este.
|
#10
Posted 13 March 2013 - 18:32
Nu-i rea ideea.
Pentru început aș fi fericit și dacă reușesc 2-3 să implementeze ideea inițială. |
|
#11
Posted 15 June 2014 - 21:31
Postez aici cam tarziu (dupa un an si ceva), insa de abia acuma am vazut tema aceasta. Am optat pentru o implementare in C.
#include <stdlib.h> #include <stdio.h> #include <dlfcn.h> #include <sys/types.h> #include <dirent.h> #include <string.h> #include <sys/time.h> #include <time.h> #define MICRO 1000000 int main(int argc, char **argv) { int* array = NULL; size_t bytes = 0; size_t count = 0; size_t trash = 100; void* handle; void (*sort)(int*, size_t); void (*getName)(char*, size_t); char* error, *name; char relPath[250]; struct timeval tick, tock; FILE* bignum = fopen("data.in", "rb"); if(bignum == NULL) { printf("Error on opening the file\n"); return -1; } fseek(bignum, 0, SEEK_END); bytes = ftell(bignum); fseek(bignum, 0, SEEK_SET); count = bytes / sizeof(int); DIR *plugins; struct dirent *file; if((plugins = opendir("./plugins")) == NULL) { printf("Error on opening the folder\n"); return -2; } while((file = readdir(plugins)) != NULL) { if(file -> d_name[0] != '.') { gettimeofday(&tick, NULL); strcpy(relPath, "./plugins/"); strcat(relPath, file -> d_name); handle = dlopen(relPath, RTLD_LAZY); if(!handle) { printf("Error on %s\n", relPath); return -3; } sort = dlsym(handle, "Sort"); if((error = dlerror()) != NULL) { printf("%s\n", error); return -4; } fseek(bignum, 0, SEEK_SET); array = (int*)calloc(count, sizeof(int)); fread(array, sizeof(int), count, bignum); (*sort)(array, bytes); gettimeofday(&tock, NULL); getName = dlsym(handle, "GetName"); if((error = dlerror()) != NULL) { printf("%s\n", error); return -4; } name = (char*)calloc(trash, sizeof(char)); (*getName)(name, trash); printf("%s - %.3f sec\n", name, (tock.tv_sec + tock.tv_usec / (1.0 * MICRO)) - (tick.tv_sec + tick.tv_usec / (1.0 * MICRO))); dlclose(handle); } } closedir(plugins); fclose(bignum); return 0; } Compilare: gcc dlltest.c -o dlltest.out -ldl Rezultate: adrian@adrian-EP41-UD3L ~/Desktop/softsorter $ dd if=/dev/urandom of=./data.in bs=1024 count=100000 100000+0 records in 100000+0 records out 102400000 bytes (102 MB) copied, 19,2229 s, 5,3 MB/s adrian@adrian-EP41-UD3L ~/Desktop/softsorter $ ./dlltest.out shellSort - 46.880 sec quickSort - 15.480 sec bubbleSort & cocktailSort & strandSort - n-as vrea sa astept o eternitate... Nu cred ca am inteles cum ar trebui implementate functiile GetName. De ce este nevoie de parametrul size_t size? Eu le-am implementat astfel: void GetName(char name[], size_t size) { strcpy(name, "shellSort"); } cu sirul respectiv alocat in programul principal. E cam aiurea ca e alocat mereu dinamic in bucla aia, cand ar putea fi alocat chiar static avand in vedere ca nu modific dimensiunea (junk), insa l-am pastrat asa pentru ca m-am gandit ca poate o sa modific nitel dupa ce inteleg care e treaba cu size din GetName + calloc se ocupa de initializarea cu \0 peste tot . Astept code review-ul vostru. EDIT: Link si pe Pastebin, ca sa arate un pic mai ok indentarea. http://pastebin.com/GB95DuKF Edited by adrian93, 15 June 2014 - 21:35. |
#12
Posted 15 June 2014 - 21:37
Felicitari pentru incercare.
Acel size in GetName e pentru a stii cat e name[] de mare, sa nu scrii cumva in el mai mult decat incape. Numele il poti declara linistit static: char name[128] = {0}; getName(name, sizeof(name)/sizeof(name[0]); //nu trebuie neaparat (*getName)(...)Initializarea cu 0 ar trebui s-o faci in GetName sa fii sigur ca orice junk primesti, rezultatul va fi corect. Memoria alocata in array n-o eliberezi niciunde si ai un leak destul de urat. Daca numarul elementelor e constant, poti sa aloci la inceput, iar apoi doar suprascrii array-ul cand testezi alt algoritm, iar la final eliberezi. Pentru o precizie mai buna, cronometreaza doar apeleul functiei Sort. Tu acum cronometrezi si citirea de pe disc, care poate incurca rezultatul din cauza cache-ului. |
#13
Posted 16 June 2014 - 11:02
http://pastebin.com/LaPCfcHU
Multumesc pentru review. Am modificat codul tinand cont de observatii. shellSort - 45.265 sec quickSort - 14.350 sec Da, in legatura cu eliberarea memoriei, am un obicei (cam nesanatos presupun) de a nu elibera memoria respectiva atunci cand am nevoie de ea pana la finalul executiei, pentru ca oricum sistemul de operare o sa se ocupe de acest lucru dupa ce procesul se incheie. Dar presupun ca e mai 'clean' sa cuplam fiecare new cu cate un delete (sau un m/calloc cu free) . Acuma pare sa fie ok (am testat pe un fisier mai mic, ca sa nu astept o groaza). shellSort - 0.101 sec quickSort - 0.067 sec ==3608== ==3608== HEAP SUMMARY: ==3608== in use at exit: 0 bytes in 0 blocks ==3608== total heap usage: 13 allocs, 13 frees, 134,914 bytes allocated ==3608== ==3608== All heap blocks were freed -- no leaks are possible ==3608== ==3608== For counts of detected and suppressed errors, rerun with: -v ==3608== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) Mai am o intrebare cu privire la citirea de pe disc a vectorului, de fiecare data cand schimbam algoritmul: procedam astfel pentru a avea un program relativ eficient si din punct de vedere al memoriei? Eu eram tentat sa fac copie a vectorului si sa restaurez de fiecare data vectorul, folosind copia si astfel sa fac o singura citire de pe disc (presupun ca memcpy-urile sunt mai rapide decat citirile de pe disc). Insa presupun ca ai optat pentru aceasta varianta in cerinta, deoarece daca tineam si o copie, avand in vedere ca lucram cu fisiere maricele, atunci am fi avut cateva sute de MB folositi, care ar reprezenta o bucata semnificativa din RAM? Edited by adrian93, 16 June 2014 - 11:09. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users