bonjour,
1)Comment convertir type void en type booléen?
2)Comment convertir type struct en type booléen?
merci de votre aide
bonjour,
1)Comment convertir type void en type booléen?
2)Comment convertir type struct en type booléen?
merci de votre aide
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.
Utilisation de Glade avec Gtk+
Code::Blocks et Gtk+ sous Windows
Programmation orientée objet avec Gtk+ v3
- N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk
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]
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.
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.
Dans ce code: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).
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; }
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]
Bonsoir,
Au passage les variables A, B et C ne sont initialisées nulle part.
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]
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
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.
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) ?Oui mais comme ce sont des globales, elles sont donc initialisées implicitement à 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
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
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]
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![]()
![]()
ce simple code sur gcc 4.7.2 :
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.
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); }
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
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.
Partager