Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre éclairé
    Homme Profil pro Alex V
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    octobre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Nom : Homme Alex V
    Âge : 26
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : octobre 2007
    Messages : 630
    Points : 389
    Points
    389

    Par défaut Affichage int* / int** identique

    Bonjour,

    J'ai une drôle d'erreur.
    J'affecte en retrour un int * à une fonction qui renvoit un int ** et il arrive quand même à me l'afficher correctement. Même si ça compile, je devrais avoir une belle erreur de Windows à l’exécution.
    Je ne trouve pas d'explication.

    Je link le projet car il y a trop de lignes de codes.

    Volontairement, j'ai enlevé des '*'. Mais ça s’exécute normalement quand même.

    Code :
    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
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "allocate.h"
    #include "deallocate.h"
    #include "display.h"
    #include "create_da.h"
    #include "destroy_da.h"
    #include "logger.h"
    
    int main()
    {
        logger_on();
    
        int s=allocate_1D_i(10);
        display_1D_i(s,10,"1D");
        deallocate_1D_i(s);
    
        unsigned long long int *t = allocate_2D_ulli(3,3);
        display_2D_ulli(t,3,3,"2D");
        deallocate_2D_ulli(t,3);
    
        unsigned long long int *u = allocate_3D_ulli(3,3,3);
        display_3D_ulli(u,3,3,3,"3D");
        deallocate_3D_ulli(u,3,3);
    
        t_1Di *da1 = create_1D_i(10);
        destroy_1D_i(da1);
    
        t_2Di *da2 = create_2D_i(5,5);
        destroy_2D_i(da2);
    
        t_3Di *da3 = create_3D_i(3,3,3);
        destroy_3D_i(da3);
    
        logger_off();
        return 0;
    }
    Merci encore
    Fichiers attachés Fichiers attachés
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  2. #2
    Membre chevronné
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    avril 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : avril 2009
    Messages : 120
    Points : 641
    Points
    641

    Par défaut

    Cela compile certes, mais avec un nombre considérable de warnings !
    En compilant ton projet tel quel avec tes options, gcc me renvoie 93 warnings, et si je modifie les trois variables comme dans ton exemple, j'obtiens 108 warnings ...

    Maintenant, pour répondre strictement à ta question, cela marche quand même parce qu'un pointeur est codé comme un entier.
    Par exemple, sachant que allocate_1D_i(n) renvoie un pointeur sur un entier :
    int *s=allocate_1D_i(10) est une écriture correcte qui ne déclenche aucun warning, alors que int s=allocate_1D_i(10) est une écriture incorrecte qui déclenche un warning, toutefois, s étant un entier, il est à même de recevoir un pointeur (qui est de fait un entier), puis lorsque tu écrit display_1D_i(s,10,"1D") alors que le premier argument attendu devrait être un pointeur sur un entier et non un entier, cela déclenche un autre warning car le type n'est pas bon, mais cela fonctionne tout de même car l'entier passé (s) sera interprété comme un pointeur.

    Donc, tu as autant de warnings qu'un sapin a de boules brillantes et de guirlandes, mais ton code passe quand même ... pour l'instant !
    Ce n'est pas une raison pour ne pas chasser chacun de tes warnings, car un warning qui traîne est un bug potentiel ...
    << Il n'est pas dans Ses intentions de tout faire, ni donc de nous dépouiller de notre libre-arbitre et de cette poignée de gloire qui nous appartient. >> (Le Prince, Nicolas Machiavel)

  3. #3
    Membre éclairé
    Homme Profil pro Alex V
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    octobre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Nom : Homme Alex V
    Âge : 26
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : octobre 2007
    Messages : 630
    Points : 389
    Points
    389

    Par défaut

    OKay merci. Avant j'étais persuadé que ce genre d'erreurs auraient fait planter le programme.

    Concernant les warnings, ce sont normalement des erreurs dans les printfs duent aux formats d'affichage. Notamment les long double et autres. Je n'arrive as à trouver les formats adéquats.

    Cordialement
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  4. #4
    Expert Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 164
    Points : 35 298
    Points
    35 298

    Par défaut

    Il n'y a pas de format adéquat sous MinGW pour les long double, parce que MinGW utilise le printf() de la CRT Microsoft, et la taille de long double diffère entre les deux compilos.
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •