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 :

comment convertir type void ou struct en type booléen?


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut comment convertir type void ou struct en type booléen?
    bonjour,

    1)Comment convertir type void en type booléen?
    2)Comment convertir type struct en type booléen?


    merci de votre aide

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.



    Donne-nous au moins une ligne de code, voir deux si ça ne te déranges pas . On pourra alors peut-être te donner une réponse.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Tu as des questions assez pharaoniques toi. Quand ce n'est pas comment écrire dans la dernière case de ma RAM c'est comment convertir un type void (donc un truc qui n'existe pas) en booléen. Tu sais que tu es en bonne voie pour devenir notre clown 2022 ?...

    Donc le type "void" (1), type qui ne peut s'appliquer qu'à une fonction (parce que pour une variable, dire "cette variable n'a pas d'existence" c'est un petit peu et inutile et surtout impossible) est un type particulier permettant de dire "cette fonction ne retourne rien". Or convertir un "rien" (un truc qui n'existe pas) en booléen (truc valant vrai ou faux) c'est un petit peu difficile donc les concepteurs du C ont préféré faire l'impasse là dessus. Cela t'avait déjà été dit ici par koala01 qui écrit "car la fonction écrit est de type void, ce qui signifie qu'elle ne renvoie aucune donnée. Ce qui va forcément poser problème vu que l'on va essayer de tester ... la valeur renvoyée par cette fonction". (1)JAttention, je parle bien du type "void" et non pas du du type "void étoile" qui n'est pas du tout la même chose...

    Pour un type struct lui c'est déjà un truc un petit peu plus consistant. Donc oui on peut convertir un type struct en booléen. Suffit de le tester simplement car comme je l'avais dit ici, toute valeur non nulle est considérée comme vraie. Sauf qu'ayant du mal à voir comment une variable de type struct pourrait valoir 0 (donc du mal à voir comment elle pourrait être considérée comme faux) je me demande à quoi un test qui est toujours vrai peu en réalité servir. Peut-être si tous ses membres sont à 0 ça peut le faire mais je n'ai même pas envie d'essayer car si je remonte la réflexion au niveau au dessus, je ne vois pas à quoi cela servirait pour un algo de tester cela. Ben oui, j'ai du mal à imaginer un algo qui ferait un choix crucial selon le fait que ma variable de type struct a ou n'a pas tous ses champs à zéro. Faire un choix sur une valeur particulière d'un champ particulier de ma structure oui, cela peut s'envisager, mais selon le fait que tout est (ou n'est pas) à zéro là...

    Mais bon, comme tu l'as si bien dit, vu que je raconte n'importe quoi...
    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 expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour
    Le type void peut être appliqué ou utilisé avec une variable de type adresse (un pointeur) pour signifier ou indiquer une absence d'information sur le type des données à l'adresse qu'admet la variable.



    • Il peut être utilisé comme type de fonction comme déjà mentionné pour indiquer que la fonction ne retourne rien




    • Il peut aussi être utilisé comme argument d'une fonction pour signifier que la fonction n'admet aucun argument




    • Il peut également être utilisé sous cette forme (void) « cast » sur des fonctions pour indiquer au compilateur que nous ignorent volontairement la valeur de retour d'une fonction ou ne souhaitant pas utilisé la valeur de retour de la fonction.

    à bientôt.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  5. #5
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Le type "void" peut-être utilisé sous sa forme pointeur comme "pointeur générique"... c'est surtout utile dans le cadre de l'utilisation des fonctions pour ne pas devoir écrire une fonction pour chaque type de données manipulées dans un programme donné (surtout avec des listes chaînées qui peuvent contenir des données qui ne sont pas toutes du même type).

    La fonction Compare(), par exemple, pourrait (à l'instar du polymorphisme en Orienté Objet) s'écrire void* Compare(void*,void*) pour retourner "n'importe quoi" et accepter "n'importe quoi" comme type de données en paramètres.
    Toute la difficulté consiste à implémenter cette fonction pour être "vraiment générique"... c'est pas évident à mettre en oeuvre mais avec du courage c'est possible.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut
    Tu as oublié aussi d'ouvrir un bouquin de C élémentaire avant de faire du C avancé (retour de structures, etc), bouquin expliquant aussi qu'en C de base, toute valeur non nulle est considérée comme vrai (c'est aussi le cas en C avancé sauf que là on ne le dit plus tellement c'est devenu implicitement connu).
    Dans ce 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
     
     
    #include <stdio.h>
    #include <string.h>
     
    int A,B,C;
     
    struct vecteur3{
      int x;
      int y;
      int z;
    };
     
    typedef struct vecteur3 vecteur;
     
    vecteur fonction(int a,int b,int c){
      vecteur V;
      V.x=a;
      V.y=b;
      V.z=c;
      return V;
    }
     
    int  main(void) {
      printf("Hello World\n");
     
      //si fonction est appelée
     if (fonction(A,B,C) ) //là ça ne marche pas bien que fonction(A,B,C) retourne quelque chose de non nul donc vrai
      {
          printf("fonction appelée"); 
      }
      else {
          printf("la aussi, la fonction a été appelée");
      }
      return 0;
    }

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tabkelm Voir le message
    Dans ce code...
    Mouais. Y a-t-il là une question? Ou même y a-t-il ne serait-ce qu'un simple verbe pour avoir alors une simple phrase?

    Ok, il ne compile pas parce que la fonction retourne une structure et que, contrairement à ce que je pensais, une structure n'est pas assimilable à un booléen (used struct type value where scalar is required). C'est vrai j'ai donc dit n'importe quoi. Tu dois être excité comme une petite puce d'avoir réussi à le démontrer
    Et donc? Où est-ce que cela nous mène? Parce que (remontons comme je l'ai dit un niveau au dessus) qu'est-ce que tu cherches à faire en réalité? Qu'est-ce que tu veux donc tester avec ton if (fonction(...))? Si elle a été appelée? Ben évidemment qu'elle l'a été. Si elle a retourné une structure? Ben évidemment qu'elle l'a retournée (c'est son travail). D'ailleurs ton code montre assez bien que ce test ne mène nulle part avec ton superbe "si oui la fonction a été appelée et si non alors là aussi la fonction a été appelée". J'ai rarement vu une alternative plus inutile dans un programme...

    Donc bon ben voilà. Un truc n'ayant aucune utilité logique, plutôt normal qu'il ne puisse pas se faire. De mon côté n'ayant jamais eu l'idée de programmer un truc aussi stupide, c'est assez naturel que je ne sache pas comment ce code se comporterait avant de l'avoir essayé. Bref ma seule erreur a été de penser que tu avais un vrai besoin intelligent et d'essayer pour y répondre de faire une extrapolation gratuite à partir d'une base connue (une valeur nulle est considérée fausse et non nulle vraie) en pensant qu'elle s'adapterait à une structure, chose qui ne peut pas se faire parce qu'en réalité on n'a pas besoin de le faire.

    Donc la prochaine fois, au lieu de nous poser un problème XY, dis-nous plutôt ce qui te pose souci et non pas comment coder les trucs tordus que tu as imaginé pour les résoudre.
    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]

  8. #8
    Membre éprouvé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 375
    Points : 1 030
    Points
    1 030
    Par défaut
    Bonsoir,


    Au passage les variables A, B et C ne sont initialisées nulle part.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xdelatour Voir le message
    Au passage les variables A, B et C ne sont initialisées nulle part.
    Oui mais comme ce sont des globales, elles sont donc initialisées implicitement à 0 (petite particularité des globales). Et même si je n'adhère pas à cette façon de faire, il n'en demeure pas moins qu'elles sont quand-même initialisées.
    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]

  10. #10
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 324
    Points : 4 134
    Points
    4 134
    Par défaut void Simpson(Idee_t Dummy);
    Bonjour,

    Pour mettre mon grain de sel sur un plat sans intérêt, j'ajouterais que déclarer des globales pour n'être utilisées que dans une seule fonction (fusse le main() ) n'est pas vraiment recommandé.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Dernière chance de te faire comprendre quelque chose avant qu'on perde tous patience...
    Le langage C n'est pas magique, et il te manque clairement des bases vues les questions que tu poses.
    Poser des questions n'est pas un problème, mais si tu ignores les réponses je vois pas l'intérêt de les poser ?
    Et s'il faut aller à la pêche aux informations de base à chaque fois, ça va pas le faire non plus.
    Doit-on rappeler que les personnes qui intéragissent ici sont bénévoles ?

    Pour ton problème actuel, est-ce que tu te rends compte que ce que tu racontes n'as absolument aucun sens en simple bon français ?
    "Comment je peux transformer le vide/rien en vrai ou faux ?"
    "Comment je peux transformer une structure en vrai ou faux ?"
    Tu sais ce que ça veut dire vrai ou faux ? Et ce qu'est void ? Et une structure ???

    Tu sembles avoir un peu semblant de bon sens en fournissant ton code pourtant..
    //là ça ne marche pas bien que fonction(A,B,C) retourne quelque chose de non nul donc vrai.
    Mais "ça marche pas bien" n'a jamais été un message d'erreur
    Et l'ordinateur fonctionne en binaire, ça marche ou pas, pas à moitié.
    Non fonction(A,B,C) ne retourne pas quelque chose de non nul, ça retourne un vecteur, et c'est tout. Que vecteur soit non nul ou non, le compilateur n'en sait rien du tout, c'est un type nouveau, pour lequel rien n'est défini.
    Et donc si vecteur est nul, il devrait être faux ? Et comment on décide si vecteur est nul ?

    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 434
    Points : 43 068
    Points
    43 068
    Par défaut
    Oui mais comme ce sont des globales, elles sont donc initialisées implicitement à 0
    c'est valable pour toutes les normes C ou que les récentes ça ? et dans le cas d'un char par exemple, il vaut également 0 (enfin plutôt \0) ?
    Je suis pas programmeur.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    c'est valable pour toutes les normes C ou que les récentes ça ?
    Du plus loin que je me souvienne ça l'a toujours été. Seule la variable locale de base n'est pas initialisée avec une valeur spécifique. Toutes les autres (statiques, globales) sont initialisées à 0 si le programmenr n'a pas mis d'autre valeur.
    Ceci dit, cela ne coûte rien de présumer que ce n'est pas le cas et forcer l'initialisation. Le meilleur risque est celui qu'on ne prend pas

    Citation Envoyé par chrtophe Voir le message
    et dans le cas d'un char par exemple, il vaut également 0 (enfin plutôt \0) ?
    Un char n'est qu'un nombre codé sur 8 bits. Donc oui lui aussi il est initialisée par défaut à zéro. Et tu as le droit d'écrire ce zéro de la façon qui te fait plaisir (0, ou 0x00, ou '\0'), aucune écriture n'a le privilège de la véracité (c'est plus une question de convention qu'autre chose). Mais si tu écris '\0' il ne faut pas oublier les quotes simples car ce sont elles qui font la différence.
    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]

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    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 629
    Points : 10 554
    Points
    10 554
    Par défaut
    De mes souvenirs de Visual C++ (2003, 2005 et 2008), l'initialisation des variables par défaut ne se fait que pour 1 compilation "Debug" et non pas pour 1 "Release".
    C'était assez marrant de voir le code de son collègue foiré en prod ou pré-test et de le voir chercher pendant de longues minutes l'initialisation loupée

  15. #15
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 434
    Points : 43 068
    Points
    43 068
    Par défaut
    ce simple code sur gcc 4.7.2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
     
    int var;
     
    int main()
    {
        printf("var : %d\n",var);
    }
    retourne bien 0. et si je déplace la déclaration de var dans int, la valeur n'est jamais la même, comme le comportement décrit par Sve@r.
    Si j'ajoute la directive -std=c89 : même résultat.

    Je suppose donc que c'est bien la norme, non respectée par Visual C++. a moins que le comportement ne soit pas le même en c++.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  16. #16
    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
    La norme spécifie la valeur par défaut des variables globales, et ne spécifie rien pour les variables locales.
    Visual C++ tend à mettre les variables locales non-initialiser à 0xCCCCCCCC en mode Debug justement pour détecter ces problèmes, et à ne pas y toucher en Release, et ces deux comportements respectent la norme.

    D'ailleurs, de mémoire un crash immédiat respecterait la norme aussi.
    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: 2
    Dernier message: 10/04/2007, 12h39
  2. comment convertir un variant de type NULL en double
    Par pierrot67 dans le forum Bases de données
    Réponses: 6
    Dernier message: 03/11/2006, 12h37
  3. comment convertir type string to Hkey ? :(
    Par xenoali dans le forum Delphi
    Réponses: 2
    Dernier message: 17/10/2006, 14h16
  4. [C#] Comment convertir un type long en DateTime ?
    Par guillaume16 dans le forum C#
    Réponses: 4
    Dernier message: 22/06/2006, 14h45
  5. Réponses: 10
    Dernier message: 04/05/2006, 23h55

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