"Pointeur et printf", phénomène que je ne m'explique pas!!!

Résolu/Fermé
evilfalcon Messages postés 58 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 10 novembre 2015 - Modifié par evilfalcon le 7/10/2014 à 12:08
evilfalcon Messages postés 58 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 10 novembre 2015 - 8 oct. 2014 à 08:56
Bonjour,

je suis en train de créer un programme très simple de calcul! Un menu, avec des choix: addition, soustraction, multiplication et division! Rien de bien compliqué en somme.

Je veux faire ça bien, donc j'utilise des .h pour chaque choix de mon menu!
Je suis à la soustraction et je suis face à un phénomène que je ne comprend pas!

Dans le programme, j'ai mis en avant le printf bizarre:

Si je ne demande pas d'afficher l'adresse de mes variables somme[0], somme[1] et negative, j'obtient après le if que somme[1] = négative, inversement quand je l'ai affiche pas de problème, negative et somme[1] sont bien différent.
Je ne comprend pas, je suppose juste que &somme[1] = &negative, mais je vois pas pourquoi et encore moi comment!!

voila le programme concerné:

#include <stdio.h>
#include <stdlib.h>
#include "saisie.h"
#include "cal_add.h"
#include "reduction.h"

void soustraction (int choix_menu, int tab_chiffre[3])
{
    int somme[1];

    int negative = 0;

    printf("|********soustraction********|\n");
    saisie(tab_chiffre);

    tab_chiffre[2] = -tab_chiffre[2];
    cal_add(tab_chiffre, somme);
    //negative = 0;
    //printf("somme[0] = %d, somme[1] = %d, negative = %d \n",somme[0], somme[1], negative);
    

/***************PHENOMENE BIZARRE*****************/
printf("adresse somme[0] = %d, adresse somme[1] = %d, adresse negative = %d t\n",&somme[0], &somme[1], &negative);
/************************************************/


    if (somme[0] < 0)
    {
        somme[0] = -1 * somme[0];
        negative = 1;
    }

    printf("somme[0] = %d, somme[1] = %d, negative = %d \n",somme[0], somme[1], negative);

    reduction(somme);

    tab_chiffre[2] = -tab_chiffre[2];

    if (negative == 1)
    {
        printf("la soustraction %d/%d - %d/%d = -%d/%d\n \n",tab_chiffre[0],tab_chiffre[1],tab_chiffre[2],tab_chiffre[3],somme[0],somme[1]);
    }
    else
    {
        printf("la soustraction %d/%d - %d/%d = %d/%d\n \n",tab_chiffre[0],tab_chiffre[1],tab_chiffre[2],tab_chiffre[3],somme[0],somme[1]);
    }

}


Merci par avance! Si vous avez une réponse à mon problème!
Evilfalcon

5 réponses

sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
7 oct. 2014 à 11:59
Bonjour
C'est bien de donner les détails mais on n'a pas le code sources que tu voulais poster, pourrais ton l'avoir afin de comprendre ce qu'il on est ?
;) à bientôt
0
evilfalcon Messages postés 58 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 10 novembre 2015
7 oct. 2014 à 12:05
Oui! Pas de problème! Tu m'as juste pris de cour! comme j'ai missclic sur valider, avant de finir mon topic! Tu ne pouvez pas avoir toutes les informations!
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
7 oct. 2014 à 12:38
je sais pas trop quel est ton but c'est de voir les adresses ou effectuer des opérations simples ? vu le code :)
0
evilfalcon Messages postés 58 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 10 novembre 2015
Modifié par evilfalcon le 7/10/2014 à 13:59
Mon but: faire un opération simple de soustraction! Par contre je travail avec des fractions!
J'ai affiché les adresses lors de ma recherche de debuggage! Je travail seul, et si vraiment je ne trouve pas ou je ne comprend pas! Je demande de l'aide!

La j'ai trouvé d'ou viens l'erreur, mais je ne comprend pas ce phénomène!!!!
Je comprend pas pourquoi, j'ai &negative = &somme[1]! (dans ce cas la, je parle de l'adresse de la variable négative et de l'adresse de la second case du tableau).

Pour preuve, sur cette partie du code (juste en dessous du commentaire phénomène bizarre:

printf("somme[0] = %d, somme[1] = %d, negative = %d \n",somme[0], somme[1], negative);

    if (somme[0] < 0)
    {
        somme[0] = -1 * somme[0];
        negative = 1;
    }

    printf("somme[0] = %d, somme[1] = %d, negative = %d \n",somme[0], somme[1], negative);


Sur le premier printf, j'ai somme[1] = 4 et negative = 4 (par exemple),
sur le deuxiéme, j'ai somme[1] = 1 et negative = 1.


Pour debbugger, je rajout dela:
void soustraction (int choix_menu, int tab_chiffre[3])
{
    int somme[1];
    int negative = 0;
    int* Pointeur_somme = &somme;
    int* Pointeur_negative = &negative;

Ca marche très bien!!!!!



Je vous le donne le code des trois programmes que j'ai créé:, c'est à dire:
"saisie"
"cal_add"
"reduction"


Le programme "saisie", me sert à rentrer les deux fraction, dans le tableau tab_chiffre
voici, le code:

#include <stdio.h>
#include <stdlib.h>

void saisie(int tab_chiffre[3])
{
    char confirmer='N';
    do
    {
        printf("numerateur du chiffre 1?\n");
        scanf("%d",&tab_chiffre[0]);

        printf("denumerateur du chiffre 1?\n");
        scanf("%d",&tab_chiffre[1]);

        printf("numerateur du chiffre 2?\n");
        scanf("%d",&tab_chiffre[2]);

        printf("denumerateur du chiffre 2?\n");
        scanf("%d",&tab_chiffre[3]);
        getchar();
        printf("Vos chiffres sont %d/%d et %d/%d \nconfirmer cette selection? (Y/N) \n",tab_chiffre[0],tab_chiffre[1],tab_chiffre[2],tab_chiffre[3]);
        scanf("%c",&confirmer);
        printf("\n");

    }while((confirmer !='y') && (confirmer !='Y'));


}




le programme cal_add faire la somme et de me rendre la somme ou la différence:
voici le code:

#include <stdio.h>
#include <stdlib.h>

void cal_add(int tab_chiffre[3], int somme[1])
{
    somme[0]=(tab_chiffre[0]*tab_chiffre[3])+(tab_chiffre[1]*tab_chiffre[2]);
    somme[1]=tab_chiffre[1]*tab_chiffre[3];
}



et enfin le programme reduction qui me donne la fraction irreductible.
le code est:

#include <stdio.h>
#include <stdlib.h>

void reduction(int somme[1])
{
    int nb1= somme[0];
    int nb2= somme[1];
    int nb3= 0;

    if (somme[0] == somme[1])
    {
        somme[0] = 1;
        somme[1] = 1;
    }
    else
    {
        if (nb1 < nb2)
        {
            nb3 = nb2;
            nb2 = nb1;
            nb1 = nb3;
        }

        do
        {
            if (nb1 >= nb2)
            {
                nb3 = nb1 - nb2;
                //printf("%d - %d = %d\n",nb1,nb2,nb3);
                nb1 = nb3;
            }
            else
            {
                nb1 = nb2;
                nb2 = nb3;
            }
            //printf("nb1 = %d, nb2 = %d, nb3 = %d\n",nb1,nb2,nb3);
        }while(nb3 != 0);

        //printf("le pgcd est %d",nb2);
        somme[0]=somme[0]/nb2;
        somme[1]=somme[1]/nb2;
    }
}

0

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

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
7 oct. 2014 à 22:04
Bonjour,

J'ai lu le début de ton code et me suis arrêté à la 1ère erreur.

int somme[1];
int tab_chiffre[3];

Cela veut dire que tu crées un tableau somme de 1 case et un tableau de tab_chiffre de 3 cases.
Donc, somme[0] existe mais pas somme[1].
De même, tab_chiffre[0], tab_chiffre[1] et tab_chiffre[2] existent mais pas tab_chiffre[3]. Si tu les utilises, tu lis ou écris à l'adresse d'une variable située à côté dans la pile...

Cdlt,
0
evilfalcon Messages postés 58 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 10 novembre 2015
7 oct. 2014 à 22:51
La première case mémoire pour le tableau et ensuite pour pour ma variable!
Donc ils ont la même adresse! C'est tous a fait possible! je compile! et je regarde ce que cela donne!
merci
0
evilfalcon Messages postés 58 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 10 novembre 2015
8 oct. 2014 à 08:56
Je viens de faire d'essayer cette modification! C'était cela!
Merci à tous!
0