IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ CConsultez toutes les FAQ

Nombre d'auteurs : 35, nombre de questions : 194, dernière mise à jour : 18 février 2018  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de www.developpez.com et de l'expérience personnelle des auteurs.

Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci .

Sur ce, je vous souhaite une bonne lecture.

SommaireLes types et les variablesStructures et unions (7)
précédent sommaire suivant
 

Code c : Sélectionner tout
1
2
3
4
typedef struct { 
    int x; 
    int y; 
} POINT2D;
Ou :

Code c : Sélectionner tout
1
2
3
4
5
6
struct point2d_s { 
    int x; 
    int y; 
}; 
  
typedef struct point2d_s POINT2D;
Ou encore:

Code c : Sélectionner tout
1
2
3
4
typedef struct point2d_s { 
    int x; 
    int y; 
} POINT2D;

Mis à jour le 1er février 2003 gl LFE Melem

Une structure est composée de différents champs qui ne se chevauchent pas.

Code c : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
  
struct point_s { 
    int x; 
    int y; 
}; 
  
int main(void) 
{ 
    struct point_s A; 
  
    A.x = 1; 
    A.y = 2; 
  
    printf("A = (%d, %d)\n", A.x, A.y); 
  
    return 0; 
}
Une union est composée de différents champs qui se superposent ou, en d'autres termes, qui utilisent le même emplacement mémoire. Il n'est donc tout simplement pas possible d'utiliser tous ces champs en même temps.

Code c : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h> 
  
union duo_u { 
    int n; 
    double x; 
}; 
  
int main(void) 
{ 
    union duo_u d; 
  
    d.n = 1; 
  
    /* Nous avons sélectionné le champ n, nous devons utiliser ce champ     */ 
    /* et uniquement ce champ jusqu'à ce que nous n'en aurions plus besoin. */ 
  
    printf("d.n = %d\n", d.n); 
  
    d.n = 2; 
  
    printf("d.n = %d\n", d.n); 
  
    d.x = 3.0; 
  
    /* Nous avons sélectionné le champ x, nous devons utiliser ce champ     */ 
    /* et uniquement ce champ jusqu'à ce que nous n'en aurions plus besoin. */ 
  
    printf("d.x = %f\n", d.x); 
  
    d.x = 4.0; 
  
    printf("d.x = %f\n", d.x); 
  
    return 0; 
}
Comme nous pouvons le constater, les unions sont donc très pratiques pour économiser de la mémoire.

Mis à jour le 27 juillet 2008 gl LFE Melem

À cause des contraintes d'alignement imposées par certains processeurs. Certains processeurs imposent en effet qu'une donnée de type X doive se trouver en mémoire à une adresse respectant certains critères. Les champs d'une structure ne sont donc pas forcément adjacents !

Mis à jour le 2 mars 2003 Bob gl

En utilisant l'opérateur = ou la fonction memcpy (string.h).

Code c : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h> 
#include <string.h> 
  
struct personne_s { 
    char nom[21]; 
    int age; 
}; 
  
int main(void) 
{ 
    struct personne_s A, B, C; 
  
    strcpy(A.nom, "A"); 
    A.age = 26; 
  
    B = A; 
    memcpy(&C, &A, sizeof(C)); 
  
    printf("A.nom = %s\n", A.nom); 
    printf("A.age = %d\n", A.age); 
  
    printf("B.nom = %s\n", B.nom); 
    printf("B.age = %d\n", B.age); 
  
    printf("C.nom = %s\n", C.nom); 
    printf("C.age = %d\n", C.age); 
  
    return 0; 
}

Mis à jour le 23 mars 2009 Melem

L'opérateur == n'étant pas défini pour les structures, il faut faire une comparaison champ par champ. On ne peut pas non plus utiliser la fonction memcmp, car les champs d'une structure ne sont pas forcément adjacents comme les éléments d'un tableau par exemple. Les espaces créés entre les différents champs lorsqu'ils existent peuvent contenir des valeurs différentes même pour deux structures identiques or memcmp ne fait qu'une comparaison bit par bit des contenus des mémoires comparées. Elle ne peut donc être utilisée pour comparer des structures.

