Peut-on faire ça avec for? [C++] - C++ - Programmation
Marsh Posté le 06-07-2002 à 18:30:44
break sort de la boucle
continue passe a l'itération suivante si je me souviens bien
Marsh Posté le 06-07-2002 à 20:36:27
continue marche très bien dans ce cas.
Mais niveau rapidité c'est kif-kif avec un test if dans ta boucle dans tous les cas.
Marsh Posté le 06-07-2002 à 20:47:58
kjus a écrit a écrit : Mais niveau rapidité c'est kif-kif avec un test if dans ta boucle dans tous les cas. |
Ca ca m'embete pas, je voulais juste un moyen d'éviter quelques {} trop long.
Marsh Posté le 07-07-2002 à 12:06:56
et ca (j'ai pas testé):
Code :
|
Marsh Posté le 07-07-2002 à 12:08:52
Hercule a écrit a écrit : et ca (j'ai pas testé):
|
Parce que tu ajoutes des booleens a des entiers, toi?
Bravo!
A+,
Marsh Posté le 07-07-2002 à 12:18:33
en effet c'est dangereux
faudrait faire ça je suppose:
Code :
|
Marsh Posté le 07-07-2002 à 12:51:36
en effet
j'avais même pas fait attention, je corrigeais juste l'ajout du booléen
Marsh Posté le 07-07-2002 à 13:28:06
J'ajoute des booleen à des entier, comme on ajoute de float à des entier ou à des unsigned char.
On utilise des entiers comme booleen, ca vous choque pas pourtant .
true=1
false=0 (ca c'est sur)
je sais pas si c'est ANSI, mais dans gcc et sous visual ca marche comme ca.
Pas de boucle ininie, évidement j'avais oublié des parenthéses:
for(int i=0;i<n;i+=((i==x)+1))
et ca marche (testé)
C'est juste du style, et ca ajoute une adition en plus, donc c'est pas top, mais ca marche.
Marsh Posté le 07-07-2002 à 13:32:06
ha ok j'avais pas lu ça comme ça
ça devient ça alors:
for(int i=0;i<n;i+=((i==x)?2:1));
true = n'importe quoi différent de 0
Je ne sais pas si tous les compilateurs mettent d'office 1 pour true.
Il me semble qu'il y a une histoire de -1 parfois... enfin je mélange peut-être avec autre chose...
Marsh Posté le 07-07-2002 à 13:44:53
Dans ce cas la manière précedement donné, autre que la mienne est meilleur.
Marsh Posté le 07-07-2002 à 14:19:40
En effet, normalement false == 0, et true == !0. En fait la valeur de true n'est meme pas sensée etre la meme à chaque fois.
Marsh Posté le 07-07-2002 à 15:02:26
true est stocké sur 1 bit à 1, donc le cast s'il est bien fait
sa passe à 1.
Marsh Posté le 07-07-2002 à 15:04:40
antp a écrit a écrit : ha ok j'avais pas lu ça comme ça ça devient ça alors: for(int i=0;i<n;i+=((i==x)?2:1)); true = n'importe quoi différent de 0 Je ne sais pas si tous les compilateurs mettent d'office 1 pour true. Il me semble qu'il y a une histoire de -1 parfois... enfin je mélange peut-être avec autre chose... |
nan nan, true est -1 des fois.
Marsh Posté le 07-07-2002 à 15:08:41
Hercule a écrit a écrit : true est stocké sur 1 bit à 1, donc le cast s'il est bien fait sa passe à 1. |
Ca m'étonnerait franchement que ce soit stocké sur un seul bit. Les machines fonctionnent généralement par octets, vaut mieux perdre 7 bits que de faire une exception.
Enfin peut-etre que je dis n'importe quoi, mais je pense pas.
Marsh Posté le 07-07-2002 à 15:18:54
lorill a écrit a écrit : Ca m'étonnerait franchement que ce soit stocké sur un seul bit. Les machines fonctionnent généralement par octets, vaut mieux perdre 7 bits que de faire une exception. Enfin peut-etre que je dis n'importe quoi, mais je pense pas. |
En java, les boolean son stockés sur 1 bit. En C/C++ (il me semble que) les bool sont stockés dans des char.
Marsh Posté le 07-07-2002 à 15:19:24
en c++ le compilo le stock sur 1 bit. Sur un octet tu stock 8 boolean, c'est l'avantage du type booleen du c++ sur le c.
Marsh Posté le 07-07-2002 à 15:20:03
R3g a écrit a écrit : En java, les boolean son stockés sur 1 bit. |
Serieux ? T'as une url pour ma culture ?
Marsh Posté le 07-07-2002 à 16:01:57
Hercule a écrit a écrit : en c++ le compilo le stock sur 1 bit. Sur un octet tu stock 8 boolean, c'est l'avantage du type booleen du c++ sur le c. |
A ok, j'ignorais
lorill -> psa d'url comme ça, ça me viens d'un de mes premiers cours de java à la fac.
Marsh Posté le 07-07-2002 à 16:41:57
Hercule a écrit a écrit : en c++ le compilo le stock sur 1 bit. Sur un octet tu stock 8 boolean, c'est l'avantage du type booleen du c++ sur le c. |
ça m'étonnerais qu'une variable bool soit stockée sur 1 bit, à moins que tu en aies plusieurs déclarées l'une après l'autre.
y a pas moyen d'allouer moins de 1 octet, la mémoire est découpée en octets...
D'ailleurs les structures avec des "bit fields", si ça ne tombe pas sur un nombre de bits multiple de 8, il arondit au multiple supérieur en occupation mémoire.
Marsh Posté le 07-07-2002 à 16:49:28
>D'ailleurs les structures avec des "bit fields", si ça ne tombe pas sur un nombre de bits multiple de 8, il arondit au multiple
>supérieur en occupation mémoire.
ben oui, c'est comme ca que ca fonctionne,
je viens de le relire ce matin, sinon il n'y a aucun
interêt à avoir un vrai type BOOL, autant utiliser un char.
Et quand en java on dit qu'un boolean prend 1 bit, ca doit être pareil, mais il faut compter
la structure du garbage collector en plus.
Marsh Posté le 07-07-2002 à 16:51:07
On aura tout lu...
Vas y que je te push un boolean de 1 bit sur le stack, ou que j'alloue 1 boolean de 1 bit...
Mais faut arrêter la cocaine les mecs!
De plus, sous windows, les booleans sont d'offices sur 32 bits pour des raisons de popotte interne avec Microsoft qui les utilise comme des booleans ou comme des valeurs de retours pour des handle, etc, etc...
Un champ de bits pour foutre plusieurs boolean, la a la limite tu pourrais, mais tu ne sais jamais allouer un truc plus petit qu'un byte.
Quel bon délire
Marsh Posté le 07-07-2002 à 16:55:53
Hercule a écrit a écrit : >D'ailleurs les structures avec des "bit fields", si ça ne tombe pas sur un nombre de bits multiple de 8, il arondit au multiple >supérieur en occupation mémoire. ben oui, c'est comme ca que ca fonctionne, je viens de le relire ce matin, sinon il n'y a aucun interêt à avoir un vrai type BOOL, autant utiliser un char. Et quand en java on dit qu'un boolean prend 1 bit, ca doit être pareil, mais il faut compter la structure du garbage collector en plus. |
tu confond pas bit et byte par hasard ?
Marsh Posté le 07-07-2002 à 16:56:31
Il faut lire les gas, j'ai jamais dit qu'on foutait qu'un bit dans le stack.
si t'as un booleen tu le stock dans un octet
si t'as 4 booleen toujour dans le même octet
si t'as 9 boolean tu les stock dans 2 octets.
Si t'a 512 boolean tu les stock dans 64 octet (miracle 1 booleen = 1 bit ).
Marsh Posté le 07-07-2002 à 17:00:03
Merde il insiste
Dans un champ de bits ouai, mais sinon tu peux toujours courir mon coco
Et c'est quoi le registre pour stocker 1 bit?
ah/8?
Marsh Posté le 07-07-2002 à 17:04:06
Ce que vous être en train de dire c'est que c'est mieux d'utiliser les char que les bool, pour stocker un bool !
Marsh Posté le 07-07-2002 à 17:06:40
bhen non char et bool c'est pareil, un octet
mais bool c'est plus pratique pour s'y retrouver
Marsh Posté le 07-07-2002 à 17:23:49
Hercule a écrit a écrit : Ce que vous être en train de dire c'est que c'est mieux d'utiliser les char que les bool, pour stocker un bool ! |
Sans blague, mais alors pourquoi tu utilises un hwnd plutot qu'un longint? Hein? Parce que c'est tous les 2 4 octets... Tout simplement parce qu'on apelle ca un type
Marsh Posté le 07-07-2002 à 17:36:55
je fait
#define bool char
#define true 0
#define false 1
et j'ai crée le type bool du c++ en c, je suis fort...
C'est dans la norme ansi qu'il dise que les bool
peuvent être stocké dans un bitset, c'est pas moi.
Un compilo qui respecte la norme ansi ca cour pas les rues je suis d'accord.
Sinon il n'y a aucun interêt à avoir un vrai type bool.
Moi j'utilise un long pour passer plusieur booleen
à une fonction en même temps (comme opengl).
Si le compilo lui ne veux pas optimiser il n'optimise pas.
hwnd plutot qu'un longint?
Parce que longint est un type de base et pas hwnd (gcc il connait pas si tu fais pas include ..).
Bool n'était pas un type de base en c et il l'est en c++, c'est ca toute la différence.
Marsh Posté le 07-07-2002 à 17:39:53
Hercule a écrit a écrit : je fait #define bool char #define true 0 #define false 1 (...) |
C'est un type bool fort interessant que voila. Et il marche ?
PS: Si tu veux vraiment reproduire le type bool du C++ en C, je ne peux que te conseiller d'utiliser un enum, ca sera beaucoup plus ressemblant.
Marsh Posté le 07-07-2002 à 17:41:28
pardon
#define true 1
#define false 0
Marsh Posté le 07-07-2002 à 17:53:35
Hercule a écrit a écrit : pardon #define true 1 #define false 0 |
niporte nawak
Marsh Posté le 07-07-2002 à 17:57:11
The four predefined Boolean types are Boolean, ByteBool, WordBool, and LongBool. Boolean is the preferred type. The others exist to provide compatibility with other languages and operating system libraries.
A Boolean variable occupies one byte of memory, a ByteBool variable also occupies one byte, a WordBool variable occupies two bytes (one word), and a LongBool variable occupies four bytes (two words).
Boolean values are denoted by the predefined constants True and False. The following relationships hold.
Boolean ByteBool, WordBool, LongBool
False < True False <> True
Ord(False) = 0 Ord(False) = 0
Ord(True) = 1 Ord(True) <> 0
Succ(False) = True Succ(False) = True
Pred(True) = False Pred(False) = True
A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero. If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True.
The remarks above refer to the ordinality of Boolean values?not to the values themselves. In Object Pascal, Boolean expressions cannot be equated with integers or reals. Hence, if X is an integer variable, the statement
if X then ...;
generates a compilation error. Casting the variable to a Boolean type is unreliable, but each of the following alternatives will work.
if X <> 0 then ...; { use longer expression that returns Boolean value }
var OK: Boolean { use Boolean variable }
...
if X <> 0 then OK := True;
if OK then ...;
Marsh Posté le 07-07-2002 à 18:14:57
Ouais mais bon là tu parles de Pascal, il va te sortir qu'en C++ ça ne prend qu'un bit contrairement au Pascal.
Marsh Posté le 07-07-2002 à 18:16:09
ben non son code c'est de l'ansi
Marsh Posté le 07-07-2002 à 18:17:35
De l'ANSI C'est du pascal plutôt...
Marsh Posté le 07-07-2002 à 18:21:41
c'était ironique...
Dans la norme true c'est bien 1 en entier, et 0 pour false.
Marsh Posté le 07-07-2002 à 18:36:14
http://www.eastcoastgames.com/cpp/chapter2.html
a+
Marsh Posté le 06-07-2002 à 18:25:40
Peut-on sauter toute un tour d'un for pour le continuer plus loin sans passer par un gros if?
Genre remplacer ça par quelque chose de plus présentable:
Du genre:
Peut-être en utilisant break... Mais c'est de la pure théorie
Message édité par Alload le 06-07-2002 à 18:26:34