Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Sitemul de operare foloseste prea...

Ce farmacie VET online care "...

De unde cumparați legume si fructe?

Samsung S21 ultra
 Plasa de umbrire peste gard de pl...

O smecherie pe care nu o inteleg

Balcon parter fara acte

unde gasesc un speed bag in bucur...
 Programe TV cu altfel de sporturi

Laptop "bun la toate" max...

navigatie noua vw tiguan

ctfmon.exe - System Error (in Saf...
 Ați prins vremurile cand 120 Volț...

Whatsapp nu afișeaza numele ...

Medii admitere Politehnica Bucure...

Se extinde Baza de la Kogalniceanu
 

Functie cu char* return

- - - - -
  • Please log in to reply
33 replies to this topic

#1
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
Descrie in cuvinte ce se intampla acolo cu tmp.
Cumva undeva ai o impresie gresita si vrem sa o corectam.

#3
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007

View PostGabyF, on 28 ianuarie 2023 - 19:46, said:

nu mi se pare normal sa stearga variabilele din functie inainte de return...

Daca functia nu le-ar sterge, cine ar face curat? Daca ai avea vreo 10 variabile ce ar trebui curatate?

Edited by dani.user, 28 January 2023 - 20:06.


#4
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005

View Postdani.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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007
Ambele abordari se intalnesc in industrie, insa cu mici observatii de discutat mai incolo.

#6
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
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
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006

View Postdani.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

#8
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
Cum vezi ca se sterg inainte de return?

#9
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006
citeste te rog mai cu atentie ca ne pierdem timpul

#10
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007

View PostGabyF, 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.



#12
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005


free(rezultat)


#13
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007

View PostMarianG, on 28 ianuarie 2023 - 21:51, said:

free(rezultat)

Gresit Posted Image

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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
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
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006

View Postdani.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.

De ce n-ar fi in viata daca nu-l sterge nimeni?

Da, mmin() este de fapt min(), e scris gresit

Edited by GabyF, 29 January 2023 - 10:27.


#16
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
**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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007

View PostGabyF, 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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005

View PostGabyF, on 28 ianuarie 2023 - 21:13, said:

Dupa cum se vede, functia e pentru char, cu totul altceva decat substr
mai exact cum ?
Attached File  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

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate