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 :

Soucis résultat non attendu


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juillet 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2019
    Messages : 23
    Par défaut Soucis résultat non attendu
    Bonsoir

    J'essaye de faire un programme tout bidon qui prend un pointeur(8x) et me donne ca valeur j'ai réussis avec ma fonction putnbr (voir les commentaire dans le code)
    tout fonctionne mais voila j'essaye de l'appeler avec printf et la j'ai des warning ainsi qu'une valeur negative -1392384820 qui s'affiche a la place du résultat attendu même en essayant de comprendre les warning mais j'ai du mal si quelqu'un peut m'éclaircir la situation ca serait cool

    Voici le code

    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
     
     
    #include <unistd.h>
    #include <stdio.h>
     
    void ft_putchar(char c)
    {
        write(1, &c, 1);
    }
    void    ft_putnbr(int nb)
    {
       if (nb < 0)
       {
           ft_putchar('-');
           nb = -nb;
       }
       if (nb >= 0 && nb <= 9)
       {
        ft_putchar(nb + '0');
       }
        if (nb >= 10)
        {
            ft_putnbr(nb / 10);
            ft_putnbr(nb % 10);
        }
     
    }
    void    ft_ultimate_ft(int *********nbr)
    {
        *********nbr = 42;
        //ft_putnbr(*********nbr);
    }
     
    int main()
    {
        int		a;
    	int		*ptr;
    	int		**ptr2;
    	int		***ptr3;
    	int		****ptr4;
    	int		*****ptr5;
    	int		******ptr6;
    	int		*******ptr7;
    	int		********ptr8;
    	int		*********ptr9;
     
            ptr  = &a;
    	ptr2 = &ptr;
    	ptr3 = &ptr2;
    	ptr4 = &ptr3;
    	ptr5 = &ptr4;
    	ptr6 = &ptr5;
    	ptr7 = &ptr6;
    	ptr8 = &ptr7;
    	ptr9 = &ptr8;
     
        ft_ultimate_ft(&ptr9);
        printf("%d", ptr9);
        //ft_putnbr(a);
    }
    Voici un autre programme tout aussi simple voir plus et la tout fonctionne correctement

    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
     
    #include <unistd.h>
    #include <stdio.h>
     
    void ft_putchar(char c)
    {
        write(1, &c, 1);
    }
    void    ft_putnbr(int nb)
    {
       if (nb < 0)
       {
           ft_putchar('-');
           nb = -nb;
       }
       if (nb >= 0 && nb <= 9)
       {
        ft_putchar(nb + '0');
       }
        if (nb >= 10)
        {
            ft_putnbr(nb / 10);
            ft_putnbr(nb % 10);
        }
     
    }
     
    void    ft_swap(int *a, int *b)
    {
        int ptr;
     
        ptr = *a;
        *a   = *b;
        *b   = ptr;  
       /*
        ft_putnbr(*a);
        ft_putchar('\n');
        ft_putnbr(*b);
        ft_putchar('\n');
        */
    }
     
    int main(void)
    {
        int a = 10;
        int b = 20;
        ft_swap(&a,&b);
        printf("%d-----%d", a, b);
    }
    J'appel ft_swap avec comme argument l'adresse de ceux sur quoi pointe A et ainsi que de B qui grace a la fonction ft_swap va alterne les adresse des arguments c'est a dire A et B, mais le principe et le meme je récupère (&) et j'affiche donc je comprend pas que sur mon premier code ca ne fonctionne pas

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par rosco-rs Voir le message
    pointeur(8x)

    int *********ptr9;
    Sérieusement "Tu bluffes Martoni !"


    Citation Envoyé par rosco-rs Voir le message
    J'appel ft_swap avec comme argument l'adresse de ceux sur quoi pointe A et ainsi que de B qui grace a la fonction ft_swap va alterne les adresse des arguments c'est a dire A et B, mais le principe et le meme je récupère (&) et j'affiche donc je comprend pas que sur mon premier code ca ne fonctionne pas
    Ton erreur vient du fait que tu n'as pas pigé les pointeurs. Vas revoir tes cours, par pitié, STP, je t'en supplie

    En gros
    • int *pa; on DÉFINI 1 pointeur
    • *pa on DÉFÉRENCE 1 pointeur, c'est à dire on récupère la valeur pointée
    • void ft_swap(int *a, int *b) a et b sont 2 paramètres ENTRÉE/ SORTIE. entrée parce qu'on va prendre sa valeur, sortie parce qu'on va modifier sa valeur
    • Par défaut, en C, le passage de paramètres est par valeur. C'est pour cela qu'on utilise des pointeurs : pour modifier les paramètres.
    • ft_swap(&a,&b); l'opérateur esperluette permet de prendre l'ADRESSE des variables, y compris pointeurs


    Ton problème avec ton second code :
    • ft_ultimate_ft(&ptr9); tu prends l'adresse de ton pointeur. Ce qui fait 1 déférencement en +, soit 10 au total (<- 10 ). Et cela ne correspond pas au prototype de ta fonction ft_ultimate_ft qui en prend que 9.
    • printf("%d", ptr9); tu affiches l'adresse contenue dans le pointeur ptr9. Si c'est négatif, c'est sûrement parce que l'adresse est 1 nombre positif qui déplace la plage des valeurs signées.


    Donc il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        ft_ultimate_ft(ptr9); // on appelle la fonction sans prendre l'adresse de ptr9, c'est déjà 1 pointeur
        printf("%d", *********ptr9); // on affiche la valeur de ptr9

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par rosco-rs Voir le message
    J'appelle ft_swap avec comme argument l'adresse de ceux sur quoi pointe A et ainsi que de B qui grace a la fonction ft_swap va alterner les adresses des arguments c'est a dire A et B, mais le principe est le meme je récupère (&) et j'affiche donc je comprends pas que sur mon premier code ca ne fonctionne pas
    Oui, le principe est en effet exactement le même ; encore faudrait-il que tu l'aies compris. La variable "a" étant de type "int", "&a" est alors stocké dans un "int étoile" => le principe est donc de rajouter systématiquement une étoile au type de la variable dont on prend l'adresse. Ca s'applique donc aussi à "ptr9". Tu aurais pu d'ailleurs t'en rendre compte tout seul en relisant ton propre code car c'était déjà écrit. En effet, puisque ptr9 qui récupère l'adresse de ptr8 possède une étoile de plus que ptr8, alors passer &ptr9 à la fonction implique que le pointeur de la fonction qui recevra cette adresse doit lui-aussi avoir une étoile de plus que ptr9.

    Et ce n'est pas parce qu'on est en informatique que l'orthographe devient tout d'un coup optionnelle. La grammaire sert à rendre une idée compréhensible. "a essayé" et "à essayer" ne signifient pas la même chose.

    Citation Envoyé par rosco-rs Voir le message
    Voici un autre programme tout aussi simple voir plus et la tout fonctionne correctement
    Reste-en donc à ce qui est simple. Au delà de 2/3 étoiles ça devient difficilement gérable.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juillet 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2019
    Messages : 23
    Par défaut
    Merci pour les précisions

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Quand tu dis que tu as des warnings, il convient de les résoudre, ou de les poster si tu ne les comprends pas.
    Surtout en C où trop de problèmes qui seraient des erreurs dans d'autres langages sont des warnings.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Résultat non attendu sur jointure
    Par bruno.rotrou dans le forum Débuter
    Réponses: 5
    Dernier message: 12/04/2016, 14h45
  2. [Débutant] résultat non attendu ! ( problème d'algorithme )
    Par Ranzouz dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/07/2015, 16h57
  3. [JAXB] Résultat non attendu
    Par SpeedOverflow dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 23/06/2011, 10h45
  4. sdelete et reaser : résultat non attendu
    Par DSGSLA dans le forum Sécurité
    Réponses: 4
    Dernier message: 16/03/2011, 11h17
  5. Résultat non attendu de l'opérateur Like
    Par idrysse31 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/03/2010, 12h01

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