Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
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...
 Kanal D va difuza serialul “...

Upgrade xiaomi mi11

securitate - acum se dau drept - ...

Farmacia Dr Max - Pareri / Sugest...
 

pointeri

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

#1
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
pana acum s-a tot discutat de pointeri insa eu nu reusesc sa ii inteleg, chiar si cu atatea materiale in fata
pentru intelegerea lor sigur m-ar ajuta foarte mult sa inteleg cand se folosesc si pentru ce ? pe langa asta vreau sa stiu de ce optam pentru pointeri si sa nu folosim programarea in stil clasic ?

#2
nightboy

nightboy

    Member

  • Grup: Banned
  • Posts: 394
  • Înscris: 18.05.2007
aceeasi problema o am si eu cu pointerii...

#3
JayBird

JayBird

    IT Professional

  • Grup: Senior Members
  • Posts: 2,511
  • Înscris: 15.09.2009
Un pointer este un indicator catre o zona de memorie de unde vrei sa citesti sau sa scrii date. Nu prea se mai folosesc in limbajele de nivel inalt de la ora actuala (gen Visual Basic .NET, C#) asa ca nu va bateti capul cu ei.

#4
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
Un exemplu, vrei sa faci o lista simplu inlantuita.
Vei stoca fiecare element in memorie si fiecare element va contine adresa spre urmatorul. Ca sa parcurgi lista si sa citesti informatia din ea n-o sa ai nevoie decat de un pointer la memoria unde incepe primul element si de acolo mergi din aproape in aproape, nu ti cate o variabila pentru fiecare element.

Edited by dani.user, 25 June 2010 - 19:11.


#5
webulxpert

webulxpert

    Senior Member

  • Grup: Senior Members
  • Posts: 2,065
  • Înscris: 28.09.2006

 dani.user, on 25th June 2010, 20:09, said:

Un exemplu, vrei sa faci o lista simplu inlantuita.
Vei stoca fiecare element in memorie si fiecare element va contine adresa spre urmatorul. Ca sa parcurgi lista si sa citesti informatia din ea n-o sa ai nevoie decat de un pointer la memoria unde incepe primul element si de acolo mergi din aproape in aproape, nu ti cate o variabila pentru fiecare element.

iar fata de un vector, o lista are dimensiune varibila (chiar daca in Java exista vectori cu dimensiuni varibile), si lista inlantuita ocupa atatea memorie cate elemente ai, un vector cand va fi initializat va avea un numar fix de elemente si memoria va fi rezervata din start.

#6
neagu_laurentiu

neagu_laurentiu

    Guru Member

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

 vali38, on 25th June 2010, 19:56, said:

de ce optam pentru pointeri si sa nu folosim programarea in stil clasic ?
"Clasic" inseamna ca alocarea se face pe stiva. Stiva nu-i memoria calculatorului. Tu vrei sa aloci in memoria mare a calculatorului.

#7
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005

 dani.user, on 25th June 2010, 20:09, said:

Un exemplu, vrei sa faci o lista simplu inlantuita.
Vei stoca fiecare element in memorie si fiecare element va contine adresa spre urmatorul. Ca sa parcurgi lista si sa citesti informatia din ea n-o sa ai nevoie decat de un pointer la memoria unde incepe primul element si de acolo mergi din aproape in aproape, nu ti cate o variabila pentru fiecare element.

imi poti arata un exemplu si care este diferenta ?

 webulxpert, on 25th June 2010, 20:31, said:

iar fata de un vector, o lista are dimensiune varibila (chiar daca in Java exista vectori cu dimensiuni varibile), si lista inlantuita ocupa atatea memorie cate elemente ai, un vector cand va fi initializat va avea un numar fix de elemente si memoria va fi rezervata din start.

imi poti explica ce se intampla un cazurile urmatoare ?
int a[100000];
si
int *a;
in primul caz, vectorul meu va ocupa memoria pentru cele 100000 de pozitii ?
in cazul al doilea, memoria va fi ocupata in timp ce completez vectorul ? completarea este corescta daca o fac in felul acesta: a[1520]=12349 ?

 neagu_laurentiu, on 25th June 2010, 20:42, said:

"Clasic" inseamna ca alocarea se face pe stiva. Stiva nu-i memoria calculatorului. Tu vrei sa aloci in memoria mare a calculatorului.
ce e stiva la care te referi ? eu de stiva nu am auzit decat in liceu

#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
In primul caz memoria se aloca pe stiva, care e limitata (deobicei cativa MB).
In al doilea caz, cu int *a tu doar aloci 4 bytes pentru o variabila de tip pointer. Ca sa faci un vector de exemplu trebuie sa-i aloci memorie. Sa zicem ca vrei pentru 100 de elemente:
int *a = (int*)malloc(100*sizeof(int));
Dupa ce umplii aceste 100 de elemente, s-ar putea sa mai vrei sa introduci inca 500. Ce faci? Aloci o bucata mai mare de memorie pentru 100+500=600 elemente si copiezi primul bloc de 100 de elemente la inceputul blocului nou alocat. Neaparat sa golesti memoria alocata initial pentru 100 de elemente.
int *b = (int*)malloc(600*sizeof(int));
memcpy(b,a,100*sizeof(int));
free(a);
a = b;

Edited by dani.user, 26 June 2010 - 12:09.


#9
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,603
  • Înscris: 30.07.2003
Dar e posibil sa nu poti gasi o zona continua de memorie unde sa-ti incapa cele 600 elemente (unele langa altele). In schimb ai zone de memorie, dispersate, ce ar putea stoca acele elemente (nu-s unele langa altele). Exact aici lista aia inlantuita e utila. Ea stocheaza toate elementele, dar nu pune conditia ca memoria sa fie un bloc continuu, unitar.

600 e de exemplu. Vorbim de o cantitate mult mai mare.

Edited by neagu_laurentiu, 26 June 2010 - 13:18.


#10
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
asta inseamna ca voi putea stoca in memorie pana aceasta se va umple ?

#11
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,603
  • Înscris: 30.07.2003
Da. Insa limita disponibila tie, sub Windows pe 32 biti (x86), e de 2Gb per program (3Gb dupa mici modificari in sistem).

#12
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
legat de memorie. am incercat sa execut codul urmator si cand memoria se umple aproape 47% se opreste si imi apare "segmentation fault". sistemul de operare este ubuntu. problema vine din partea OS ?
int main(){
	int *a=(int*)malloc(99999999999*sizeof(int));
	for(int i=1;i<=99999999999;i++){
		a[i]=i;
	}
	cout<<"ok";
	return 0;
}


#13
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
Un alt exemplu. Vrei sa deschizi o poza. Tu nu sti dinainte cat de mare va fi acea poza. Deschizi fisierul, citesti headerul, vezi ca poza e in format 3000x2000 la 24bit/pixel, aloci frumos 3000x2000x3 = 18000000 bytes memorie, si incepi sa citesti fiecare pixel si sa il stochezi in memorie.

Problema vine din partea ta ca vrei sa aloci multi gb de memorie (care nici nu incap intr-un numar intreg pe 32 bit)

Edited by dani.user, 26 June 2010 - 13:38.


#14
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,603
  • Înscris: 30.07.2003
Pai cat face 99999999999 * 4 si ce am zis eu de limita de 2Gb ?

#15
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
mi-am dat seama unde era problema. ca sa invat mai bine sa lucrez cu pointeri, ce mi-ati recomanda sa fac ?

#16
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,603
  • Înscris: 30.07.2003
Acum o sa intelegi de ce a aparut arhitectura pe 64 biti (limita e la 2 ^ 64) si cand e utila.

Eu zic ca sunt destule explicatii pe net, cu poze cu tot, despre pointeri.

char* p = (char* ) 0xFF78AD59;

Poti descrie ce face acel cod ?

#17
BNL

BNL

    Junior Member

  • Grup: Members
  • Posts: 83
  • Înscris: 27.10.2008

 vali38, on 25th June 2010, 18:56, said:

pana acum s-a tot discutat de pointeri insa eu nu reusesc sa ii inteleg, chiar si cu atatea materiale in fata
pentru intelegerea lor sigur m-ar ajuta foarte mult sa inteleg cand se folosesc si pentru ce ? pe langa asta vreau sa stiu de ce optam pentru pointeri si sa nu folosim programarea in stil clasic ?
Desi nu pare, raspunsul la intrebarile tale il gasesti in podcast-urile 235 si 237 (sunt realizate de Steve Gibson and Leo Laporte).

#18
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005

 neagu_laurentiu, on 26th June 2010, 14:52, said:

Acum o sa intelegi de ce a aparut arhitectura pe 64 biti (limita e la 2 ^ 64) si cand e utila.

Eu zic ca sunt destule explicatii pe net, cu poze cu tot, despre pointeri.

char* p = (char* ) 0xFF78AD59;

Poti descrie ce face acel cod ?
dupa parerea mea, pune in pointerul p de tip char adresa aceea care nu stiu ce reprezinta. daca e asa, nu inteleg de ce s-a mai pus * dupa operatorul de atribuire

Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

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