» Utilizator
Salut, vizitatorule!

SkullBox este o comunitate formata din programatori si administratori de sisteme sau retele care iti sta la dispozitie cand ai o problema legata de calculatoare. Daca esti un utilizator existent, autentifica-te.

Daca nu te-ai inregistrat inca pe forum, alatura-te noua astfel marind comunitatea si ajutandu-i pe cei care au nevoie de informatii.

Daca te-ai inregistrat dar inca nu ai primit codul de activare, il poti cere aici.




Autentifica-te cu numele de utilizator si parola pentru a putea posta pe forum sau pentru a accesa ariile disponibile doar utilizatorilor inregistrati.
» Promovam
» Parteneri » Statistici
  • 59624 de mesaje.
  • 7135 de topicuri.
  • 987 de utilizatori.
  •  
  • sandaa e ultimul utilizator inregistrat.
[Detalii]

 
Pagini: [1]
Print
[Curs]C - Lectia 06 - Structuri [793 afisari]
redkar23
*


Mesaje: 164
OfflineOffline

WWW

M-am gandit sa scriu si un Index la aceasta lectie, ca sa stiti cam ce va asteapta Smile

      I.   Conceptul de structura
      II.  Declararea unei structuri
      III. Declararea variabilelor de tip structura
      IV.  Operatori pentru structuri
      V.   Un programel care foloseste ce am invatat in aceasta lectie
      VI.  Epilog Laughing

  I.Conceptul de structura

 
  Ca o introducere, ar trebui oarecum definit conceptul de structura in C Big grin
   
   Structura = O colectie de valori.
   Proprietati ale structurii :    
        - nu poate contine functii
        - nu poate contine variabile de tip void

 
 II.Declararea unei structuri
 
      -se face prin intermediul cuvantului cheie struct ( cuvant cheie = cuvant rezervat )
 
 
Quote
Forma generala
   struct {
        //declaratii de variabile;
        tip_variabila1 ;
        //..................................................
       tip_variabilaN ;
    } declarare_structura;
Deci, am invatat forma generala a structurii. Acum cateva observatii privind componentele acesteia:

     a)declarare_structura -  apartine declaratiei unei variabile de tip structura , vom vorbi imediat si despre aceasta:).

     b) si declarare_structura sunt componente optionale,dar nu simultan. Deci sau lipseste prima componenta sau ultima. Desigur, fiind optionale, exista si cazul in care ambele componente sunt prezente Smile

     c)La declararea structurii nu putem initializa nici o variabila din aceasta.
     d) Componenta tip_variabila poate fi orice tip existent in C , chiar si struct,  exceptie facand void .  
   Un exemplu in care declaram o structura
 
Quote
struct persoana {
      int varsta;
      char nume[30],prenume[30],ocupatie[30];
      }l
III.Declararea variabilelor de tip structura
 
     Variabilele de tip structura pot fi instante ale unei structuri sau pointeri catre o structura. Nu incep sa explic decat partea cu instantele unei structuri. Pointerii sunt acoperiti in alta lectie .

 
Quote
Forma generala
     
        nume_structura ;
Componenta declarare_structura este echivalentul declararii unei variabile de tip structura.Daca doar aceasta componenta este prezenta ,si nume_structura nu exista, structura este unica, si nu se pot creea instante ale acesteia.

Exemplu pentru structura definita mai sus
Quote
persoana var; // am definit o variabila var de tip persoana = instanta a structurii persoana
IV.Operatori pentru structuri

     a) Accesarea unui camp dintr-o structura
         - se face prin intermediul operatorului "." ( punct)
          Exemplu :
       
Quote
//Considerand variabila var de tip persoana ,putem accesa urmatoarele campuri
          var.varsta     // tip int  
          var.nume      //tip char
          var.prenume  // tip char
          var.ocupatie   // tip char

          Code Example :
           
            printf(" Nume si prenume : ");
            scanf("%s %s", &var.nume,&var.prenume);
              printf("Your full name is %s %s.\n",var.nume,var.prenume);
