Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Futur Membre du Club
    Homme Profil pro cheloukhi belbeloukhi
    Inscrit en
    avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Nom : Homme cheloukhi belbeloukhi
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2008
    Messages : 48
    Points : 18
    Points
    18

    Par défaut Confusion affectation tableaux et structures en langage C

    Bonjour à tous,

    Je post cette discussion pour m’éclaircir sur un sujet qui me tracasse depuis longtemps.

    Je ne comprend pas pourquoi en langage C, on ne peut pas faire une affectation directe de deux tableaux, alors que contrairement avec les structures on peut, Sachant que les structures en C sont des sorte de tableau avec des éléments de différents type.

    Je m'explique :

    Prenons les déclarations suivantes :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
     
    int a [10];
    int b [10];
    typedef struct c;
    typdef struct d;
     
    c str_c
    d str_d;
    Je cherche à comprendre pourquoi on ne peut pas ecrire , alors que l'on peut écrire .

    Merci d'avance pour vos réponses.

    Cordialement,

  2. #2
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 12 539
    Points
    12 539

    Par défaut

    La raison est que si l'expression A désigne un tableau d'éléments de type T, alors l'évaluation de A donnera l'adresse du premier élément du tableau (donc sera du type T* et non pas T[]) sauf dans les deux cas suivants :

    1- A est opérande de l'opérateur unaire & (adresse de)

    2- A est opérande de l'opérateur unaire sizeof

    Dans tous les autres cas, la valeur de A sera donc l'adresse du premier élément du tableau et n'est pas un objet (ni pointeur ni tableau)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 653
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 653
    Points : 6 345
    Points
    6 345

    Par défaut

    Je ne comprend pas pourquoi en langage C, on ne peut pas faire une affectation directe de deux tableaux, alors que contrairement avec les structures on peut, Sachant que les structures en C sont des sorte de tableau avec des éléments de différents type
    Tout simplement parce que cette vision, bien que tentante, est totalement fausse !

    En effet, si tu déclares :
    , il est en fait très rare que l'utilisation de la variable tab soit un tableau. C'est en général un pointeur vers le premier élément du tableau (bien que tab soit vraiment un tableau, c'est bien la valeur évaluée qui est celle d'un pointeur !)

    En revanche, dans
    Code :
    struct monType maStruct;
    , maStruct est toujours une structure.

    De plus, un tableau est une simple succession en mémoire et de manière contiguë de plusieurs éléments du même type et te donne simplement un moyen commode d'y accéder. En revanche, les éléments d'une structure se suivent mais ne sont pas collés (il y a potentiellement des trous, remplis avec des bits de padding).

    Bref, la philosophie des 2 entités est très différentes, leur nature réelle aussi et donc leurs utilisations différent fatalement
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  4. #4
    Expert Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    23 926
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 23 926
    Points : 31 976
    Points
    31 976

    Par défaut

    Le plus déroutant, c'est qu'une structure contenant un tableau peut être affectée, et le tableau avec.

    À noter que "tableau de 10 int" reste un type: Si on demande l'adresse d'un tableau (&tab), le résultat sera de type "pointeur sur tableau de 10 int" (noté int (*)[10] au lieu de int[10]*)

    Le pointeur sur tableau de 10 int se déclare ainsi:
    Code C :
    1
    2
    3
    int tab[10];
    int (*ptr)[10];
    ptr = &tab;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •