Neurochirurgie minim invazivă
"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv. Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice. www.neurohope.ro |
Functie cu char* return
Ultima postare: ian 30 2023 13:17, Inițiat de
GabyF
, ian 28 2023 19:46
·
0
#1
Publicat: 28 ianuarie 2023 - 19:46
Functia de mai jos se poate face cumva sa nu risipeasca memorie la fiecare apelare? Nu am inteles de ce nu e ok sa definesc tmp ca tmp[] fara new, nu mi se pare normal sa stearga variabilele din functie inainte de return...
char *subChr(char *str, int start, int length=0) { if (start<0) start=strlen(str)+start; if (!length) return str+start; length=mmin(length,(int)strlen(str)-start); char* tmp = new char[length+1]; strncpy(tmp, str+start, length); tmp[length] = '\0'; return tmp; } |
#3
Publicat: 28 ianuarie 2023 - 20:00
#4
Publicat: 28 ianuarie 2023 - 20:06
dani.user, on 28 ianuarie 2023 - 20:00, said:
Daca daca functia nu le-ar sterge, cine ar face curat? Daca ai avea vreo 10 variabile ce ar trebui curatate? Intr-un mediu de lucru curat proramatorul ar asigura o zona de memorie in care sa fie copiat acest sub sir de litere. In cazul de fata funtia este cea care intoare o zona de memorie, pe care ulterior utilzatorul o poate curata. (daca isi aminteste) functia asta vrea sa fie o reimplementare a lui substr? Editat de MarianG, 28 ianuarie 2023 - 20:07. |
#7
Publicat: 28 ianuarie 2023 - 21:13
dani.user, on 28 ianuarie 2023 - 20:00, said:
Daca functia nu le-ar sterge, cine ar face curat? Daca ai avea vreo 10 variabile ce ar trebui curatate? Normal ca e ok ca le sterge dar am spus "inainte de return", asta mi se pare cam sucit in C++ Dupa cum se vede, functia e pentru char, cu totul altceva decat substr |
#10
Publicat: 28 ianuarie 2023 - 21:22
p.s subnstr este substr abordat in C pur,
un subsir de lungime arbitrara codul tau ce vrea sa faca? unde in C++ substr iti ofera un element nou, in C subnstr cere o zona de memorie in cazul tau acea zona este tmp, și dispare DUPA return, zic eu pai citesc, și nu inteleg ce dispare pui terminal de sir '\0', apoi dai return la o adresa de memorie asupra caruia nu ai control, este tmp cu scopul de a lucra in functia cu pricina si nu inafara ei |
|
#11
Publicat: 28 ianuarie 2023 - 21:36
GabyF, on 28 ianuarie 2023 - 21:13, said:
Normal ca e ok ca le sterge dar am spus "inainte de return", asta mi se pare cam sucit in C++ Rezultatul ce-l oferi trebuie sa "traiasca" mai mult timp. Trebuie sa fie in viata pana la momentul urmator: char* rezultat = subChr(str, 1, 2); //fac ceva //fac altceva folosesc(rezultat); <-- aici inca am nevoie de rezultatul valid. Daca ai fi returnat pointer la temp array declarata in functie, acel pointer ar fi continut tot felul de mizerii la momentul asta. |
#13
Publicat: 28 ianuarie 2023 - 22:21
MarianG, on 28 ianuarie 2023 - 21:51, said: free(rezultat) Gresit Cand aloci tu memorie si lasi sarcina mai departe sa fie stearsa, trebuie sa specifici si cum trebuie aceasta stearsa. Ai folosit new? Dai cu delete, nu cu free. Si acum ajungem la un bug mai subtil din codul initial: ce se intampla cu dealocarea la primul return? |
#14
Publicat: 28 ianuarie 2023 - 22:57
Pana la urma facem C sau C++ ?
malloc /free new / delete Si de aia zic, cand lucrezi cu zone de memorie este un mod curat sa oferi tu zona de memorie, si o dealoci asa corespunzător. pai in cazul functiei prezentate verifici daca zona de memorie este parte din sirul initial, si nu ai ce dealoca. Dar astea sunt complicatii de la "optimizari". eu nu inteleg ce rost are length = min(0,strlen(str)-start)apoi sa creezi un sir de lungime 1 peste care scrii `\0' asta daca am inteles intentia de a folosi functia min(), ca mmin() nu stiu exact ce e |
#15
Publicat: 29 ianuarie 2023 - 10:26
dani.user, on 28 ianuarie 2023 - 21:36, said:
Rezultatul ce-l oferi trebuie sa "traiasca" mai mult timp. Trebuie sa fie in viata pana la momentul urmator: char* rezultat = subChr(str, 1, 2); //fac ceva //fac altceva folosesc(rezultat); <-- aici inca am nevoie de rezultatul valid. Daca ai fi returnat pointer la temp array declarata in functie, acel pointer ar fi continut tot felul de mizerii la momentul asta. Da, mmin() este de fapt min(), e scris gresit Editat de GabyF, 29 ianuarie 2023 - 10:27. |
|
#17
Publicat: 29 ianuarie 2023 - 12:39
GabyF, on 29 ianuarie 2023 - 10:26, said:
De ce n-ar fi in viata daca nu-l sterge nimeni? Ai o zona de memorie "stack" de dimensiune fixa. Urmeaza sa apelezi o functie. Pentru ca vei avea vreo 10 variabile in acea functie, compilatorul rezerva memorie pentru ele in stack (o simpla adunare sau scadere banala la stack pointer). Cand se termina functia, stie ca acea memorie nu va mai fi folosita asa ca face opusul scaderii/adunarii la pointerul de stack. Apelezi alta functie? Se refoloseste memoria folosita (partial) de functia precedenta. De ce face asta si nu tine vesnic acele variabile? Fiindca pe masura ce ai apela o functie, vei avea nevoie de tot mai mult spatiu pentru fiecare copie a variabilelor respective. De ce nu sterge mai tarziu? N-ar stii cand. De ce nu le tine mereu in viata? Poti face asta cu static, dar apar alte probleme la o astfel de functie. Editat de dani.user, 29 ianuarie 2023 - 12:39. |
#18
Publicat: 29 ianuarie 2023 - 13:07
GabyF, on 28 ianuarie 2023 - 21:13, said:
Dupa cum se vede, functia e pentru char, cu totul altceva decat substr substring.png 16,25K 11 download-uri |
Anunturi
▶ Utilizatori activi: 1
0 membri, 1 vizitatori, 0 utilizatori anonimi