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 :

[debutant] Pointeur non-initialisé ?


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [debutant] Pointeur non-initialisé ?
    Bonjour à tous.

    En résumé mon programme est un pacman basique.
    J'ai eu le problème lorsque j'ai ajouter une fonctionalité :
    l'étoile à manger disparaît aprés un temps défini.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
     
    #include <utility.h>
    #include <ansi_c.h>
    #include <time.h> 
     
    #define NBLIGNE 35     // Taille tableau
    #define NBCOLONNE 40   // Taille tableau
    #define ETOILE 10
    #define VIDE -1
    #define PLOUCMAN 1
    #define MUR -10
    #define NORD '8'
    #define SUD '2'
    #define EST '6'
    #define OUEST '4'
    #define TOUCHE_NORD_J1 '8'
    #define TOUCHE_SUD_J1 '2'
    #define TOUCHE_EST_J1 '6'
    #define TOUCHE_OUEST_J1 '4'	
    #define DELAI 3
    //====================================================================
    //                        Prototype fonction
    //====================================================================
      // affiche le tableau representant le terrain
      void AfficheTerrain(int Tab[NBLIGNE][NBCOLONNE], int nbligne, int nbcolonne);
      //effacer toutes les cases du tableau en passant en parametre le nombre de colonne et de ligne  
      void EffaceTerrain(int Tab[NBLIGNE][NBCOLONNE]);
      // afficher une étoile dans le tableau
      void NouvelleEtoile(int Tab[NBLIGNE][NBCOLONNE], int nbligne,int nbcolonne);
      // faire avancer le ploucman en passant en parametre le tableau l'adresse des lignes et des colonnes et 
      // la direction du ploucman
      int AvancePloucman(int Tab[NBLIGNE][NBCOLONNE],int *AdrL, int *AdrC,char dir, int nbligne, int nbcolonne);
      //Affiche le score
      void AfficheScore(int score);
      // controler le debordement en passant en parametre l'adresse des lignes et des colonnes  
      int SurLeTerrain(int *AdrL,int *AdrC,int nbligne, int nbcolonne);
      //Creer des mur sur le terrain
      void GenereTerrain(int Tab[NBLIGNE][NBCOLONNE],int NumTerrain,int nbcolonne,int nbligne);
      //Effacement de l'étoile précédente
      void EffaceEtoile(int Tab[NBLIGNE][NBCOLONNE],int *AdrLet, int *AdrCet);
     
    //====================================================================
    //                          MAIN
    //====================================================================
    void main()
    {
      int Tab[NBLIGNE][NBCOLONNE];
      int AdrL,AdrC;
      int score=0;
      char dir;
      int NumTerrain;
      int valcase;
      int place;
      float Duree;
      double Tfin,Tinit;   // utilisé pour chronomètre
      int nbcolonne,nbligne; 
      int AdrLet,AdrCet;
      int tic=0;
      int tac;
      int i=1;
      int delai;
     
      Cls();
      EffaceTerrain(Tab);
      printf("°°°°°°°Bienvenue dans le mini-jeu ploucman°°°°°° \n");
      Delay(2);
     
      //Configuration de jeu
      printf("Choisissez votre terrain\n1:Cadre percé \n2.Obstacles aléatoires :  \n ");
      scanf("%d",&NumTerrain);
      Cls();
      printf("Choisissez les dimensions du terrain:\n Nombre de lignes: ");
      scanf("%d",&nbligne);
      printf("\n Nombre de colonnes: ");
      scanf("%d",&nbcolonne);
     
      GenereTerrain(Tab,NumTerrain,nbcolonne,nbligne); 
     
      NouvelleEtoile(Tab,nbligne,nbcolonne);
      //Lancement du chronomètre
      tic=time(NULL); 
      // Placement du ploucman aléatoirement sur le terrain
      do
      {
        AdrL=rand()%nbligne;
        AdrC=rand()%nbcolonne;
        place=Tab[AdrL][AdrC];
      }
       while(place!=VIDE);
       Tab[AdrL][AdrC]=PLOUCMAN; 
     
      //Lancement du jeu 
      Tinit=time(NULL);
      do
      { 
        Cls();
        AfficheTerrain(Tab,nbligne,nbcolonne); 
        AfficheScore(score);
        tac=time(NULL);
        delai=tac-tic;
     
        //Contrôle de la durée de l'affichage
        if(delai>=DELAI)
        {
          EffaceEtoile(Tab,&AdrLet,&AdrCet);	    
          NouvelleEtoile(Tab,nbligne,nbcolonne);
        }
        if(KeyHit() )
        {
          dir=GetKey();
          fflush(stdin);
          switch(dir)
          {
            case TOUCHE_NORD_J1:   dir=NORD;
                                   break;
            case TOUCHE_SUD_J1:    dir=SUD;
                                   break;
            case TOUCHE_EST_J1:    dir=EST;
                                   break;
            case TOUCHE_OUEST_J1:  dir=OUEST;
                                   break;
          }                         
        } 
        valcase=AvancePloucman(Tab,&AdrL,&AdrC,dir,nbligne,nbcolonne);
     
        if(valcase==ETOILE)
        {
          score ++;
          NouvelleEtoile(Tab,nbligne,nbcolonne);
          tic=time(NULL);
        }
      }
      while(dir!='e' && score<3 && valcase!=MUR);
     
      Tfin=time(NULL);
      Cls();
      AfficheTerrain(Tab,nbligne,nbcolonne); 
      AfficheScore(score);
     
      if(score==3)
      {
       Duree=Tfin-Tinit;
       printf(" \n\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n\t²²²²²²²²² FIN DU JEU ²²²²²²²²²\n\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
       printf("Durée de la partie : %.0f secondes ",Duree); 
      }
      else
        if(dir=='e')
        {
          printf("Interruption prématurée du jeu");
        }
        else
          if(valcase==MUR)
          {
            printf("Mine touchée!!! : Fin de la partie");
          } 
    }
    //====================================================================
    //                      AfficherTerrain
    //====================================================================
    void AfficheTerrain(int Tab[NBLIGNE][NBCOLONNE],int nbligne, int nbcolonne)
     
    {
      int iligne;
      int icolonne;
     
     
      Cls();
      for(iligne=0;iligne<nbligne;iligne++)
      {
        printf("|");
        for(icolonne=0;icolonne<nbcolonne;icolonne++)
        {
          switch(Tab[iligne][icolonne])
            {
               case VIDE:                 printf(" ");
                                          break;
      		   case PLOUCMAN:             printf("@");
                                          break;
               case ETOILE:               printf("*");
                                          break;
               case MUR:			      printf("H");
               						      break;
               default:                   printf("erreur ");
     
            }  
        }
          printf("|\n");
      }
      printf("\t");
      for(iligne=0;iligne<nbligne;iligne++)
      {
        printf("-");
      }
    }
    //====================================================================
    //                       EffaceTerrain
    //====================================================================
    void EffaceTerrain(int Tab[NBLIGNE][NBCOLONNE])
    {
      int iligne;
      int icolonne;
     
      for(iligne=0;iligne<NBLIGNE;iligne++)
      {
        for(icolonne=0;icolonne<NBCOLONNE;icolonne++)
        {
          Tab[iligne][icolonne]=VIDE;
        }  
       }
    }  
    //====================================================================
    //                      NouvelleEtoile 
    //====================================================================
    void NouvelleEtoile(int Tab[NBLIGNE][NBCOLONNE],int nbligne,int nbcolonne)
    {
      int x,y;
      int i;
      int Case;
      int *AdrLet;
      int *AdrCet;
     
      srand(time(NULL));
      while(Case!=VIDE)
      {
        x=rand()%nbligne;
        y=rand()%nbcolonne;
        *AdrLet=x;
        *AdrCet=y;
        Case=Tab[x][y];
      }
      Tab[x][y]=ETOILE;
    }
    //====================================================================
    //                        AvancePloucman
    //====================================================================
    int AvancePloucman(int Tab[NBLIGNE][NBCOLONNE],int *AdrL,int *AdrC,char dir, int nbligne, int nbcolonne)
    {
      int iligne;
      int icolonne;
      int valcase;
     
      iligne=*AdrL;
      icolonne=*AdrC;
     
        switch(dir)
        {
          case NORD :                   iligne--;
                                        break;
          case SUD :                    iligne++;
                                        break;
          case OUEST :                  icolonne--;
                                        break;
          case EST:                     icolonne++;
                                        break;
        }
        valcase=SurLeTerrain(&iligne,&icolonne,nbligne,nbcolonne);
        valcase=Tab[iligne][icolonne];
     
        switch(valcase)
        {
           case VIDE :   Tab[*AdrL][*AdrC]=VIDE;
                         *AdrL=iligne;
                         *AdrC=icolonne;
                         Tab[iligne][icolonne]=PLOUCMAN;
     
           case ETOILE:  Tab[*AdrL][*AdrC]=VIDE; 
           				 *AdrL=iligne;
                         *AdrC=icolonne;
                         Tab[iligne][icolonne]=PLOUCMAN;
        }
        return valcase;
    }  
    //===================================================================
    //							Affiche score
    //===================================================================
     
    void AfficheScore(int score)
    {	
      printf("\n\n |||| Score: %d \t |||| ",score);
    }	
     
     
    //====================================================================
    //                         SurLeTerrain
    //====================================================================
     
    int SurLeTerrain(int *AdrL,int *AdrC, int nbligne, int nbcolonne)
    {	
     
    		//Debordement à droite ou à gauche
    		if(*AdrL>nbligne-1)
    		{
    		  *AdrL=0;
    		}
    		if(*AdrL<0)
    		{	
    		  *AdrL=nbligne-1;
    		} 
     
    		// Debordement en haut ou en bas
    		if(*AdrC>nbcolonne-1)
    		{	
    		  *AdrC=0;
    		}
    		if(*AdrC<0)
    		{	
    		  *AdrC=nbcolonne-1;
    		}
      return *AdrL,*AdrC;
    }
     
    //====================================================================
    //                        GenereTerrain
    //====================================================================
     
    void GenereTerrain(int Tab[NBLIGNE][NBCOLONNE],int NumTerrain, int nbcolonne,int nbligne)
    {
       int a,b;
       int iligne,icolonne;
     
       switch(NumTerrain)
       {
       				    //Cadre percé
       					case 1:  for(iligne=0;iligne<nbligne;iligne++)
       					           {
       					             Tab[iligne][0]=MUR;
       					             Tab[iligne][nbcolonne-1]=MUR; 
    							   }
    							 for(icolonne=0;icolonne<nbcolonne;icolonne++)
    							   {
    							     Tab[0][icolonne]=MUR;
       					             Tab[nbligne-1][icolonne]=MUR;
       					           }  
       							 // Trou haut et bas  
       							 Tab[0][(nbcolonne/2)-1]=VIDE;
       							 Tab[nbligne-1][(nbcolonne/2)-1]=VIDE; 
       							 //Trou gauche et droite
       							 Tab[(nbligne/2)][0]=VIDE;
       							 Tab[(nbligne/2)][nbcolonne-1]=VIDE;  
       							 break;
     
       				    //Mur aléatoire
       					case 2:       srand(time(NULL)); 
     
       					              a=rand()%NBLIGNE;
                                      b=rand()%NBCOLONNE;
       					              Tab[a][b]=MUR;
     
    						    	  break;
              }
    }
     
    //====================================================================
    //                        EffaceEtoile
    //====================================================================
     
    void EffaceEtoile(int Tab[NBLIGNE][NBCOLONNE],int *AdrLet,int *AdrCet)
    {
      int ligne=0;
      int colonne=0;
      int delai;
      int Case;
     
      ligne=*AdrLet;
      colonne=*AdrCet;
     
      Case=VIDE;
      Tab[ligne][colonne]=Case;
     
    }
    Le message d'erreur est :
    FATAL RUNTIME ERROR
    Dereference of uninitialized pointer.
    Le problème se situe ligne 226 ( Fonction Nouvelle etoile ) sur les *AdrLet et *AdrCet pour adresse ligne etoile et adresse colonne etoile.

    Je serais infiniment reconnaissant à la personne qui saurrait m'expliquer pourquoi je n'ai pas les valeurs d'initialisée.
    soyez indulgent je fait de la prog depuis 5 mois

    Merci beaucoup.

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    pour qu'on puisse t'aider il faut :
    - mettre les balises code (le #) et non quote
    - indenter le code, sinon on va avoir du mal a le lire
    - lister les messages d'erreur ou les endroits à problemes précisément
    - ne pas nous dire 'pkoi ça ne s'initialise pas correctement' après nous avoir balancé un paté

    Ensuite, essaye, quand tu ne sais pas ce qui se passe, et où, d'utiliser un debugger pas à pas (methode clean), ou de coller des printf dans tous les sens (methode goret).
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    C'est beaucoup mieux

    Bon, alors prends garde aux scanf, d'une part, réfère toi aux cours/faq C de ce site pour savoir exactement pourquoi et quoi faire pour que ça marche.

    Ensuite, ton fatal error, ça vient d'un pointeur non initialisé, donc dans 'nouvelle etoile' tu utilises des pointeurs la, sans les allouer, ça doit surement venir de ça.

    En général, les debuggeurs te montrent du doigt ce genre d'erreurs, essaye d'apprendre a t'en servir, ça aide dans pas mal de cas
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Faiche
    tu utilises des pointeurs la, sans les allouer
    (merci de m'aider)

    J'ai une autre erreur quand j'affecte une valeur à mes *AdrLet....
    Comment je fais pour les allouer ?

    L'erreur survient au bout du temps défini...
    La fonction EffaceEtoile doit pas connaître l'endroit où se situe mon etoile...mais je ne sais pas comment rectifier ça

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Citation Envoyé par Pit29
    (merci de m'aider)

    J'ai une autre erreur quand j'affecte une valeur à mes *AdrLet....
    Comment je fais pour les allouer ?

    L'erreur survient au bout du temps défini...
    La fonction EffaceEtoile doit pas connaître l'endroit où se situe mon etoile...mais je ne sais pas comment rectifier ça
    Les pointeurs c'est un bloc de la programmation de C qu'il te faut absolument comprendre, donc essaye de lire la partie de cours sur les pointeurs, ça n'a rien de vraiment compliqué.

    Pour résumer, le pointeur, c'est une variable qui contient une adresse, à laquelle est stockée en mémoire des valeurs.

    Un int* contiendra donc l'adresse d'une zone mémoire où se trouve un entier.

    Mais avant de pouvoir utiliser un pointeur, il faut l'allouer, c'est à dire lui donner une zone mémoire dans laquelle il pourra stocker sa valeur.

    Pour ça il existe les fonctions de la famille malloc().

    Quand tu déclares un pointeur, il est plus prudent de toujours l'initialiser à NULL.

    En fait, quand tu accèdes à la valeur pointée par un pointeur (déréférencement), s'il pointe sur NULL, ça saute (segmentation fault), mais si, par hazard, vu que tu ne l'a pas initialisé, il pointe sur une zone mémoire valide, il va te donner accès à une zone qui n'est pas du tout celle voulue, et tu risques de tout peter.

    Enfin, quand tu ne te sers plus d'un pointeur, il faut liberer la zone mémoire, pour que d'autres puissent l'utiliser, en utilisant la fonction free().

    Ce que j'ai dit la, c'est un bref survol pour que tu saches où tu mets les pieds, mais lis attentivement les cours, sinon tu vas galérer comme tous les nouveaux epitech chaque année a venir demander "pkoi j'ai un segfault la ?" a chaque nouveau programme. :p
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Une petite précision sur ce qu'a dit Faiche...

    L'une des possiblité d'initialisation des pointeurs est, effectivement, l'allocation dynamique (avec la fammille des fonctions *alloc), en n'oubliant pas de libérer la mémoire avec la fonction free, mais on peut, aussi, l'initialiser en lui fournissant, tout simplement, ce qu'il demande: l'adresse à laquelle trouver une variable du type qui lui convient...

    Ainsi, les deux code suivants sont valides:
    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
     
    int* pointeur=NULL;/* déclaration d'un pointeur avec l'initialisation a
                          une valeur save */
    pointeur=malloc(sizeof(int)*10);/* alloue dynamiquement la mémoire pour dix
                                       éléments de type int */
    /* l'allocation dynamique peut échouer pour une foulle de raisons
       (entre autre le fait qu'on ne trouve pas un espace mémoire contigu
       suffisant pour allouer le bloc de la taille demandée)...
       il FAUT donc tester systématiquement tester si elle a réussi (le pointeur
       prend NULL en cas d'échec ) */
       if(pointeur!=NULL)
       {
            /* ici, ca passe */
       }
       else
       {
            /* ici, ca passe pas... y a peut etre quelque chose à faire */
       }
    (...)
    /* quand on n'a plus besoin de la mémoire, on la libère */
    free(pointeur);
    /* et on fait pointer le pointeur sur une zone "save" et testable
    pointeur=NULL;
    et
    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
     
    int nbr; /* déclaration d'une variable nommée nbr de type int */
    int *ptr=NULL; /* déclaration d'un pointeur de type int */
    nbr=10;
    ptr=&nbr; /* initialisation du pointeur en lui donnant l'adresse à laquelle se
                 trouve la variable nbr; */
    /* comme il ne s'agit pas d'une allocation dynamique (nbr existe déjà quelque
       part en mémoire), il ne sert pas à grand chose de le tester, et, SURTOUT
       il ne faudra en aucun cas essayer de libérer la mémoire avec free */
    ...
    /* on peut modifier nbr au depart de ptr */
    *ptr=20;/*on réinitialise la valeur de ce qui est pointé par ptr à 20 */
     
    /* ATTENTION le code suivant risque de provoquer des erreurs s'il est 
       mal utilisé */
    ptr++;/* fait pointer ptr sur l'adresse qui suit directement celle à laquelle
            se trouve nbr (mais que contient-elle ???)
    La seconde solution, si elle n'a ici qu'un intéret purement didactique, sera souvent utilisée dans le cadre de la création d'une fonction qui doit modifier plusieurs valeurs (car il n'y a qu'une valeur qui puisse etre renvoyée) ou dans le cadre du passage de structure comme argument de fonction.

    La fonction prendra alors un pointeur en argument, et, si on utilise une variable non pointeur, on appellera la fonction en lui fournissant l'adresse à laquelle se trouve la variable devant servir comme argument à la fonction.
    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
     
    void Mafonct(int* ptr)
    {
        /* tout ce qu'il faut à la fonction */
    }
    int main()
    {
         int nbr;
         int* monptr;
        /* ce qu'il faut avant d'appeler mafonct */
        Mafonct(&nbr);/*appel de la fonction en fournissant l'adresse de nbr */
        monptr=&nbr;/* initialisation du pointeur sur l'adresse de nbr */
        Mafonct(monptr);/* appel de la fonction en lui passant... un pointeur
                           (qui ici pointe sur... nbr)*/
    }
    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

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour vos explications.
    Je pense mieu cibler tout ce qui est pointeur ( j'ai bien regardé le cours ).

    Je n'arrive pas à recupéré 2 valeur (en l'ocurance ligne et colonne de l'étoile ) qui sont dans ma fonction NouvelleEtoile pour pouvoir les passer en paramètre à ma fonction EffaceEtoile...

    Pourquoi je peut pas ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     x=rand()%nbligne;
        y=rand()%nbcolonne;
    	AdrLet=3;
        AdrCet=2;
     
    	*AdrLet=x;
        *AdrCet=y;

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Faiche
    Mais avant de pouvoir utiliser un pointeur, il faut l'allouer,
    Ca n'a aucun sens.
    c'est à dire lui donner une zone mémoire dans laquelle il pourra stocker sa valeur.
    Alors il s'agit de l'initialiser ou de l'affecter, c'est à dire de lui donner une valeur.
    Pour ça il existe les fonctions de la famille malloc().
    Celle-ci peut être la valeur retournée par malloc(), mais ce n'est qu'une possibilité parmi les 4 décrites par la littérature C :
    • adresse d'une variable
    • contenu d'un pointeur valide
    • valeur retournée par malloc() (et sa famille)
    • valeur retournée par fopen() (FILE*)

    Quand tu déclares un pointeur, il est plus prudent de toujours l'initialiser à NULL.
    A moins de lui donner tout de suite sa valeur... L'important est, comme tu le soulignes après, qu'un pointeur ne connaisse que 2 valeurs sur les 3 possibles :
    • invalide (NULL) : oui
    • valide : oui
    • indéterminé : non

    En fait, quand tu accèdes à la valeur pointée par un pointeur (déréférencement), s'il pointe sur NULL, ça saute (segmentation fault),
    Non. Ca invoque un comportement indéterminé.

    http://emmanuel-delahaye.developpez.com/notes.htm#ub

    On ne met pas NULL 'pour que ça saute', mais parce que c'est une valeur connue ayant la sémantique 'pointeur invalide' et surtout, qu'elle est testable :
    Enfin, quand tu ne te sers plus d'un pointeur, il faut liberer la zone mémoire, pour que d'autres puissent l'utiliser, en utilisant la fonction free().
    Oui, et dans la foulée, remettre le pointeur dans l'état 'invalide' (NULL) :
    Ca ne résout pas les problèmes d'aliasing, mais ça aide.
    Ce que j'ai dit la, c'est un bref survol pour que tu saches où tu mets les pieds, mais lis attentivement les cours, sinon tu vas galérer comme tous les nouveaux epitech chaque année a venir demander "pkoi j'ai un segfault la ?" a chaque nouveau programme. :p
    *** Troll alert ***
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Pit29
    Merci beaucoup pour vos explications.
    Je pense mieu cibler tout ce qui est pointeur ( j'ai bien regardé le cours ).

    Je n'arrive pas à recupéré 2 valeur (en l'ocurance ligne et colonne de l'étoile ) qui sont dans ma fonction NouvelleEtoile pour pouvoir les passer en paramètre à ma fonction EffaceEtoile...

    Pourquoi je peut pas ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     x=rand()%nbligne;
        y=rand()%nbcolonne;
    	AdrLet=3;
        AdrCet=2;
     
    	*AdrLet=x;
        *AdrCet=y;
    Une adresse, c'est pas 2 ou 3 comme ça au hasard... Ton code initial est non portable et trop long pour que je le lise.

    Poste un code standard, compilable et réduit au minimum qui montre le problème (cet exercice est une méthode de mise au point bien connue)
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. [debutant] pointeur de pointeur ?
    Par Thalion59fr dans le forum Débuter
    Réponses: 10
    Dernier message: 19/05/2006, 00h00
  2. [Debutant] Lecture non destructrice !
    Par Treuze dans le forum C
    Réponses: 5
    Dernier message: 18/05/2006, 18h22
  3. comparaison de pointeur non portable
    Par kykyn dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 10h58
  4. Directx non initialisé
    Par Cyclops dans le forum DirectX
    Réponses: 3
    Dernier message: 07/06/2005, 10h14
  5. [debutant] JDialog non modal
    Par andresan dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 12/05/2004, 13h40

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