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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Pointeur de tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut Pointeur de tableau
    Bonjour,

    Je voulais faire un pointeur de tableau de "Symbol", qui sont une structure que j'ai créé, en C, comme le tutoriel de CGI. Ca ne marche mal . Le tuto est de 2005, trop vieux? J'ai fait une erreur? Où peut-on trouver plus d'informations?

    int bit[1288];
    Symbol **symbSlot;
    Symbol symbSlot1[34][8];
    Symbol symbSlot2[34][8];

    //Plus loin dans le main je dis:

    symbSlot=symbSlot1;
    Warning: Incompatible assignement !

    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    symbSlot1 n'est pas un Symbol **, absolument pas.
    symbSlot1 est un tableau.
    Donc, si il n'est pas opérande de sizeof ou de & (adresse de), il représente l'adresse du premier élément du tableau, et donc il est du type "adresse d'un élément du tableau". Comme les éléments de ce tableau sont des tableaux de 8 Symbol, Symbol[8], alors symbSlot1 est, dans ce contexte, du type "adresse d'un tableau de 8 Symbol" soit Symbol (*)[8] (avec les parenthèses obligatoires)

    Ainsi si on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Symbol (*symbSlot)[8];
    Symbol symbSlot1[34][8];
    // On peuut écrire sans problème 
    symbSlot=symbSlot1;
    Un Symbol ** ne correspond pas du tout à un tableau 2D d'éléments Symbol. Il correspond à un tableau de pointeurs sur Symbol donc constitué d'éléments Symbol*.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Poutrator Voir le message
    Bonjour,

    Je voulais faire un pointeur de tableau de "Symbol", qui sont une structure que j'ai créé, en C, comme le tutoriel de CGI. Ca ne marche mal . Le tuto est de 2005, trop vieux? J'ai fait une erreur? Où peut-on trouver plus d'informations?



    Warning: Incompatible assignement !

    Merci d'avance !
    C'est en effet un problème classique du débutant qui vient de voir les pointeurs.
    Il a appris qu'un pointeur qui récupère l'adresse d'un élément de tableau (char tab[10]; char *pt=tab) peut ensuite être utilisé comme le tableau pendant que le tableau peut être utilisé comme un pointeur (pour taper dans le 4° élément, on peut aller indifféremment utiliser tab[3] ou pt[3] ou *(tab + 3) ou *(pt + 3)).
    Toutefois, malgré cette similitude, le pointeur n'est pas un tableau. Et l'équivalence *=[] ne fonctionne que pour les tableaux en 1D. En 2D et au delà, ça ne fonctionne plus.

    La raison est très simple: un tableau 2D n'est que simulé. Derrière, le compilo le retraduit en tableau 1D.
    Exemple: char tab[lig][col]
    Ce tableau, au niveau machine, n'est qu'une longue suite de cases. Et pour aller taper dans la case tab[x][y], le compilo devra calculer sa vrai position qui est x * col + y. Il a donc besoin de connaitre la largeur du tableau pour s'y retrouver.

    Si maintenant tu écris char **pt=tab et même si tu forces l'affectation, ben ça te sert pas à grand chose car tu pourras pas aller voir pt[x][y], le compilo ne connaissant pas la largeur de pt (il est pas assez malin pour faire le lien entre pt et tab).

    Faut bien savoir que certaines choses qu'on te dit au début ne sont pas forcément 100% exactes. Les profs qui t'enseignent essayent de simplifier certains concepts pour qu'il soient plus facilement compréhensibles mais la simplification implique une perte de rigueur. Et inversement, si tu cherches à étendre le concept simplifié vers un niveau supplémentaire (comme passer de 1D en 2D), même si la démarche est logique elle peut ne pas fonctionner justement à cause de cette perte de rigueur initiale qui est maintenant devenue nécessaire...

    Grosso-modo, tu peux remplacer [] par * uniquement pour la dernière dimension d'un tableau
    Exemple
    char tab[10]; char *pt=tab;
    char tab[10][20]; char (*pt)[20]=tab;
    char tab[10][20][30]; char (*pt)[20][30]=tab;

    PS: essaye de nommer tes types "t_qqchose". Tu t'y retrouveras mieux ensuite pour faire la différence entre type et variable...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  2. Accès le plus rapide: Pointeur ou tableau?
    Par homeostasie dans le forum C
    Réponses: 21
    Dernier message: 01/09/2006, 14h08
  3. [VB.NET] Pointeur vers tableau
    Par b_lob dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/08/2006, 16h06
  4. convertion pointeur vers tableau
    Par gdpasmini dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2006, 00h34
  5. Pointeur et TAbleau
    Par melmouj dans le forum C
    Réponses: 20
    Dernier message: 25/09/2005, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo