Functie cu char* return
Last Updated: Jan 30 2023 13:17, Started by
GabyF
, Jan 28 2023 19:46
·
0
#1
Posted 28 January 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; } |
#2
Posted 28 January 2023 - 19:55
Descrie in cuvinte ce se intampla acolo cu tmp.
Cumva undeva ai o impresie gresita si vrem sa o corectam. |
#3
Posted 28 January 2023 - 20:00
#4
Posted 28 January 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? Edited by MarianG, 28 January 2023 - 20:07. |
#5
Posted 28 January 2023 - 20:15
Ambele abordari se intalnesc in industrie, insa cu mici observatii de discutat mai incolo.
|
#6
Posted 28 January 2023 - 20:52
bine, dar pentru ce vrea el sa faca
strncpy(tmp, str+start, length); char *strncpy(char *dest, const char *src, size_t count) { char *tmp = dest; while (count) { if ((*tmp = *src) != 0) src++; tmp++; count--; } return dest; } |
#7
Posted 28 January 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
Posted 28 January 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
Posted 28 January 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
Posted 28 January 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
Posted 28 January 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
Posted 29 January 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 Edited by GabyF, 29 January 2023 - 10:27. |
|
#16
Posted 29 January 2023 - 12:29
**mea culpa**
if (!length) return str+start; length = min(length,(int)strlen(str)-start);len nu poate fi zero ca s-ar fi oprit mai inainte dar raman alte cazuri |
#17
Posted 29 January 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. Edited by dani.user, 29 January 2023 - 12:39. |
#18
Posted 29 January 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 downloads |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users