Bug en C
nicolay1
Messages postés
145
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 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);
}
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
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 ;-)
"*g++"
renseigne toi sur la précédente des opérateur.
Si tu ne vois toujours pas, je t'aiderai plus ;-)
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.
*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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
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; }
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.
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.
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
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
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.
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.