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 :

Affichage int* / int** identique


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 467
    Points
    467
    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 : 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
    #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 expérimenté Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Points : 1 372
    Points
    1 372
    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 ...

  3. #3
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 467
    Points
    467
    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 éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    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.

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/03/2014, 21h50
  2. Affichage zone int cadrée sur la droite
    Par frglyon dans le forum Débuter
    Réponses: 6
    Dernier message: 12/10/2012, 18h46
  3. [caml light] ( int -> int ) -> int
    Par ylarvor dans le forum Caml
    Réponses: 5
    Dernier message: 26/11/2009, 19h35
  4. fread(void*, int, int, FILE*)
    Par keil dans le forum C++
    Réponses: 11
    Dernier message: 25/01/2006, 22h13
  5. basic: const int** != int ** ?
    Par toto_fr_2002 dans le forum C
    Réponses: 10
    Dernier message: 14/11/2005, 19h28

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