Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Pointerii
#1
Posted 13 December 2017 - 23:14
Salutare,
Am niște mici întrebări: pentru ce sunt buni pointerii? in ce situații este nevoie de ei? Înțeleg faptul ca aceștia stochează adresa unei variabile, însă pentru ce? Cu ce ajuta? Încă nu m-am confruntat cu probleme reale in care sa fiu nevoit sa folosesc într-adevăr pointeri. Mulțumesc! |
#2
Posted 13 December 2017 - 23:26
Se dau 100 carti (titluri) si se cere
impartirea pe doua categorii, autor, gen Idei? |
#4
Posted 13 December 2017 - 23:31
Cand declari
int i; aloci static un bloc de memorie de marime sizeof(int) bytes. In acest bloc de memorie poti salva fix un int, nu mai mult. Insa programele trebuie sa actioneze generic, indiferent de marimea inputului. De exemplu, daca trebuie sa procesezi un vector dintr-un fisier, nu stii cate elemente vor fi in acel vector. Deci declari un pointer int *vector; Si citesti int cu int. Pe masura ce citesti cate un int, redimensionezi marimea blocului de memorie astfel incat sa incape ce era deja acolo, plus inca un element in plus. Bineinteles, initial trebuie sa aloci un bloc de dimensiune 1, si abia apoi la rularile cu numarul 2+ ale buclei de citire din fisier redimensionezi. Alocarea initiala o faci cu malloc, realocarea o faci cu realloc. La final eliberezi cu free. Toate aceste trei operatii sunt manageriate de sistemul de operare. Caci asta e misiunea unui OS: sa abstractizeze hardware si sa ofere o interfata catre aceste resurse hardware. Iar RAM-ul este una dintre resursele hardware dintr-un calculator. PS: in problemele scolaresti ti se spune ca inputul nu poate depasi x elemente, si atunci aloci static maximul necesar. In practica, in industrie, nu risipim resurse, ci le manageriem mai precis. PPS: am sarit peste alte detalii gen marimea stackului, etc. Edited by OriginalCopy, 13 December 2017 - 23:39. |
#5
Posted 13 December 2017 - 23:54
#6
Posted 14 December 2017 - 00:04
TruculMagic, on 13 decembrie 2017 - 23:54, said: "Copiuta" nu ai ceva tutoriale facute sau ceva cursuri ? Chiar imi place cum explici. Mentorat nu ofer decat de la mid-level in sus, si individual; adica stau cu tine si te indrum pas cu pas, fix pe nevoile tale. Cu plata, am facut asta si gratuit (multi ani) si in general oamenii nu trateaza treaba cu seriozitate, deci nu merita. Prefer sa accept o suma modica si sa stiu ca intr-adevar am un impact asupra carierei cuiva. Satisfactia pe care o primesti atunci cand te contacteaza fosti cursanti de peste tot din lume sa iti povesteasca cum au reusit e o satisfactie mai mare. |
#7
Posted 14 December 2017 - 02:10
Exista pointeri de functii, Se pot stoca intr-un vector iar parcurgand vectorul se lanseaza in executie functia respectiva.
|
#8
Posted 14 December 2017 - 08:02
Pointerii nu sint legati de conceptul de alocare dinamica, pointer inseamna o variabila care contine o adresa de memorie.
Poti avea ceva de genul: Quote
int i; int* p = &i; Avem un pointer la int si nici o alocare dinamica. De asemenea, alocarea dinamica, folosita pe larg in aplicatiile desktop, unde memoria este infinita in zilele noastre, are si dezavantaje, cum ar fi - memory leaks, adica aloci memorie si uiti sa o mai eliberezi - fragmentarea memoriei, adica tot alocind si dealocind memorie ajungi in situatia de a nu mai avea blocuri suficient de mari de memorie pentru alocare In sistemele embedded critice unde memoria este limitata si sistemul NU trebuie sa crape sub nici o forma se poate interzice complet utilizarea alocarii dinamice sau doar folosirea ei la initializarea sistemului. Alt avantaj al pointerilor fata de cel mentionat mai sus este posibilitatea apelarii de functii folosind ca parametru doar adresa unei structuri de date sau a unei variabile, in acest fel putind accesa direct datele de la adresa de memorie. Acelasi lucru este valabil si pentru functii, caz in care avem asa-numitele callback functions: https://en.wikipedia...ter_programming)#C Evident ca un dezavantaj major al pointerilor este imputziciunea lor atunci cind lucrurile se complica si codul devine un gunoi dpdv al intelegerii lui. |
#9
Posted 14 December 2017 - 11:21
Multumesc mult pentru raspunsuri, baieti!
OriginalCopy, on 13 decembrie 2017 - 23:31, said: Deci, daca nu stiu cate elemente va avea un vector, trebuie sa folosesc un pointer. Apoi, incep sa aloc memorie pentru fiecare int care intra in vector. Sa zicem ca stiu de la inceput ca va avea 20 de elemente. Daca zic de la inceput ' int vector[20] ' si apoi introduc int cu int, este acelasi lucru ca atunci cand declar un pointer pentru un vector fara o marime initiala si apoi aloc memorie odata cu fiecare int introdus (+1 bloc pentru a intra urmatorul int)? Diferenta este ca lucrez cu memoria dinamica, nu? Si, in cazul prezentat de tine, in stack sunt numai pointerul care are marimea unui int (cea de la sizeof(int) ) si vectorul a carui lungime este necunoscuta si care are marimea tot cat un int, nu? Asadar, pointerii pentru memorie dinamica sunt folositori pentru un vector a carui marime nu o cunoastem de la inceput, si nu numai pentru vectori. Foarte interesant. La liceu ne lasa sa declaram de la inceput un vector cu, sa zicem, 1000 de elemente. Oricum nu vom ajunge la 1000 de elemente, deci nu ne batem capul cu lungimea acestuia. In schimb, din ce am inteles de la tine, in industrie nu se accepta risipa de resurse. Nu am inteles ceva: In exemplul tau, vom avea un vector si un pointer sau numai un pointer care se va comporta drept vector, dar nu cred ca exista asa ceva? Memoria i se aloca pointerului sau vectorului? getmorefun, on 14 decembrie 2017 - 02:10, said:
Exista pointeri de functii, Se pot stoca intr-un vector iar parcurgand vectorul se lanseaza in executie functia respectiva. Am inteles. Imi poti da un exemplu simplu in care li se asociaza unor pointeri niste functii, apoi sunt introdusi intr-un vector si, la parcurgerea acelui vector, sa vad cum sunt apelate functiile respective? Cum ar functiona, am o idee in cap, insa nu stiu cum ar arata codul. Multumesc! Mosotti, on 14 decembrie 2017 - 08:02, said:
Pointerii nu sint legati de conceptul de alocare dinamica, pointer inseamna o variabila care contine o adresa de memorie. Poti avea ceva de genul: Avem un pointer la int si nici o alocare dinamica. De asemenea, alocarea dinamica, folosita pe larg in aplicatiile desktop, unde memoria este infinita in zilele noastre, are si dezavantaje, cum ar fi - memory leaks, adica aloci memorie si uiti sa o mai eliberezi - fragmentarea memoriei, adica tot alocind si dealocind memorie ajungi in situatia de a nu mai avea blocuri suficient de mari de memorie pentru alocare In sistemele embedded critice unde memoria este limitata si sistemul NU trebuie sa crape sub nici o forma se poate interzice complet utilizarea alocarii dinamice sau doar folosirea ei la initializarea sistemului. Alt avantaj al pointerilor fata de cel mentionat mai sus este posibilitatea apelarii de functii folosind ca parametru doar adresa unei structuri de date sau a unei variabile, in acest fel putind accesa direct datele de la adresa de memorie. Acelasi lucru este valabil si pentru functii, caz in care avem asa-numitele callback functions: https://en.wikipedia...ter_programming)#C Evident ca un dezavantaj major al pointerilor este imputziciunea lor atunci cind lucrurile se complica si codul devine un gunoi dpdv al intelegerii lui. Ok. Multumesc frumos! Eu asa am invatat despre pointeri, cu exemple in care nu sunt legati de vreo alocare de memorie dinamica sau de functii, insa cu siguranta astea erau notiunile de baza despre pointeri. Stiam eu ca pointerii astia sunt mult mai complecsi si ajuta in situatii mult mai interesante, doua exemple fiind cele prezentate de OriginalCopy si getmorefun, carora le multumesc inca o data. Inseamna ca la sistemele embedded nu se risca nimeni cu nimic. Asadar, exista programatori buni care mai uita sa elibereze memorie, din greseala? Presupun ca numai un anumit tip de programatori lucreaza la sisteme embedded, nu? MarianG, on 13 decembrie 2017 - 23:26, said:
Se dau 100 carti (titluri) si se cere impartirea pe doua categorii, autor, gen Idei? Multumesc mult pentru acest "challenge". Presupunand ca nu stim de la inceput cate carti ni se dau, vom avea, intr-adevar, nevoie de pointeri. Declaram o matrice bidimensionala cu lungimi nedefinite de tip char si un pointer, tot de tip char. Folosim un for-loop care parcurge randurile matricei, iar in interiorul acestuia un alt for-loop care parcurge coloanele matricei. La fiecare titlu, autor si gen adaugat in celula corespunzatoare, se foloseste realloc(sizeof(char)). Asadar, matricea se va parcurge astfel: [0][0], [0][1], [0][2], [1][0], [1][1], [1][2] ..... La final, matricea se afiseaza si, dupa afisare, memoria se elibereaza. Ideea mea este buna? Nu pot scrie acum codul, fiindca intr-un sfert de ora incep sa ma pregatesc sa plec la liceu, insa diseara voi incerca sa transpun ideile in cod. Nu am inteles ceva legat de pointeri, iar intrebarile sunt putin mai sus, la raspunsul pentru OriginalCopy. Daca am gresit undeva, indiferent daca este vorba de idee sau de termenii folositi, va rog sa imi spuneti! Multumesc! |
#10
Posted 14 December 2017 - 12:33
Am greșit la rezolvarea. Nu știu la ce m-am gândit...Cum sa folosesc for, dacă nu cunosc număr de cărți de la început...? Nu se poate așa.
Dacă știu numărul de cărți de la început, nu văd de ce as avea nevoie de pointer. Dacă nu, in cazul asta nu știu cum as putea introduce valori in matrice. Cu for nu, decât cu while. Și cu while ar însemna ca se adaug valori pana când se introduce 0 sau orice altceva. Problema asta merita studiată cu atenție diseară, de mine. Acum sunt la liceu și aștept sa intru in clădire. |
|
#11
Posted 14 December 2017 - 13:19
AnduIX, on 14 decembrie 2017 - 11:21, said:
Inseamna ca la sistemele embedded nu se risca nimeni cu nimic. Asadar, exista programatori buni care mai uita sa elibereze memorie, din greseala? Presupun ca numai un anumit tip de programatori lucreaza la sisteme embedded, nu? Ca sa se evite problemele de memory leak s-au inventat anumite mecanisme, in sensul ca nu mai aloci si eliberezi memoria direct si manual, ci printr-un anumit mecanism, cum ar fi "smart pointers". https://en.wikipedia...i/Smart_pointer In limbaje ca Java sau C# nici macar nu exista notiunea de pointer, managementul memoriei se face automat |
#13
Posted 14 December 2017 - 20:17
Uh...Nu stiu ce e cu listele inlantuite. Nu am auzit de ele pana acum.
Am dat un search pe Google si din cate am vazut, lista este un vector care contine elemente exact in ordinea asta: pointer catre adresa primului element din lista, apoi primul element din lista, apoi un alt pointer catre al doilea element, apoi elementul cu informatia utila si tot asa. Deci, asta ar insemna ca dupa cele 100 de titluri de carti, al 101-lea pointer este catre autorul primei carti, iar al 201-lea pointer este catre genul primei carti. Nu stiu daca privesc problema bine, dar nu vad de ce as avea nevoie de pointeri, cand as putea folosi un vector cu 300 elemente, in care primele 100 sa fie titlurile, urmatoarele 100 autorii si ultimele 100 genurile. Sau nu asa se lucreaza? |
#14
Posted 14 December 2017 - 20:29
AnduIX, on 14 decembrie 2017 - 20:17, said:
Deci, asta ar insemna ca dupa cele 100 de titluri de carti, al 101-lea pointer este catre autorul primei carti, iar al 201-lea pointer este catre genul primei carti. AnduIX, on 14 decembrie 2017 - 20:17, said:
dar nu vad de ce as avea nevoie de pointeri, cand as putea folosi un vector cu 300 elemente Edited by neagu_laurentiu, 14 December 2017 - 20:39. |
#15
Posted 14 December 2017 - 20:58
neagu_laurentiu, on 14 decembrie 2017 - 20:29, said:
Listele le folosesti cand nu stii nr. de elemente precum la vector. Iar un vector e alocat pe stiva unde dimensiunea (chiar daca e setabila) nu-i cat tot RAM-ul. Am inteles, deci in cazul asta e nevoie de memoria dinamica. neagu_laurentiu, on 14 decembrie 2017 - 20:29, said:
In elementul unei liste pastreaza referinte la alte structuri de date, dincolo de nodul urmator/anterior, si astfel ai eficienta organizarea informatiilor. Cum zici tu se duce in balarii daca ti se cere sa mai agaugi o carte! Am inteles ca nu e bine cum am zis eu, dar nu prea inteleg ce-i cu nodurile astea (am vazut niste cod in care tipul de data era chiar 'nod') si cum functioneaza intr-adevar o lista de genul. Altfel nu se poate rezolva problema propusa de MarianG, nu? Nu caut o varianta mai usoara, ci sunt curios. |
|
#16
Posted 14 December 2017 - 21:14
Se poate folosind o baza de date. Insa scopul tau e sa intelegi concepte din universul acesta (si baza de date ascunde in spate si astfel de structuri dinamice doar ca-s transparente pentru tine).
Pana sa folosesti listele ar trebui sa intelegi notiunea de structura: http://www.cplusplus...ial/structures/ Edited by neagu_laurentiu, 14 December 2017 - 21:17. |
#17
Posted 14 December 2017 - 21:49
Am facut problema cu cartile, daca se cunoaste un numar maxim de carti, in cazul meu fiind 30 (o valoare aleatorie).
#include <iostream> using namespace std; struct carti { char titlu[30], autor[30], gen[20]; } v[30]; int n, i; int main() { cout << "Cate carti sunt?" << endl; cin >> n; for (int i=1; i<=n; i++) { cout << "Cartea " << i << ":" << endl; cout << "Titlul: "; cin >> v[i].titlu; cout << "Autorul: "; cin >> v[i].autor; cout << "Genul: "; cin >> v[i].gen; } for (int i=1; i<=n; i++) { cout << v[i].titlu << " " << v[i].autor << " " << v[i].gen << endl; } return 0; } Am inteles ca struct este un tip de data care permite operarea cu mai multe date intr-un mod mult mai simplu. Am citit despre structura ce inseamna, care este forma generala si am incercat direct sa o folosesc in problema data de Marian. A functionat, insa deocamdata numai pentru cazul in care se cunoaste numarul de carti de la inceput. Am vrut sa fac asta pentru a vedea cum functioneaza structura. Poate ca am luat-o cam rapid, dar chiar mi s-a parut interesant. |
#18
Posted 14 December 2017 - 22:28
Pentru vectorul ce stocheaza pointeri catre functii (exemplu ce functioneaza pe un microcontroller PIC):
int (*Vector_p[91])();// declararea vectorului ce contine pointeri la functii void Assign_p()// "umplerea" vectorului { Vector_p[0]=Ac_45;//Ac_45 este numele unei functii Vector_p[1]=Ac_44; . . . } while(1) { //se citeste de la ADC si se calculeaza valoarea "Nr_ac" if(Nr_ac>Nr_ac_prec)//prec vine de la precedent { (*Vector_p[Nr_ac_prec+1])();//lansarea in executie a functiei asociate pointerului //aflat pe pozitia Nr_ac_prec+1 in vectorul de pointeri Vector_p Nr_ac_prec++; } else if(Nr_ac<Nr_ac_prec) { (*Vector_p[Nr_ac_prec-1])(); Nr_ac_prec--; } } Edited by getmorefun, 14 December 2017 - 22:31. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users