UNIX,Linux,Retele,Programare

27 Mar 08 18:05

redkar23
Gamer
Locaţie: Timisoara
Înregistrat: 25 Mar 08
Mesaje: 151
Site web

[Curs]C - Lectia 06 - Structuri

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 lol

  I.Conceptul de structura


  Ca o introducere, ar trebui oarecum definit conceptul de structura in C big_smile
   
   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 )

Forma generala
   struct <nume_structura> {
        //declaratii de variabile;
        tip_variabila1 <nume_variabila1> ;
        //..................................................
       tip_variabilaN <nume_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)<nume_structura> 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

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 .

Forma generala
     
        nume_structura <nume_variabila>;

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

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 :
       

//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
       

printf("%d \n",sizeof(var)); // suma marimilor in memorie a campurilor acestei structuri

V. Un programel care foloseste ce am invatat in aceasta lectie

   

Cod:

   #include <stdio.h>
   
   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 . lol
       Sper ca a fost oarecum utila lectia. Ma astept la critici, chiar as fi bucuros sa ma completati sau sa ma corectati big_smile
   Cheers

Editat ultima oară de redkar23 (27 Mar 08 18:08)


http://tn3-1.deviantart.com/fs32/300W/i/2008/233/5/7/Boo_by_Redkar23.png
What doesn't kill you, makes you stronger .       - Friedrich Nietzsche
O noua definitie a ironiei : life itself .                 - Redkar23

Offline

 

28 Mar 08 00:57

astan
SkullBox user
Locaţie: Bucuresti
Înregistrat: 02 Mar 08
Mesaje: 213
Site web

Re: [Curs]C - Lectia 06 - Structuri

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:

Cod:

#include <stdio.h>
#include <stddef.h>

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

Editat ultima oară de astan (28 Mar 08 00:59)

Offline

 

28 Mar 08 19:45

redkar23
Gamer
Locaţie: Timisoara
Înregistrat: 25 Mar 08
Mesaje: 151
Site web

Re: [Curs]C - Lectia 06 - Structuri

Mersi de completari smile Intotdeauna cad bine informatii noi big_smile
 
  Cheers


http://tn3-1.deviantart.com/fs32/300W/i/2008/233/5/7/Boo_by_Redkar23.png
What doesn't kill you, makes you stronger .       - Friedrich Nietzsche
O noua definitie a ironiei : life itself .                 - Redkar23

Offline

 

» Press CTRL+ALT+DEL now for an IQ test

tutoriale,programare

Scuze de offtopic


Antet forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson



Ethical hacking and programming community