Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
A fost lansat Ubuntu 24.04 LTS

Free streaming SkyShowtime

Skoda Fabia 1.0 TSI (110 CP)- 19 ...

Mezina familiei, Merida BigNine
 The Tattooist of Auschwitz (2024)

Se poate recupera numar de telefo...

Upgrade de la MacBook Pro M1 cu 8...

Ce tip de monitor am nevoie pt of...
 Resoftare camera supraveghere

Laptop Gaming

Cu ce va aparati de cainii agresi...

Nu imi platiti coletul cu cardul ...
 Exista vreun plan de terorizare p...

Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024
 

Variabile si constante

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

#19
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006
Cam rudimentar conceputa lectia.

Quote

O variabilă/constantă are o adresă în memorie. Şi cu ajutorul adresei putem altera conţinutul ei. Mai târziu vă voi spune  mai multe despre acest lucru. Până atunci ne vom folosi de numele variabilelor.
In C++, spre deosebire de C, o constanta nu este intotdeauna alocata, codul e optimizat de compilator astfel incat valoarea constantei e direct folosita (similar cu #define). Tot in C++, un obiect const e implicit local in fisierul de definitie. In cazul in care e nevoie de adresa constantei sau e folosita (prin extern) in alt fisier atunci i se aloca memorie obligatoriu.
O valoare const nu poate fi modificata direct. Prin conversii dubioase, compilatorul accepta expresii ce "modifica" un obiect const dar rezultatul e nedfinit.

#20
xalexx

xalexx

    Junior Member

  • Grup: Members
  • Posts: 123
  • Înscris: 18.07.2008

Quote

Așa că poți lucra cu pointeri chiar dacă pointează la diferite tipuri.

Gresit. Nu are sens sa lucrezi cu un pointer spre struct X (200 bytes) si cu altul la struct Y (39 bytes). Corupi memoria in majoritatea situatiilor.
Iar void * este un pointer generic care-ti ofera castarea(definesti reprezentarea in memorie) in siguranta la orice alt tip de pointer. Nu poti lucra direct cu un pointer generic.

Quote

In C++, spre deosebire de C, o constanta nu este intotdeauna alocata, codul e optimizat de compilator astfel incat valoarea constantei e direct folosita (similar cu #define)

As vrea sa-mi spui sursa citata. Este o diferenta foarte bine definia dintre 'static const' si #define in C++.
Elementele constante sunt stocate in functie de implementarea compilatorului. (e.g in zone read-only; GCC le pune in sectiunea segment text). Tot ce este non-preprocesor mananca resurse cand sunt definite.

Iar compilatorul NU iti va inlocui o constanta explicita (non-preprocesor) cu valoarea ei direct in cod masina la compile-time, pentru ca iti va da peste cap totul la run-time cand vei dori sa o accesezi.

Quote

in alt fisier atunci i se aloca memorie obligatoriu.

Te referi la scope-ul unei entitati (constanta, obiect etc.) probabil. Intr-un fisier nu se aloca memorie. Si daca este declarata extern, vei fi obligat sa o definesti (si implicit sa ii aloce resurse compilatorul) inainte de linkare sau sa o marchezi ca weak reference.

Edited by xalexx, 06 August 2013 - 13:28.


#21
neagu_laurentiu

neagu_laurentiu

    Guru Member

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

View Postxalexx, on 06 august 2013 - 13:07, said:

Gresit. Nu are sens sa lucrezi cu un pointer spre struct X (200 bytes) si cu altul la struct Y (39 bytes). Corupi memoria in majoritatea situatiilor.
Nu pricep ce corupi ! In plus exista si "alinierea alocarii".

View Postxalexx, on 06 august 2013 - 13:07, said:

Nu poti lucra direct cu un pointer generic.
Da, insa unii vor zice ca au gasit portita Posted Image :
void* p = (void*) new char[10];
memset(p, 123, 10);
...


Edited by neagu_laurentiu, 06 August 2013 - 13:24.


#22
MarianG

MarianG

    be that as it may

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

View Postpale_and_pale, on 06 august 2013 - 00:47, said:

De ce?
Ce relevanta avea pe cati biti este memorat un intreg atunci cand invatai despre scoaterea cifrelor sale?

este relevant sa stii unde sa te opresti, MAX_INT

View Postadrian93, on 06 august 2013 - 10:08, said:

Eu zic că putem memora și numere. Posted Image
daca este s-o arzi a nivel de bit lucrezi doar cu numere

#23
xalexx

xalexx

    Junior Member

  • Grup: Members
  • Posts: 123
  • Înscris: 18.07.2008

Quote

Da, insa unii vor zice ca au gasit portita Posted Image :
void* p = (void*) new char[10];
memset(p, 123, 10);
...

Ai voie sa memsetezi toata zona aia, pentru ca o ai alocata si ii cunosti si size-ul.
Ma refeream la faptul ca nu ai voie sa operezi pe el. (e.g p[0] va genera eroare pentru ca faci aritmetica pe pointer generic, si habar nu are compilatorul cum sa reprezinte asta).

#24
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006

View Postxalexx, on 06 august 2013 - 13:07, said:

As vrea sa-mi spui sursa citata. Este o diferenta foarte bine definia dintre 'static const' si #define in C++.
Elementele constante sunt stocate in functie de implementarea compilatorului. (e.g in zone read-only; GCC le pune in sectiunea segment text). Tot ce este non-preprocesor mananca resurse cand sunt definite.

Iar compilatorul NU iti va inlocui o constanta explicita (non-preprocesor) cu valoarea ei direct in cod masina la compile-time, pentru ca iti va da peste cap totul la run-time cand vei dori sa o accesezi.

Te referi la scope-ul unei entitati (constanta, obiect etc.) probabil. Intr-un fisier nu se aloca memorie. Si daca este declarata extern, vei fi obligat sa o definesti (si implicit sa ii aloce resurse compilatorul) inainte de linkare sau sa o marchezi ca weak reference.

Uite aici:

Quote

In C++, a const doesn’t necessarily create storage. In C a const always creates storage. Whether or not storage is reserved for a const in C++ depends on how it is used. In general, if a const is used simply to replace a name with a value (just as you would use a #define), then storage doesn’t have to be created for the const. If no storage is created (this depends on the complexity of the data type and the sophistication of the compiler), the values may be folded into the code for greater efficiency after type checking, not before, as with #define. If, however, you take an address of a const (even unknowingly, by passing it to a function that takes a reference argument) or you define it as extern, then storage is created for the const.
In C++, a const that is outside all functions has file scope (i.e., it is invisible outside the file). That is, it defaults to internal linkage.

Implicit, const e static in C++. Normal ca static, const sunt chestiuni diferite de #define. Dar in C++ compilatorului chiar ii e permis si indicat sa inlocuiasca un const (de tip built-in) in cazurile de utilizare normala.

Ce ai vrut sa spui ca in fisier nu se aloca memorie?

#25
neagu_laurentiu

neagu_laurentiu

    Guru Member

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

View Postxalexx, on 06 august 2013 - 13:39, said:

Ai voie sa memsetezi toata zona aia, pentru ca o ai alocata si ii cunosti si size-ul.
Ai voie pentru ca in functia memset e un cast la byte, codul ala l-am dat asa sa iasa din tipare afirmatia ta (care e adevarata).

#26
MrReason

MrReason

    Senior Member

  • Grup: Senior Members
  • Posts: 9,266
  • Înscris: 08.10.2010

View Postpale_and_pale, on 05 august 2013 - 21:34, said:

Evident că nu pot exista  variabile/constante cu acelaşi nume într-un program.
Try this out:

int x = 5;
{
int x = 10;
cout << x << endl;
}
cout << x;

:naughty:

Quote

În ele poate fi memorat practic orice diferă de numere. Litere simple : A, a, B, b ... etc. sau simboluri simple :  -,  ),  _,  /,... ş.a.m.d.
orice difera de numere? da' numerele ce au? :)

in fine... din exprimare sugerezi ca asa functioneaza calculatorul (cu variabile & stuff) insa asta tine strict de limbaj (calculatorul nu stie de tipuri int, char etc., el stocheaza doar bytes [grupuri de 8 biti] si atat)...
parerea mea e ca e bine sa mai aprofundezi tu, inainte sa continui....

#27
adrian93

adrian93

    Active Member

  • Grup: Members
  • Posts: 1,740
  • Înscris: 29.10.2009

View Postneagu_laurentiu, on 06 august 2013 - 12:27, said:

Quote

Evident că nu pot exista  variabile/constante cu același nume într-un program.
Povesti ! Insa merge si asa pt. nivelul cui te adresezi. Altfel sa citeasca literatura de specialitate scrisa de profesionisti.
Având în vedere că limbajul pe care îl va folosi pale în următoarele articole este C, eu zic că totuși, chiar și pentru un începător ar fi bine de precizat în continuare în articol că în C există scoping. Altfel s-ar putea să se bată unele lucruri ulterior cap în cap.

#28
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
Reprezentarea datelor
Stocarea șirurilor de caractere

#29
pale_and_pale

pale_and_pale

    Junior Member

  • Grup: Members
  • Posts: 187
  • Înscris: 11.07.2012
In multe dintre urmatoarele articole voi folosi pseudocodul, C-ul va fi prezentat mai spre final.

@MrReason te invit sa-i explici unui pusti de a 9-a care este diferenta dintre o variabila globala si una locala, cand nici n-a inceput sa faca exercitii in pseudocod .

Sau sa citesti ceea ce au raspuns altii inaintea ta inainte de a-ti forma o parere :

View Postpale_and_pale, on 05 august 2013 - 23:05, said:

@
Hei, eu am scris cu erori tocmai pentru simplitate. Asta nu inseamna ca nu ma pricep. Scopul nu este sa ii invat cum sunt memorate de fapt valorile, ci ce sa faca cu ele.
.
.
.
Binenteles ca aveam sa "repar" erorile inainte de a face trecerea de la pseudocod la limbaj.

Motivul pentru care am ales C este ca printre cititori s-ar putea sa se afle elevi ai specializarii mate-info sau care sunt in gimnaziu dar vor alege aceasta specializare in viitor. De aceea nu e loc de limbaje high-level cum e Javascript aici.

DAR limbajul il prezint mai tarziu, dupa cum am spus in topicul de introducere. Mai intai va fi pseudocodul, pentru ca tehnicalitatile limbajului + regulile de sintaxa nu vor constitui decat o distragere. Atentia NU trebuie concentrata pe aceste lucruri ACUM.
Cand am spus ca voi face astfel incat trecerea de la pseudocod la limbaj sa fie usoara m-am referit la faptul ca voi construi regulile pseudocodului sa fie similare cat de cat cu cele ale C-ului. Mai e nevoie sa  justific proprietatile variabilelor?

REPET, momentan nu este necesar sa stie despre adevarata reprezentare a datelor in calculator. Vor asimila aceste lucruri si multe altele mai tarziu si mai usor, cu o gandire ordonata si bine definita, motiv pentru care am inceput seria de articole.

Dar hei, multumesc pentru criticle !constructive si pentru ca !(v-ati abtinut de la mistouri) Posted Image, unii. Daca eu de fapt prostesc mai tare cititorii atunci luati initiativa fratilor si propuneti articole noi care sa-mi inlocuiasca aberatiile !

Edited by pale_and_pale, 06 August 2013 - 20:23.


#30
Paullik

Paullik

    Active Member

  • Grup: Members
  • Posts: 1,760
  • Înscris: 05.07.2008

View Postpale_and_pale, on 06 august 2013 - 20:19, said:

Dar hei, multumesc pentru criticle !constructive si pentru ca !(v-ati abtinut de la mistouri) Posted Image, unii. Daca eu de fapt prostesc mai tare cititorii atunci luati initiativa fratilor si propuneti articole noi care sa-mi inlocuiasca aberatiile !
Stai tu acolo linistit si continua munca, ca e de bine, mult mai bine decat alte topicuri create pe forum(uri).
Mai ales ca in fiecare zi apare cate un subiect unde lumea nu stie minimul de bun simt si se apuca de programare sarind direct in mijlocul lacului.

Cine citeste chestii pe net ar trebui deja sa stie (ca deh, suntem in 2013) ca articolele pot contine erori, asta e, suntem oameni.

#31
neagu_laurentiu

neagu_laurentiu

    Guru Member

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

View Postpale_and_pale, on 06 august 2013 - 20:19, said:

Daca eu de fapt prostesc mai tare cititorii atunci luati initiativa fratilor si propuneti articole noi care sa-mi inlocuiasca aberatiile !
Cand scrii ceva ca altii sa ia de bun inseamna sa constientizezi ca ai responsabilitate mare. Nu am ce initiativa sa iau ca nu ma cred profesor si nici goluri in literatura de specialitate nu exista.

Edited by neagu_laurentiu, 06 August 2013 - 21:33.


#32
sergiu37

sergiu37

    Member

  • Grup: Members
  • Posts: 328
  • Înscris: 13.11.2006
Dacă nu vrei Javascript nu vrei și gata.
Dar Javascript e unul din cele mai apropiate limbaje de pseudocod. Adică ambele sunt high-level. Și unii chiar ar putea aduce argumente solide cum că ar fi mai ușor să înveți Javascript decât C/C++. (am zis mai ușor, nu mai util sau mai frumos sau mai plăcut)

#33
pale_and_pale

pale_and_pale

    Junior Member

  • Grup: Members
  • Posts: 187
  • Înscris: 11.07.2012

View Postsergiu37, on 06 august 2013 - 22:12, said:

Dacă nu vrei Javascript nu vrei și gata.
Dar Javascript e unul din cele mai apropiate limbaje de pseudocod. Adică ambele sunt high-level. Și unii chiar ar putea aduce argumente solide cum că ar fi mai ușor să înveți Javascript decât C/C++. (am zis mai ușor, nu mai util sau mai frumos sau mai plăcut)
Am citit opinii in care se spunea ca si Python e mai usor pentru incepatori. Python insa nu se invata in licee si nici Javascript.
E adevarat ca las deoparte Pascal, dar conceptele pot fi aplicate cu minim efort si acolo.

Anunturi

Chirurgia cranio-cerebrală minim invazivă 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

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