b)  operatorul & ( vezi exemplu deasupra )
    c)  operatorul sizeof - returneaza marimea in bytes a structurii
        Exemplu
       
Quote
printf("%d \n",sizeof(var)); // suma marimilor in memorie a campurilor acestei structuri
V. Un programel care foloseste ce am invatat in aceasta lectie

   
Code:
  #include
   
   struct persoana{
        struct {
            int zi,luna,an;
             }data_nasterii;
        struct {
            char nume[30],prenume[30];
            }name;
         char ocupatie[50];
        };

    persoana Record;
     
    int main(){
         printf("Inregistrare persoana\n");
         printf("Nume si prenume : ");
         scanf("%s %s",&Record.name.nume,&Record.name.prenume);
         printf("Data nasterii\n");
         printf("   Zi : ");scanf("%d",&Record.data_nasterii.zi);
         printf("   Luna :");scanf("%d",&Record.data_nasterii.luna);
         printf("   An : ");scanf("%d",&Record.data_nasterii.an);
         printf("Ocupatie : ");
         scanf("%s",&Record.ocupatie);
         
         write_record(Record); // functie care afiseaza continutul variabilei Record de tip structura
         return 0;
        }
Daca ati citit lectia, ar trebui sa stiti ce face codul Smile .

VI. Epilog

       Da. Deci epilog , deci The End, Game over . Laughing
       Sper ca a fost oarecum utila lectia. Ma astept la critici, chiar as fi bucuros sa ma completati sau sa ma corectati Big grin
   Cheers
Logged
27-03-2008, 17:05 Twitt ::
astan
*


Mesaje: 736
OfflineOffline


Cateva lucruri care merita adaugate:
- o structura poate contine pointeri la functii
- compilatorul poate introduce padding in interiorul structurii pentru a se asigura ca membrii structurii sunt aliniati
- pentru a afla usor offsetul in bytes al unui membru in cadrul structurii se poate folosi macroul "offsetof" declarat in stddef.h

Exemplu:
Code:
#include
#include

struct my_struct
{
char x;
int y;
short z;
long t;
};

int main()
{
struct my_struct str1 = {'a', 1, 2, 3L};
printf("Offset of field x in struct str1 is %x bytes\n", offsetof(struct my_struct, x));
printf("Offset of field y in struct str1 is %x bytes\n", offsetof(struct my_struct, y));
printf("Offset of field z in struct str1 is %x bytes\n", offsetof(struct my_struct, z));
printf("Offset of field t in struct str1 is %x bytes\n", offsetof(struct my_struct, t));
return 1;
}
Output-ul pe calculatorul meu (linux x86-64):

Offset of field x in struct str1 is 0 bytes
Offset of field y in struct str1 is 4 bytes
Offset of field z in struct str1 is 8 bytes
Offset of field t in struct str1 is 10 bytes

Precum se observa, offset-ul lui x este 0, evident pentru ca e primul membru al structurii (adresa primului membru al unei structuri e identica cu adresa structurii)
Offset-ul lui y este 4 bytes. Precum se observa, compilatorul a introdus un padding de 3 bytes dupa membrul x pentru a alinia adresa lui y la 4 bytes (pentru ca sizeof(int) = 4 pe masina mea)
Offset-urile lui z si t sunt evidente ...
Logged
27-03-2008, 23:57 Twitt ::
redkar23
*


Mesaje: 164
OfflineOffline

WWW

Mersi de completari Smile Intotdeauna cad bine informatii noi Big grin
 
  Cheers
Logged
28-03-2008, 18:45 Twitt ::
Reclama
VIP

Hosting

Mesaje: 25.90
OnlineOnline

WWW
 

   Pe ABCDomenii: 250MB spatiu + 20GB trafic + 5 subdomenii = 0.95 €
 
 

The problem with troubleshooting is that trouble shoots back.
Azi 
Pages: [1]
Print
SkullBox Forum  |  Development  |  Java / C / C++ / C# (Moderators: AnaKonD, astan)  |  Topic: [Curs]C - Lectia 06 - Structuri
Jump to: