Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cu ce va aparati de cainii agresi...

Nu imi platiti coletul cu cardul ...

Mi-au disparut amigdalitele ?

Exista vreun plan de terorizare p...
 Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 

Pointerii

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

#1
AnduIX

AnduIX

    Junior Member

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

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,441
  • Înscris: 10.08.2005
Se dau 100 carti (titluri) si se cere
impartirea pe doua categorii,
autor,  gen

Idei?

#3
TruculMagic

TruculMagic

    Egalitatea nu există decât în matematică

  • Grup: Senior Members
  • Posts: 19,669
  • Înscris: 24.11.2015
Ii urasc...

#4
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
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
TruculMagic

TruculMagic

    Egalitatea nu există decât în matematică

  • Grup: Senior Members
  • Posts: 19,669
  • Înscris: 24.11.2015

View PostOriginalCopy, on 13 decembrie 2017 - 23:31, said:



"Copiuta" nu ai ceva tutoriale facute sau ceva cursuri ? Chiar imi place cum explici. Posted Image

#6
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View PostTruculMagic, on 13 decembrie 2017 - 23:54, said:


"Copiuta" nu ai ceva tutoriale facute sau ceva cursuri ? Chiar imi place cum explici. Posted Image
Materialele gratuite pe care le ofer sunt pe forum.

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
getmorefun

getmorefun

    New Member

  • Grup: Junior Members
  • Posts: 22
  • Înscris: 20.10.2017
Exista pointeri de functii, Se pot stoca intr-un vector iar parcurgand vectorul se lanseaza in executie functia respectiva.

#8
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
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
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
Multumesc mult pentru raspunsuri, baieti!

View PostOriginalCopy, 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?


View Postgetmorefun, 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!


View PostMosotti, 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. Posted Image

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? Posted Image


View PostMarianG, 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
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
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
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004

View PostAnduIX, 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? Posted Image
Conteaza ce fel de sisteme, embedded presupune o arie foarte larga de aplicatii. Uitatul eliberarii memoriei nu tine de cit de bun e programatorul, tine de natura umana, oricine poate gresi, chiar si programatoru programatorului universului. Dar da, la sistemele critice nu lucreaza oricine si standarde foarte inalte de calitate. De exemplu, un program comercial pentru Windows obisnuit se lanseaza cu sute sau poate mii de buguri cunoscute, pe care dup-aia aia le rezolva (la sfintu-asteapta sau deloc), prin tot felul de patch-uri. Daca trimiti o racheta pe Marte vrei sa ai fix zero buguri, pentru ca nu vrei sa o ia usor la stinga si sa ajunga la dracu-n praznic. Idem in aviatie, nu poti spune "luati avionu asta, pilotu automat are citeva sute de buguri si o mai ia razna din cind in cind, da le rezovam pe parcurs, nu e mare scofala" :first:

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

#12
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,441
  • Înscris: 10.08.2005
Sau nu folosim matrice ci o lista inlantuita

#13
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,603
  • Înscris: 30.07.2003

View PostAnduIX, 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.
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!

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

Edited by neagu_laurentiu, 14 December 2017 - 20:39.


#15
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016

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

View Postneagu_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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,603
  • Înscris: 30.07.2003
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
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
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
getmorefun

getmorefun

    New Member

  • Grup: Junior Members
  • Posts: 22
  • Înscris: 20.10.2017
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

Second Opinion 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

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