Mis à jour le 23 mars 2009 Melem

unsigned int i : <n>; est une déclaration qui ne peut figurer que dans la définition d'une structure et qui permet de créer un champ, ici i, dont la taille est spécifiée en bits. i est ce qu'on appelle en langage C un champ de bits.

Code C : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct test_s 
{ 
    unsigned int i : 1; 
    unsigned int j : 2; 
}; 
  
int main(void) 
{ 
    struct test_s s; 
  
    s.i = 0; /* À la fin de l'instruction, on aura s.i = 0 en binaire soit 0 en décimal. */ 
    s.i++; /* À la fin de l'instruction, on aura s.i = 1 en binaire soit 1 en décimal. */ 
    s.i++; /* À la fin de l'instruction, on aura s.i = 0 en binaire soit 0 en décimal. */ 
  
    s.j = 0; /* À la fin de l'instruction, on aura s.j = 00 en binaire soit 0 en décimal. */ 
    s.j++; /* À la fin de l'instruction, on aura s.j = 01 en binaire soit 1 en décimal. */ 
    s.j++; /* À la fin de l'instruction, on aura s.j = 10 en binaire soit 2 en décimal. */ 
    s.j++; /* À la fin de l'instruction, on aura s.j = 11 en binaire soit 3 en décimal. */ 
    s.j++; /* À la fin de l'instruction, on aura s.j = 00 en binaire soit 0 en décimal. */ 
  
    return 0; 
}
Chaque implémentation doit au moins supporter les types int et unsigned int dans la déclaration d'un champ de bits. Une implémentation particulière peut toutefois supporter également d'autres types.

Mis à jour le 15 mai 2003 nyal

Il arrive souvent qu'on ait besoin de charger le contenu d'un fichier dans une structure. Il n'existe bien évidemment pas de méthode universelle pour le faire, car ça dépend du type des champs de la structure ainsi que du format du fichier.

Prenons par exemple ce fichier texte avec des enregistrements de capteurs :

Code : Sélectionner tout
1
2
3
4
42-temp:21.3 
666-humidity:76 
01-temp:25.6 
72-ground:53
Chaque ligne est composée ainsi : [entier]-[chaine]:[flottant].
fscanf() est la fonction adaptée pour lire des données formatées depuis un fichier texte. Voici un code qui va lire toutes les lignes de ce fichier et les afficher :
Code c : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h> 
#include <stdlib.h> 
  
typedef struct 
{ 
    int id; 
    char nom[10]; 
    float valeur; 
} t_capteur; 
  
int main(void) 
{ 
    FILE* f = fopen("data.txt", "r"); 
    if (f==NULL) { 
        perror("fopen"); 
        return EXIT_FAILURE; 
    } 
  
    while (1) 
    { 
        t_capteur c = { 0, "", 0.0f }; 
        int compte = fscanf(f, "%d-%[^:]:%f\n", &c.id, c.nom, &c.valeur); 
  
        if (compte != 3) 
        { 
            /* 
             * fscanf() a échoué, les raisons possibles étant multiples : 
             * - la fin du fichier a été atteinte ; 
             * - la ligne n'était pas au format attendu ; 
             * - une erreur s'est produite lors de la lecture du fichier. 
             * Il faut regarder la valeur de retour de fscanf() ainsi que 
             * celles des fonctions feof() ou ferror() pour déterminer la 
             * raison exacte. 
             */ 
            break; 
        } 
        else 
        { 
            /* 
             * La lecture de l'enregistrement a réussi, on peut alors le traiter. 
             */ 
            printf("Capteur => %d %s = %f\n", c.id, c.nom, c.valeur); 
        } 
    } 
  
    fclose(f); 
}

Voici la sortie du programme dans la console :
Code : Sélectionner tout
1
2
3
4
Capteur => 42 temp = 21.299999 
Capteur => 666 humidity = 76.000000 
Capteur => 1 temp = 25.600000 
Capteur => 72 ground = 53.000000

Mis à jour le 2 janvier 2017 Bktero

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.