Chirurgia cranio-cerebrală minim invazivă
Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne. Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale. www.neurohope.ro |
Referințele în C++
Last Updated: Jun 03 2016 12:52, Started by
TheOriginals
, May 30 2016 16:42
·
0
#1
Posted 30 May 2016 - 16:42
Salut,
Aș avea și eu o întrebare la referințele din C++. Am exemplul ăsta care nu face nimic și are doar rol demonstrativ: int max(int&a) { int x=12; x = a; return a; }Din ce știu eu dacă am 2 int-uri(int a=1,int b=0) dacă faci a=b se copie valoarea și nu are nici o legătură cu adresa. Aș avea 2 întrebări mai importante pentru mine ca să zic așa : 1. Dacă x este int si a este int& de ce mă lasă să le egalez? 2. Referința este un alias, 2 entități care țintesc aceiași adresă, ce modifici în una se regăsește și în cealalată, deci care ar fi utilitatea referinței? 3.De ce aș avea nevoie de 2 entități care referă aceiași zonă de memorie? Am întâlnit exemple de genul: class complexType { public: void getComplex(double& real, double& imag) const; private: double realPart; //variable to store the real part double imaginaryPart; //variable to store the imaginary part }; //mod 1 de utilizare void complexType::getComplex(double & real, double & imag) const { real = realPart; imag = imaginaryPart; } //mod 2 de utilizare void complexType::getComplex(double real, double imag) const { real = realPart; imag = imaginaryPart; }4.Este vreo diferență de utilizare între modul 1 și 2 sau vreun avantaj anume? Eu de obicei când făcem get și set îi foloseam normal fără referință. |
#2
Posted 30 May 2016 - 17:12
Referinta e un alias.
Exemplele tale produc confuzie pt ca nu ilustreaza rolul practic al referintelor ci doar cum le-ai putea folosi. Rolul lor initial a fost sa optimizeze/simplifice utilizarea pointerilor. Astea-s doar niste idei simple, chestiunea e ceva mai complexa, mai ales dupa aparitia referintelor rvalue. Pt inceput incearca sa intelegi ce-i o referinta simpla si cu ce te ajuta. Edited by andreim77, 30 May 2016 - 17:16. |
#3
Posted 30 May 2016 - 17:44
Păi tocmai asta nu înţeleg...ce am citit pe net doar spune ce este o referinţă, că este un alias dar nu am găsit nimic care să-mi lămurescă ideiile de mai sus.
|
#4
Posted 30 May 2016 - 18:32
#5
Posted 30 May 2016 - 18:44
Da...o adresă de memorie.Valoarea unui pointer e o adresă, când îl citeşti să zicem cu * afişează valoarea adresei pe care o conţine.
Din ce am citit cred că am înţeles mai bine la ce sunt bine... nu "obosesc" stiva ca să zic aşa...dar tot nu mi-e clar cum să o provesc. "Returnează" o adresă sau o valoare. Adică declari obiectul prin referinţă, îi face alias-ul iar apoi o poţi trata ca un obiect normal? Nu e o adresă, nu o să aibă nevoie de operatorul " * " pentru a-i afişa valoarea? Asta nu mi-e prea clar. |
#6
Posted 30 May 2016 - 18:53
De ce nu scrii tu frumusel cod pentru teoriile pe care le ai, pentru a vedea practic ce se intampla?
Ia formuleaza o singura intrebare / teorie, sa scriem un cod pentru a o verifica / a afla raspunsul. Asta e frumos la programare: e foarte usor sa faci experimente, pentru a afla adevarul, prin deductii logice. O referinta este un pointer constant, careia compilatorul ii aplica automat operatorul de derefentiere. |
#7
Posted 30 May 2016 - 19:00
Crede-mă că asta fac...nu ai vrea să vezi cum arată proiectul din visual stdio.Am înţeles cum merge însă nu îmi este clar ce returnează o referinţă.
O referinţă creează un alias spre o variabila (pentru a 10-a oara ) ) deci e o adresă. De ce îmi dă voie să o egalez cu o variabilă (ex int a) dacă una e int si una e int&. Asta ar merge numai dacă & e pus doar pt a şti compilatorul să-i facă un alias la variabila dar defapt acolo să fie tot valori şi nu adrese. |
#8
Posted 30 May 2016 - 19:12
O referinta nu returneaza nimic.
"A returna" este un verb, iar un verb nu poate fi "executat" decat de instructiuni...well, executabile. O functie, o metoda, un apel, astea returneaza ceva. O referinta este o variabila, un pointer este si el tot o variabila. O variabila, de oricare ar fi ea, doar contine informatii. Ea nu face nimic, ci asteapta ca altii sa faca ceva cu ea. Thefake_fake_fake, on 30 mai 2016 - 19:00, said: De ce îmi dă voie să o egalez cu o variabilă (ex int a) dacă una e int si una e int&. Insa indiferent de situatia, trebuie sa inveti sa citesti cod. Noi ca programatori, cand ne exprimam, o facem "pe scurtatura", desi ne referim la lucrul corect. De exemplu, acest cod: int a; int b; b = a; se citeste: 1. aloca static un bloc de memorie de marime sizeof(int) la o adresa (decizia locatiei o ia compilatorul la compilare, d-aia se numeste "static") 2. aloca static un al doilea bloc de memorie de marime sizeof(int) la o adresa (decizia locatiei o ia compilatorul la compilare, d-aia se numeste "static") 3. copiaza valoarea aflata la locatia de memorie a lui a in locatia de memorie aflata la adresa lui b, deci in "pseudocod" vorbind, compilatorul genereaza cod de genul: &b = *a In assembler, ai spune: copiaza valoarea lui a la locatia locatia lui b. Niciunde, nicicum, nu se spune "egaleaza". Nu exista "a egala", exista a copia sau a muta. Daca faci o statistica a instructiunilor executate de CPU, cea mai folosita instructiune e mutarea datelor de colo colo. |
#9
Posted 30 May 2016 - 19:59
Scuză-mi exprimarea.
Referitor la exemplul cu int şi int& ar fi ceva cam pe aici: int max(int&a) { int x=12; x = a; return a; }Ştiu că ce e mai sus nu e ok din mai multe puncte de vedere dar să-l lăsam doar aşa ca exemplu. Dacă fac în main ceva de genul: int main() { int k=10; cout<<max(k); return 0; }Funcţionează, adică k e int, iar în funcţia max am un int&. Pe mine mai exact mă dezorientează modul de lucru cu o referinţă, adică trebuie să o tratez ca pe un pointer, o adresă de memorie sau e pur şi simplu o un alt nume pentru aceiasi valoare pe care o conţine variabila respectivă si îl pot folosi exact ca şi pe variabila referită. De exemplu, uite cam la ce mă gândesc şi functionează: int main() { int i = 3; int &p = i; p = 1;//tratez p-ul ca pe o variabilă normala cu toate că ea este o referinţă(o adresă din memorie) cout << p; getchar(); return 0; }Şi mai e aici: int &p = i;Aici în p o să se copie adresa lui i, nu-i aşa? Edited by TheOriginals, 30 May 2016 - 20:01. |
#10
Posted 30 May 2016 - 20:32
In exemplul tau nu folosesti in niciun fel referinta la potentialul ei maxim. De fapt, ignori complet faptul ca e referinta.
Uite un astfel de cod subliniaza faptul ca referinta e referinta: 1 #include <iostream> 2 3 void max(int& a) { 4 if (a < 12) { 5 a = 12; 6 } 7 } 8 9 int main() { 10 int k = 13; 11 max(k); 12 std::cout << k; 13 return 0; 14 } Edited by OriginalCopy, 30 May 2016 - 20:33. |
|
#11
Posted 30 May 2016 - 20:57
Thefake_fake_fake, on 30 mai 2016 - 19:59, said:
Pe mine mai exact mă dezorientează modul de lucru cu o referinţă, adică trebuie să o tratez ca pe un pointer, o adresă de memorie sau e pur şi simplu o un alt nume pentru aceiasi valoare pe care o conţine variabila respectivă si îl pot folosi exact ca şi pe variabila referită. Faptul ca e pointer (sau, in extenso, referinta) e un detaliu aditional. Un pointer sau o referinta este in primul rand variabila, apoi si pointer sau referinta. Pe tine te deruteaza faptul ca orice variabila e tratata cand ca valoare, cand ca adresa. De exemplu: int a; a = a; a-ul din partea dreapta a egalului se refera la valoarea variabilei a. a-ul din stanga egalului se refera la adresa variabilei a. Asta e esenta exemplului meu anterior: OriginalCopy, on 30 mai 2016 - 19:12, said:
De exemplu, acest cod: int a; int b; b = a; se citeste: 1. aloca static un bloc de memorie de marime sizeof(int) la o adresa (decizia locatiei o ia compilatorul la compilare, d-aia se numeste "static") 2. aloca static un al doilea bloc de memorie de marime sizeof(int) la o adresa (decizia locatiei o ia compilatorul la compilare, d-aia se numeste "static") 3. copiaza valoarea aflata la locatia de memorie a lui a in locatia de memorie aflata la adresa lui b, deci in "pseudocod" vorbind, compilatorul genereaza cod de genul: &b = *a In assembler, ai spune: copiaza valoarea lui a la locatia locatia lui b. Niciunde, nicicum, nu se spune "egaleaza". Nu exista "a egala", exista a copia sau a muta. Daca faci o statistica a instructiunilor executate de CPU, cea mai folosita instructiune e mutarea datelor de colo colo. fie codul: int* p; int a; p = &a; Intrebare de intelegere: care e adresa pointerului p? |
#12
Posted 30 May 2016 - 21:11
Cu încă o chestie te mai stresez şi îţi dau pace (cred că te-am înebunit ) )
Tu spui : &b = *a Dacă îi pui & nu aşteaptă o adresă adică ceva gen (0xa7ef45ae) şi tu îi dau o valoare *a. Sau el modifică direct conţinutul variabilei referite de b cu valoarea lui a? |
#13
Posted 30 May 2016 - 21:18
OriginalCopy, on 30 mai 2016 - 19:12, said:
deci in "pseudocod" vorbind, compilatorul genereaza cod de genul Citeste cu atentie toata fraza. Si da, genereaza o adresa, e o adresa stabilita static de compilator, e fixa. Si apoi instructiunea se numeste ceva de genul MOVE 0xa7ef45ae, 10 "muta valoarea 10 la adresa 0xa7ef45ae" |
#14
Posted 30 May 2016 - 21:43
Ok, hai că m-am lămurit in cele din urmă, am făcut un exemplu aici în caz că mai e cinevă nelămurit
//head class test { private: char *nume,*pre; int a, b; public: void setChar( char *&nume,char *&pre); char* getChar(); }; //metode void test::setChar( char *& nume, char *& pre) { this->nume = new char[strlen(nume) + 1]; this->pre = new char[strlen(pre)+1]; strcpy_s(this->nume,strlen(nume)+1,nume); strcpy_s(this->pre, strlen(pre) + 1, pre); } char * test::getChar() { return nume; } int main() { test t; t.setInt(1, 2); char *n = "soft"; char *p = "originalCopy :D"; cout << "Int aici :" << t.get() << endl; t.setChar(n, p); cout << "Char aici : " << t.getChar(); return 0; }Deci în concuzie o referinţă e:
Multumesc încă o dată. Edited by TheOriginals, 30 May 2016 - 21:43. |
#15
Posted 31 May 2016 - 10:11
valeu, ai trecut la referinte la pointeri esti tare. f rar mi-a fost dat sa vad cod scris asa. nu ca ar fi gresit (programatic) dar in 99.99% din cazuri e inutil si posibil sa nici nu functioneze cum te astepti chiar daca se compileaza.
parerea mea e ca ai ceva lacune in ce priveste teoria limbajelor de programare, a tipurilor de date, structurarea si manevrarea lor in memoria calculatorului, felum cum se compileaza, leaga, incarca si executa programele. dar e bine ca perseverezi. |
|
#16
Posted 31 May 2016 - 10:23
andreim77, on 31 mai 2016 - 10:11, said:
valeu, ai trecut la referinte la pointeri esti tare. f rar mi-a fost dat sa vad cod scris asa. nu ca ar fi gresit (programatic) dar in 99.99% din cazuri e inutil si posibil sa nici nu functioneze cum te astepti chiar daca se compileaza. parerea mea e ca ai ceva lacune in ce priveste teoria limbajelor de programare, a tipurilor de date, structurarea si manevrarea lor in memoria calculatorului, felum cum se compileaza, leaga, incarca si executa programele. dar e bine ca perseverezi. Îi tot trag cu pointerii pentru că un pointer ţine o adresă, la o referinţă îi modific adresă şi de asta le mai combin ).Acum îmi e mai clar. Doar că tot citind am mai dat peste o chestie şi anume scanf-ul din C. Din ce ştiu eu în C nu există referinţe dar totuşi se foloseşte &valoare. În C "&" are alt rol decât cel de referenţiere? Aici mă refer de exemplu la citirea dimensiunii unui vector de exemplu. #include<stdio.h> int main() { int i, arr[50], num; printf("\nEnter no of elements :"); scanf("%d", &num); //Reading values into Array printf("\nEnter the values :"); for (i = 0; i < num; i++) { scanf("%d", &arr[i]); } //Printing of all elements of array for (i = 0; i < num; i++) { printf("\narr[%d] = %d", i, arr[i]); } return (0); } Edited by TheOriginals, 31 May 2016 - 10:30. |
#17
Posted 31 May 2016 - 10:41
eh, tre sa le iei pas cu pas, operatorul & are mai multe roluri atat in c++ cat si in c. e usor sa le amesteci, ca incepator concentreaza-te pe un singur limbaj. multi (majoritatea) recomanda sa incepi cu C din diverse motive. un limbaj de programare e independent asa ca daca incepi cu c++ e f bine, concentreza-te doar pe el, lasa ce e in C. dar sa stii ca e mult mai greu C++, poate cel mai greu limbaj de programare de nivel inalt.
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users