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 :

Tableau de pointeurs, pas de bêtises ?


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut Tableau de pointeurs, pas de bêtises ?
    Bonjour à tous,

    Je me permets de poster ce petit post, pour être sûr que je ne fais pas trop de bêtises sur mon ordinateur avec les pointeurs en fait !

    Alors voilà, en gros, je voudrais déplacer un personnage à l'écran. Dans l'idée, il s'agit de construire un tableau ( ici, pour mon exemple, un tableau statique ), tableau qui contiendra les mouvements à effectuer. En fait j'ai déjà fait mon petit algo de tracer de ligne ( l'algo de Bresenham que j'ai un peu modifié ) j'ai aussi réussi à "coder" un mouvement sur un char ( par exemple : déplace toi d'un pixel vers le haut = a, déplace toi d'un pixel en bas à droite : c... bref ! ) et donc là j'ai réussi à "coder" mon mouvement sur une string, ( c'est à dire à aligner les a, b, h, et d pour créer un mouvement ) mais je trouve ça un peu lourd, pas très propre, d'autant qu'après il faudra encore le temps de traduire le char en mouvement, et je sens que ça va pas être très fluide tout ça.

    Je me suis donc dit que j'allais créer un tableau de pointeurs ( pointeurs vers des entiers ), et tous ces pointeurs pointeraient vers 3 valeurs possibles : -1, 0 ou 1. On coderait un mouvement sur deux cases du tableau, par exemple si un tableau n'a que deux cases, comme ceci : {-1,-1} eh bien le personnage reculerait d'un pixel sur l'axe des x et d'un pixel sur l'axe des y ( encore que en SFML, il faudrait inverser les y, mais ça on n'y est pas encore ).

    Bref ! Venons en au but, si vous le voulez bien. J'ai écrit un code rapide, un tableau de 10 pointeurs ( 5 déplacements donc, puisque ça va par paire ), le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 <iostream>
     
    int positif=1;
    int negatif=-1;
    int nul=0;
     
    int main ()
    {
        int * Tableau[10] = {NULL};
     
        Tableau[0]=&positif;
        Tableau[1]=&positif;
        Tableau[2]=&negatif;
        Tableau[3]=&positif;
        Tableau[4]=&negatif;
        Tableau[5]=&negatif;
        Tableau[6]=&nul;
        Tableau[7]=&positif;
        Tableau[8]=&nul;
        Tableau[9]=&nul;
     
        for (int i=0; i<=9; i+=2) 
        {
            std::cout << (*Tableau[i]) << "," << (*Tableau[i+1]) << "\n";
        }
     
        return 0;
    }
    Et là surpriiiiise ça m'affiche :

    1,1
    -1,1
    -1,-1
    0,1
    0,0

    Oui oui, parfaitement, je n'aurais donc plus qu'à ajouter ces valeurs aux positions de mon perso, il et se déplacera gentiment, si je n'oublie pas un petit timer, MAIS... Je ne suis pas sûr de mon coup. Est ce qu'au début, lors de la déclaration du tableau, les pointeurs pointent effectivement vers la "case 0", enfin des pointeurs nuls quoi, ou est ce que j'aurais pas, sans faire exprès, modifié le mot de passe de mon ordi ou un truc du genre ? Pour ce cas de figure énoncé, je m'en rendrai compte au prochain démarrage, mais il peut y avoir des trucs bien plus tordus, je le sais bien.

    J'attends vos corrections, si corrections il doit y avoir !

    Mr Pchoun.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Hello

    Citation Envoyé par MrPchoun Voir le message
    Je me suis donc dit que j'allais créer un tableau de pointeurs ( pointeurs vers des entiers )
    Aucun intérêt : un pointeur prend autant de place en mémoire qu'un entier. Tu n'économiseras rien en faisant ça, tu ne feras que complexifier le code pour un gain nul.

    Citation Envoyé par MrPchoun Voir le message
    Est ce qu'au début, lors de la déclaration du tableau, les pointeurs pointent effectivement vers la "case 0", enfin des pointeurs nuls quoi
    Oui, c'est correct, grâce à = {NULL}.

    Citation Envoyé par MrPchoun Voir le message
    est ce que j'aurais pas, sans faire exprès, modifié le mot de passe de mon ordi ou un truc du genre ? Pour ce cas de figure énoncé, je m'en rendrai compte au prochain démarrage, mais il peut y avoir des trucs bien plus tordus, je le sais bien.
    N'aie pas peur, déjà tu ne touches qu'à la RAM, pas aux fichiers, et de plus, l'OS ne te laissera pas accéder à une plage de mémoire qui ne t'appartiens pas. Si tu fais n'importe quoi, comme déréférencer un pointeur qui n'est pas dans l'espace mémoire de ton processus, c'est le le plus souvent un segfault dans la face.

    Du reste, le code me semble correct pour ce que tu nous montres.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par MrPchoun Voir le message
    MAIS... Je ne suis pas sûr de mon coup. Est ce qu'au début, lors de la déclaration du tableau, les pointeurs pointent effectivement vers la "case 0", enfin des pointeurs nuls quoi
    J'en doute fort. À vérifier en debug.

    Tu devrais t'intéresser aux automates cellulaires et aux réseaux de Boltzmann.
    Avec des -1, 0, et 1, tu simules l'équation des ondes.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut
    Aucun intérêt : un pointeur prend autant de place en mémoire qu'un entier
    Ah ! Je ne savais pas. Enfin, t'es sûr ? Parce que je me disais, rien qu'une string qui fait 'cbaab' c'est quand même un peu lourd, alors que si on réserve trois int dans la mémoire et puis qu'on ne stocke que des pointeurs dans un tableau ça serait un peu plus "léger". Qu'est ce qui prend de la place dans la mémoire alors, pour le pointeur ? L'adresse ? J'en pose, des questions hein

    PS : Et merci pour la rapidité de ta réponse !

    @Oodini : Ah.. Bah du coup jsais plus trop là, j'étais fier de mon code mais je vais attendre d'autres réponses, pour voir. À tout hasard, comment on peut vérifier " en debug " ?

    Ça a l'air sympa tes histoires d'ondes et d'automates, je vais jeter un coup d'oeil. Enfin, pas sûr de comprendre hein

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Aucun intérêt : un pointeur prend autant de place en mémoire qu'un entier. Tu n'économiseras rien en faisant ça, tu ne feras que complexifier le code pour un gain nul.
    Il y aurait pu y avoir un intérêt s'il y a souhait de modifier la valeur de la cible des références après avoir créé le tableau.

    Mais il faut avouer que là...

  6. #6
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par MrPchoun Voir le message
    Ah ! Je ne savais pas. Enfin, t'es sûr ? Parce que je me disais, rien qu'une string qui fait 'cbaab' c'est quand même un peu lourd, alors que si on réserve trois int dans la mémoire et puis qu'on ne stocke que des pointeurs dans un tableau ça serait un peu plus "léger". Qu'est ce qui prend de la place dans la mémoire alors, pour le pointeur ? L'adresse ? J'en pose, des questions hein
    La taille d'un pointeur (quel que soit le type pointé) est sizeof(int*), 4 octets en 32 bits, 8 octets en 64 bits. Il faut bien stocker l'adresse.
    De même la taille d'un int est sizeof(int), généralement 4 octets sur système 32 et 64 bits.
    Donc au final tu risques juste de perdre en performance (déréférencements de pointeurs supplémentaires ?) et en RAM utilisée (si tu compiles en 64 bits).
    Sans compter le fait que l'utilisation de pointeurs est plus sujette aux erreurs.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut
    Hum... Ben à vrai dire mon choix d'utiliser des pointeurs n'est pas innocent, puisque le but final serait de créer une fonction "déplacement", qui prendrait x1, y1, x2 et y2 en paramètre et qui me retournerait.. Un tableau ! CE tableau. Mais j'ai cru comprendre que c'était un peu la galère de retourner un tableau, alors je me suis un peu lancé dans les pointeurs, au cas où.. Vous voyez

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Utilise un vecteur.

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par oodini Voir le message
    J'en doute fort. À vérifier en debug.
    Citation Envoyé par MrPchoun Voir le message
    @Oodini : Ah.. Bah du coup jsais plus trop là, j'étais fier de mon code mais je vais attendre d'autres réponses, pour voir. À tout hasard, comment on peut vérifier " en debug " ?
    Si si c'est certain, la preuve.

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut
    C'est ce que je compte faire à terme bien sûr, ne serait ce que pour pouvoir faire un mouvement qui ne soit pas limité par un nombre fixe ( enfin, un tableau dynamique quoi ).

    Mais est ce que tu veux dire que je peux créer une fonction qui prend des int en paramètre et qui retourne un vector ?

    @Jean Bernard : En fait j'ai un doute parce que si j'insère cette ligne juste après la déclaration de mon tableau :

    std::cout << &Tableau[0];

    ça m'affiche ceci en console :

    0x7fff5fbff0b0

    Du coup eu... Il y a quand même une adresse quoi. Ou alors j'ai rien compris, je m'y suis mis ce matin hein

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Je conseille toutefois d'initialiser avec nullptr, si c'est possible.

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut
    Hum, pas sûr que mon xcode de 2010 comprenne nullptr. On va voir ça

    Merci en tous cas à tous pour vos réponses, c'est toujours sympa de recevoir des conseils !

    Par contre.. On fait comment pour mettre une discussion en [RÉSOLU] ?

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par MrPchoun Voir le message
    Hum, pas sûr que mon xcode de 2010 comprenne nullptr.:
    nullptr c'est C++11 il me semble. XCode utilise GCC donc si ton GCC n'est pas trop vieux tu auras nullptr en activant C++11 (c'est juste un flag de compil). D'ailleurs si tu peux te mettre à C++11 directement, c'est mieux. Quoiqu'il en soit GCC est gratuit donc tu as forcément moyen de t'installer GCC en dernière version en utilisant ton vieux XCode.

    Citation Envoyé par MrPchoun Voir le message
    Par contre.. On fait comment pour mettre une discussion en [RÉSOLU] ?
    T'as un bouton en bas pour le faire

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Commençons par démistifier les pointeurs, d'abord...

    Un pointeur n'est jamais qu'une valeur numérique entière (non signée) comme une autre, à ceci près qu'elle permet de représenter une adresse mémoire.

    La taille d'un pointeur est donc déterminée de manière définitive pour une architecture donnée et utilise ... au moins une taille suffisante pour représenter l'ensemble des adresses mémoire accessibles par le système sur lequel l'application tourne.

    En gros, on peut dire que la taille d'un pointeur est de 4 bytes (32 bits) sur les architectures 32 bits et de 8 bytes (64 bits) sur les architecture 64 bits

    Que ce soit un pointeur sur un char ou sur une classe personnelle bourrée de membres diverse, la taille du pointeur restera toujours identique, car une adresse mémoire est toujours une adresse mémoire

    Lorsque tu écris un code comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << &Tableau[0];
    tu ne fais que prendre l'adresse du premier élément du tableau, ce qui fait que cela revient en somme au meme que si tu avais écrit
    et il est donc tout à fait normal que tu obtiennes une valeur proche de 0x7fff5fbff0b0 car cela implique que, sur ton système, une valeur codée sur 48 bits est susceptible de représenter l'ensemble des adresses accessibles par ton système (c'est un Mac, ca, non )

    En l'occurrence, utiliser un tableau de pointeur sur entier au d'un tableau d'entiers tout simple te fais sans doute perdre l'équivalent de deux bytes par pointeurs (vu qu'un int a classiquement une taille de 32 bits, quel que soit l'architecture )

    @oodini et jblecanard >>
    En fait, on ne peut absolument pas se fier aux valeurs que l'on observe éventuellement sous débuggeur au niveau des pointeurs car il n'est pas rare de constater que le débuggeur les initialise d'office à certaines valeurs particulière

    Cependant, les valeurs numériques sont sensées être initialisées à 0 si on ne leur donne pas de valeur par défaut.

    Dans le cas d'un pointeur, la valeur par défaut est donc normalement égale à NULL (ou nullptr), mais ce n'est pas forcément 0 pour la cause
    Citation Envoyé par MrPchoun Voir le message
    Hum, pas sûr que mon xcode de 2010 comprenne nullptr. On va voir ça

    Merci en tous cas à tous pour vos réponses, c'est toujours sympa de recevoir des conseils !

    Par contre.. On fait comment pour mettre une discussion en [RÉSOLU] ?
    on clique "simplement" sur le bouton que l'on trouve en bas de page
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Un pointeur n'est jamais qu'une valeur numérique entière (non signée) comme une autre, à ceci près qu'elle permet de représenter une adresse mémoire.
    Et à ceci près que lire un pointeur non initialisé peut mener à un plantage, contrairement à tout autre type de variable.

  16. #16
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par oodini Voir le message
    Et à ceci près que lire un pointeur non initialisé peut mener à un plantage, contrairement à tout autre type de variable.
    Un accès en lecture ne posera jamais d'autre problème que celui qui consiste à obtenir des informations incohérentes

    c'est l'accès en écriture qui risque réellement de faire du mal

    Maintenant, obtenir des informations incohérentes reste quelque chose d'assez désagréable, car cela peut simplement aller de l'obtention de quelque chose qui n'a rien à voir avec ce que l'on attend à l'affichage d'une grande partie de la mémoire, car on croit pointer sur une chaine de caractères et qu'on met du temps à croiser une valeur égale à '\0' qui serait considérée comme la fin de la chaine
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  17. #17
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut
    Merci Koala01 pour cette petite révision, ça ne fait jamais de mal Effectivement, moi qui pensait économiser de la RAM et du temps de calcul, ben pas trop en fait

    Du coup je me suis débrouillé autrement, sans pointeurs, jpeux vous poster mon code si ça vous intéresse. Il mériterait d'être optimisé mais l'essentiel est là

    C'était peut être pas le bon moment pour les pointeurs, je m'y remettrai quand j'en aurais vraiment besoin !

    Ah, et oui Koala11, jsuis sous mac ( nous, pauvres amoureux de la pomme, sommes persécutés par les vilains méchants programmeur de la fenêtre..... )

    Mr Pchoun.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tableau 100% fonctionne pas !
    Par sunshine33 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 27/12/2005, 14h23
  2. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  3. [GCC] Tableau de pointeurs pour accès multiples en asm
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 12/12/2005, 08h47
  4. tableau de pointeurs
    Par seal3 dans le forum C++
    Réponses: 7
    Dernier message: 01/11/2005, 20h51
  5. Tableau de pointeurs de fonctions
    Par Alp dans le forum C++
    Réponses: 7
    Dernier message: 29/10/2005, 13h19

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