Bug en C

nicolay1 Messages postés 176 Statut Membre -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
j'ai un petit probléme, je commence les pointeur en C et j'ai un petit bug dans mon programme :
aucun bug n'est détécté par l'IDE ( qui est code::block ) mais quand je le laisse le programme arre^te de fonctionner quand il arrive à la ligne *g=*++ c'est ce bout là qui bug...
int multi(int a,int b,int *g);
multi(int a,int b,int *g){
int f;
for (f=1;f<5;f++){
*g=*g++;
}

return a*b;
}
int main()
{
int a,c,b;
int *g;
printf("entrez le premier nombre : ");
scanf("%d",&a);
printf("entrez le second nombre : ");
scanf("%d",&b);
c=multi(a,b,*g);
printf("adreese : %d , nombre : %d \n",&c,c);
printf("boucle for : %d",*g);
}

7 réponses

  1. nicolay1 Messages postés 176 Statut Membre 8
     
    up :D
    0
  2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Je ne suis pas certain de la réponse, mais comme ça donne une erreur de segmentation, je pense voir où il est.
    "*g++"
    renseigne toi sur la précédente des opérateur.
    Si tu ne vois toujours pas, je t'aiderai plus ;-)
    0
  3. Antoine
     
    Je pense que ce que tu as écrit n'est pas ce que tu veux faire.

    *g = *(g+=1); /*Attention : différent de *g = *(g++) */
    ou bien :
    *g = *(g += sizeof(int)); /* si tu veux décaler ton tableau */
    Pour écrire ça tu doit être sur que g est un poitneur sur une zone mémoire assez grande.

    ++ est prioritaire devant * donc en théorie, même si ce n'est pas ce que tu veux faire, ça devrait fonctionner.

    Par contre, comme le suggère Char Sniper, je pense que tu voulais dire
    *g = (*g)++;

    Je n'ai pas pas très bien compris l'intéret de la boucle mais bon.
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      *g = *(g += sizeof(int));
      Ca ne décale pas le tableau de 1 indice, mais de x indices (dépend de la machine, disons 4).

      Par contre, comme le suggère Char Sniper, je pense que tu voulais dire
      *g = (*g)++;

      Ce n'est pas correcte cette écriture, cela provoque un comportement non défini...
      0
  4. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Attention à ce que tu souhaites faire : *(g++) ou (*g)++ ?
    g pointe sur rien... Faut le faire pointer sur une zone allouée.
    c=multi(a,b,*g);
    C'est plutôt multi(a,b,g); puisque tu dois envoyer l'adresse vu le prototype de la fonction.
    printf("adreese : %d , nombre : %d \n",&c,c);
    Pour afficher l'adresse, il vaut mieux mettre : %p plutôt que %d.

    Tu as oublié également le : return 0; à la fin
    Cdlt,

    Google is your friend
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
     
    Bonjour,
    Vous vouliez incrémenter la valeur pointée par g à ce que j'ai pu comprendre. Un petit exemple si ça peut vous aider :
    #include <stdio.h> 
    
    void boucle1(int *b) 
      { 
        int i; 
        for(i=0;i<4;i++) 
            b[0]++;/* incremente la valeur pointée par b en utilisant les crochets*/ 
      } 
    void boucle2(int *b)/* fait la même chose que boucle1 */ 
      { 
        int i; 
        for(i=0;i<4;i++) 
            (*b)++;/* incremente la valeur pointée par b sans les crochets */ 
      } 
    int main(void) 
      { 
        int z=0,*x; 
        boucle1(&z);/* envoie l'adresse de z */ 
        printf("boucle 1 : %d\n",z); 
        z=0; 
        boucle2(&z); 
        printf("boucle 2 : %d\n",z); 
        x=&z;/* x pointe vers z */ 
        *x=0;/* modif la valeur de z */ 
        printf("z : %d\n",z); 
        boucle1(x);/* envoie l'adresse de z contenue dans x */ 
        printf(" x : %p z : %p\n",x,&z); 
        printf("boucle 1 : %d\n",*x); 
        *x=0; 
        boucle2(x); 
        printf("boucle 2 : %d\n",*x); 
        return 0; 
      }
    
    0
  7. nicolay1 Messages postés 176 Statut Membre 8
     
    Merci beaucoup
    excusez moi... mais en faite la seul connerie que j'avais faite c'est de ne pas avoir attribué au pointeur g une adresse, je suis désolé de vous avoir fait perdre votre temps.
    0
  8. redaTDI Messages postés 37 Statut Membre 3
     
    Bonjour ,

    Il est mieux d'ecrire un Void au debut de la procedure, et aussi je pense que *g=*g++; n'est pas correct car *g++ est equivalant à *g = *g + 1
    dans une boucle j'utilise *g++ ou g* = g* + 1
    -1
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      l est mieux d'ecrire un Void au debut de la procedure
      Non, il est mieux d'écrire un int puisque ça fonction renvoie un int...

      et aussi je pense que *g=*g++; n'est pas correct car *g++ est equivalant à *g = *g + 1
      dans une boucle j'utilise *g++ ou g* = g* + 1

      Non plus. L'opérateur ++ est prioritaire par rapport à *. Dis autrement *g++ est équivalent à *(g++); soit *g; g++; Donc *g++ est tout à fait correct.
      0