Bug en C

Fermé
nicolay1 Messages postés 145 Date d'inscription mardi 22 février 2011 Statut Membre Dernière intervention 21 juin 2012 - 30 avril 2011 à 18:36
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 1 mai 2011 à 14:54
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);
}



A voir également:

7 réponses

nicolay1 Messages postés 145 Date d'inscription mardi 22 février 2011 Statut Membre Dernière intervention 21 juin 2012 8
30 avril 2011 à 18:49
up :D
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
30 avril 2011 à 21:46
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
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 mai 2011 à 01:23
*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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 1/05/2011 à 01:20
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 1/05/2011 à 08:56
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
nicolay1 Messages postés 145 Date d'inscription mardi 22 février 2011 Statut Membre Dernière intervention 21 juin 2012 8
1 mai 2011 à 14:46
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
redaTDI Messages postés 30 Date d'inscription samedi 2 octobre 2010 Statut Membre Dernière intervention 9 novembre 2012 3
1 mai 2011 à 14:20
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 mai 2011 à 14:54
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