BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
6 mars 2008 à 16:03
LeFauve42
Messages postés239Date d'inscriptionvendredi 20 octobre 2006StatutMembreDernière intervention20 avril 2009
-
11 mars 2008 à 11:46
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
LeFauve42
Messages postés239Date d'inscriptionvendredi 20 octobre 2006StatutMembreDernière intervention20 avril 2009 11 mars 2008 à 11:46
Si ca n'a pas change, le type "int" est suppose etre un entier da la taille native de la plateforme.
Cela a des quelquefois eu des consequences rigolotes. Par exemple sur les premieres versions d'OSF/1 sur DEC ALPHA, les long etaient toujours en 32 bits mais les int etaient en 64...
L'arrivee des "long long" a un peu calme les choses, mais j'avoue que je prefere les "pseudo types" genre __int16 ou __int64. Au moins, on sait vraiment ce qu'on va avoir et on n'a pas de surprises (sauf que la plupart des plateformes ne les reconnaissent pas... Quite a normaliser quelque chose, pourquoi ne pas choisir ce genre de notations ?).
A l'epoque (au millenaire dernier :op) je faisais du portage de SUN vers DEC, et j'en ai [...] des vertes et des pas mures avec ces histoires de tailles :o)
roidec
Messages postés7Date d'inscriptionjeudi 14 février 2008StatutMembreDernière intervention28 avril 2008 10 mars 2008 à 21:52
salut
bon travail amigo continue
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 7 mars 2008 à 18:39
L'accès à une adresse alignée en est assurément une, c'était le but de la remarque.
_dune2_
Messages postés141Date d'inscriptionmercredi 19 juillet 2006StatutMembreDernière intervention20 avril 2011 7 mars 2008 à 18:35
Pour conclure : (je ne veux pas non plus que la source devienne un lieu de débat)
On est donc d'accord que c'est une habitude de codage ;)
Mais je ne pense pas qu'on puisse parler d'optimisation à ce stade ;)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 7 mars 2008 à 18:31
'long' était passé de 2 à 4 quand on est passé du 16 au 32 et on a été nombreux à trouver que c'était le souk pour l'existant. La décision avait alors été prise que tous les types primaires ne bougeraient plus.
En prog Win on a les types Win évolutifs à employer, du genre INT_PTR. C'est une habitude à avoir, rien de plus.
_dune2_
Messages postés141Date d'inscriptionmercredi 19 juillet 2006StatutMembreDernière intervention20 avril 2011 7 mars 2008 à 18:24
Je trouve tout de même que la multiplication des types de variables n'est pas une solution qui va vers une simplification ...
Quelle est la différence entre "int" et "long" sous windows alors ?? Pourquoi avoir 2 types identiques ?
Si c'est pour avoir une pérénnité du code, je l'assure en utilisant tout simplement "int" pour des variables à taille immuable et "long" lorsque je souhaite avoir une variable de taille adapté à l'archi (essentiellement dans le cadre de calculs sur des pointeurs).
++dune2
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 7 mars 2008 à 18:18
Tu dois bien penser qu'on a tous les types qu'il faut pour manipuler pointeurs et faire de l'adressage, __int64, UINT64, DWORD_PTR, etc...
Tout ce qui est pointeur (*ptr) est automatiquement sur 64 bits quand je compile en 64, tout va bon. Les types simples sont par contre immuables, ça garantit la pérennité du code.
_dune2_
Messages postés141Date d'inscriptionmercredi 19 juillet 2006StatutMembreDernière intervention20 avril 2011 7 mars 2008 à 18:09
Oui mais au moins j'ai le choix :
- utiliser un "int" pour rester en 32bits.
- utiliser un "long" pour utiliser une pleine échelle de registres.
De plus, le "long" permet de faire des conversions entre pointeurs et variables, car les pointeurs sont en 64bits. Comment faire un calcul de pointeur si tu n'as pas de type correspondant à sa taille ?
Personnellement, je prefère avoir le choix, et c'est sous la responsabilité du codeur de faire le bon choix ;)
++dune2 (l'échange d'experience forme la connaissance ;) )
shorzy
Messages postés94Date d'inscriptionjeudi 23 novembre 2000StatutMembreDernière intervention 1 juin 2013 7 mars 2008 à 18:08
Pour Répondre à DeAtHCrAsH
-----
// On Rends "Explicitement" la main à Windows
Sleep(8);
-----
Si je ne met pas cette Ligne, La Souris se comporte très Différement
de ce qui est Voulu par le Programme:
Si entre 2 Relevés de Position je ne met pas Sleep()
Alors le Premier Relevé=le Deuxième relevé
Malgrés que sur Windows la Souris est Bougé...
J'ai fais Différents Tests:
Sur Certain, la Souris 'Clignote' autour de sa position au lieu de se Déplacer !!!
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 7 mars 2008 à 18:04
Je me réjouis chaque jour de ne pas être sous un système qui me changera mes identifiants quand je change la plateforme cible.
*((long*) p) = 0xFFFFFFFF;
Je sais que j'adresse 4 octets que je compile WIN32 ou WIN64.
Vraiment sans rancune aucune, bien au contraire.
_dune2_
Messages postés141Date d'inscriptionmercredi 19 juillet 2006StatutMembreDernière intervention20 avril 2011 7 mars 2008 à 17:37
BruNews : "Pour conclure (sur PC Windows) int et long toujours à 4 octets sur 64 bits et restera même si on arrive aux 128 bits."
Mouhahahaaaa ! vive les optimisations de windows (dixi BruNews : "Si on mettait le 'unt' à 2 octets ce ne serait pas une optimisation mais une nuisance surtout en terme de perfs.
Ce code est pour Window qui a fort heureusement et définitivement (comme les autres acteurs majeurs) exclu C99 de ses compilos, int et long resteront à 4 octets.").
Moi je ne sais pas pour windows, mais sous unix :
=========================================
#include <stdio.h>
... J'attend impatiemment l'arrivée des 128bits sous unix (et tous systèmes POSIX) ;) pas vous ?
++dune2 (sans rancune ;) )
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 7 mars 2008 à 09:48
Quote :
// On Rends "Explicitement" la main à Windows
Sleep(8);
=> ce n'est pas tout a fait vrai, en fait tu mets juste le thread principal de ton appli en attente. Windows garde toujours la main sur les allocations mémoires et la gestion des threads.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 6 mars 2008 à 19:14
Dans VS, menu tools options:
Text Editor, All Languages, Tabs
- smart COCHER
- Tab size : 2
Indent size : 2
insert spaces COCHER
shorzy
Messages postés94Date d'inscriptionjeudi 23 novembre 2000StatutMembreDernière intervention 1 juin 2013 6 mars 2008 à 19:07
Salut, je vous remercie de vos Commentaires.
Pour vous dire, j'ai utilisé des long car, d'après ce que j'ai vu :
windows.h utilise la Structure POINT formé de deux LONG,
Les LONG étant des long.
Pour le Code...
---
J'ai déplacé certaines Parties pour vous rendre le Prgm le plus Digeste possible,
Effectivement, je n'aurais pas du Déplacer POINT Ecran comme le Signal "BruNews"
---
Merci à lynxtyle, Appuyer sur VK_SPACE j'y avais pensé mais je ne savais pas comment faire.
---
Voila, pour la mise en page dsl c'est un Copier-Coller de MS_C++
shorzy
Messages postés94Date d'inscriptionjeudi 23 novembre 2000StatutMembreDernière intervention 1 juin 2013 6 mars 2008 à 19:05
Salut, je vous remercie de vos Commentaires.
Pour vous dire, j'ai utilisé des long car, d'après ce que j'ai vu :
windows.h utilise la Structure POINT formé de deux LONG,
Les LONG étant des long.
Pour le Code...
---
J'ai déplacé certaines Parties pour vous rendre le Prgm le plus Digeste possible,
Effectivement, je n'aurais pas du Déplacer POINT Ecran comme le Signal "BruNews"
---
Merci à lynxtyle, Appuyer sur VK_SPACE j'y avais pensé mais je ne savais pas comment faire.
---
Voila, pour la mise en page dsl c'est un Copier-Coller de MS_C++
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 6 mars 2008 à 18:04
Pour conclure (sur PC Windows) int et long toujours à 4 octets sur 64 bits et restera même si on arrive aux 128 bits.
lynxtyle
Messages postés79Date d'inscriptionsamedi 25 septembre 2004StatutMembreDernière intervention31 octobre 20112 6 mars 2008 à 17:58
Désolé d'être aussi pointilleu mais je suis souvant sur des systèmes atypiques... et un int à 2 octets n'est pas forcément une nuisance (quand tu n'as qu'une 100aine d'octets^^)... et pareil utiliser stdint.h peut être sympa sur les nouvelles machines avec N=64bits... vu que le short correspond à un long et le long à un long long... (donc configurer le int à 2 octets resterait très interessant dans ce cas...)
Mais bon on s'éloigne beaucoup du sujet là ^^ pour en revenir à la source on aurait même pu mettre un short et faire un petit tableau à deux dimentions Positions[1][2]... ça aurait était très sympa : Positions[0][] pour les X, Positions[1][] pour les Y... avec quelques boucles ça aurait été un code court qui aurai eu un intêret algorithmique... là je trouve que ça ne fait qu'un code de plus sur la gestion de la souris... J'espère le voir évoluer...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 6 mars 2008 à 17:07
Si on mettait le 'unt' à 2 octets ce ne serait pas une optimisation mais une nuisance surtout en terme de perfs.
Ce code est pour Window qui a fort heureusement et définitivement (comme les autres acteurs majeurs) exclu C99 de ses compilos, int et long resteront à 4 octets.
lynxtyle
Messages postés79Date d'inscriptionsamedi 25 septembre 2004StatutMembreDernière intervention31 octobre 20112 6 mars 2008 à 16:51
c'est pas tout à fait exacte : la place occupée en mémoire par les types entiers n'est pas spécifiée, toutefois la taille du type short et int est d'au moins 2 octets, celle du type long d'au moins 4 octets...
les types d'entiers à taille définie ont été introduits dans le ANSI C99 par l'intermédiaire du fichier en-tête stdint.h qui n'est pas utilisé ici...
donc en clair suivant le réglage du compilateur le int peut faire gagner 2 octets par variable... c'est pas énorme mais bon vive l'optimisation^^
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 6 mars 2008 à 16:37
int ou long c'est idem 4 octets.
lynxtyle
Messages postés79Date d'inscriptionsamedi 25 septembre 2004StatutMembreDernière intervention31 octobre 20112 6 mars 2008 à 16:27
Je dirai une de plus !
Je vais commencer par les bon point (sinon on va dire que je suis méchant si je débarque directement par ce qui va pas^^) :
- le code est bien commenté
Maintenant voilà quelques conseils d'amélioration :
- revois un peu la mise en page car pour un autre code exemple c'est pas joli (moins de grand saut et rester constant dans les espaces)
- par commodité on préfère mettre les fonctions avant le main ou dans une source séparé rajouté avec un include en entête (ainsi quand on lit le code on sait ce que fait la fonction avant de la voir appeler... c'est une commodité)
- rajouter une sortie correcte au programme (histoire de donner un sens à ton "return 0;" final^^) jors rajouter dans la boucle :
"if (GetAsyncKeyState(VK_SPACE)&0x8000)
drapeau = 0;
}while(drapeau == 1);"
pour sortir quand on appuit sur la touche espace
- rajouter un type à tes fonctions ça aussi serait pas mal... ça compilerai plus facilement je pense^^ jors :
"void Deplacement(POINT &P1 , POINT &P2)"
- pourquoi utiliser des long? un int suffit pas pour tes variables? d'ailleur tes variables manquent d'imagination... au minimum un tableau aurai était plus joli^^... et tu aurais pu réduire le code avec des boucles^^
Enfin bon je suis plutot déçu... rien de nouveau et beaucoup de pire... j'espère revoir ce code mais après correction...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 6 mars 2008 à 16:03
POINT Ecran, c'était à calculer 1 seule fois dans le main().
11 mars 2008 à 11:46
Cela a des quelquefois eu des consequences rigolotes. Par exemple sur les premieres versions d'OSF/1 sur DEC ALPHA, les long etaient toujours en 32 bits mais les int etaient en 64...
L'arrivee des "long long" a un peu calme les choses, mais j'avoue que je prefere les "pseudo types" genre __int16 ou __int64. Au moins, on sait vraiment ce qu'on va avoir et on n'a pas de surprises (sauf que la plupart des plateformes ne les reconnaissent pas... Quite a normaliser quelque chose, pourquoi ne pas choisir ce genre de notations ?).
A l'epoque (au millenaire dernier :op) je faisais du portage de SUN vers DEC, et j'en ai [...] des vertes et des pas mures avec ces histoires de tailles :o)
10 mars 2008 à 21:52
bon travail amigo continue
7 mars 2008 à 18:39
7 mars 2008 à 18:35
On est donc d'accord que c'est une habitude de codage ;)
Mais je ne pense pas qu'on puisse parler d'optimisation à ce stade ;)
7 mars 2008 à 18:31
En prog Win on a les types Win évolutifs à employer, du genre INT_PTR. C'est une habitude à avoir, rien de plus.
7 mars 2008 à 18:24
Quelle est la différence entre "int" et "long" sous windows alors ?? Pourquoi avoir 2 types identiques ?
Si c'est pour avoir une pérénnité du code, je l'assure en utilisant tout simplement "int" pour des variables à taille immuable et "long" lorsque je souhaite avoir une variable de taille adapté à l'archi (essentiellement dans le cadre de calculs sur des pointeurs).
++dune2
7 mars 2008 à 18:18
Tout ce qui est pointeur (*ptr) est automatiquement sur 64 bits quand je compile en 64, tout va bon. Les types simples sont par contre immuables, ça garantit la pérennité du code.
7 mars 2008 à 18:09
- utiliser un "int" pour rester en 32bits.
- utiliser un "long" pour utiliser une pleine échelle de registres.
De plus, le "long" permet de faire des conversions entre pointeurs et variables, car les pointeurs sont en 64bits. Comment faire un calcul de pointeur si tu n'as pas de type correspondant à sa taille ?
Personnellement, je prefère avoir le choix, et c'est sous la responsabilité du codeur de faire le bon choix ;)
++dune2 (l'échange d'experience forme la connaissance ;) )
7 mars 2008 à 18:08
-----
// On Rends "Explicitement" la main à Windows
Sleep(8);
-----
Si je ne met pas cette Ligne, La Souris se comporte très Différement
de ce qui est Voulu par le Programme:
Si entre 2 Relevés de Position je ne met pas Sleep()
Alors le Premier Relevé=le Deuxième relevé
Malgrés que sur Windows la Souris est Bougé...
J'ai fais Différents Tests:
Sur Certain, la Souris 'Clignote' autour de sa position au lieu de se Déplacer !!!
7 mars 2008 à 18:04
*((long*) p) = 0xFFFFFFFF;
Je sais que j'adresse 4 octets que je compile WIN32 ou WIN64.
Vraiment sans rancune aucune, bien au contraire.
7 mars 2008 à 17:37
Mouhahahaaaa ! vive les optimisations de windows (dixi BruNews : "Si on mettait le 'unt' à 2 octets ce ne serait pas une optimisation mais une nuisance surtout en terme de perfs.
Ce code est pour Window qui a fort heureusement et définitivement (comme les autres acteurs majeurs) exclu C99 de ses compilos, int et long resteront à 4 octets.").
Moi je ne sais pas pour windows, mais sous unix :
=========================================
#include <stdio.h>
main() {
printf("sizeof(int) : %d\n",sizeof(int));
printf("sizeof(long) : %d\n",sizeof(long));
return;
}
=========================================
- compilation et execution sur une machine 32bits :
cku@encelade:~/test$ uname -m
i686
cku@encelade:~/test$ ./toto
sizeof(int) : 4
sizeof(long) : 4
- compilation et execution sur une machine 64bits :
cku@ambre:~/test$ uname -m
x86_64
cku@ambre:~/test$ ./toto
sizeof(int) : 4
sizeof(long) : 8
... J'attend impatiemment l'arrivée des 128bits sous unix (et tous systèmes POSIX) ;) pas vous ?
++dune2 (sans rancune ;) )
7 mars 2008 à 09:48
// On Rends "Explicitement" la main à Windows
Sleep(8);
=> ce n'est pas tout a fait vrai, en fait tu mets juste le thread principal de ton appli en attente. Windows garde toujours la main sur les allocations mémoires et la gestion des threads.
6 mars 2008 à 19:14
Text Editor, All Languages, Tabs
- smart COCHER
- Tab size : 2
Indent size : 2
insert spaces COCHER
6 mars 2008 à 19:07
Pour vous dire, j'ai utilisé des long car, d'après ce que j'ai vu :
windows.h utilise la Structure POINT formé de deux LONG,
Les LONG étant des long.
Pour le Code...
---
J'ai déplacé certaines Parties pour vous rendre le Prgm le plus Digeste possible,
Effectivement, je n'aurais pas du Déplacer POINT Ecran comme le Signal "BruNews"
---
Merci à lynxtyle, Appuyer sur VK_SPACE j'y avais pensé mais je ne savais pas comment faire.
---
Voila, pour la mise en page dsl c'est un Copier-Coller de MS_C++
6 mars 2008 à 19:05
Pour vous dire, j'ai utilisé des long car, d'après ce que j'ai vu :
windows.h utilise la Structure POINT formé de deux LONG,
Les LONG étant des long.
Pour le Code...
---
J'ai déplacé certaines Parties pour vous rendre le Prgm le plus Digeste possible,
Effectivement, je n'aurais pas du Déplacer POINT Ecran comme le Signal "BruNews"
---
Merci à lynxtyle, Appuyer sur VK_SPACE j'y avais pensé mais je ne savais pas comment faire.
---
Voila, pour la mise en page dsl c'est un Copier-Coller de MS_C++
6 mars 2008 à 18:04
6 mars 2008 à 17:58
Mais bon on s'éloigne beaucoup du sujet là ^^ pour en revenir à la source on aurait même pu mettre un short et faire un petit tableau à deux dimentions Positions[1][2]... ça aurait était très sympa : Positions[0][] pour les X, Positions[1][] pour les Y... avec quelques boucles ça aurait été un code court qui aurai eu un intêret algorithmique... là je trouve que ça ne fait qu'un code de plus sur la gestion de la souris... J'espère le voir évoluer...
6 mars 2008 à 17:07
Ce code est pour Window qui a fort heureusement et définitivement (comme les autres acteurs majeurs) exclu C99 de ses compilos, int et long resteront à 4 octets.
6 mars 2008 à 16:51
les types d'entiers à taille définie ont été introduits dans le ANSI C99 par l'intermédiaire du fichier en-tête stdint.h qui n'est pas utilisé ici...
donc en clair suivant le réglage du compilateur le int peut faire gagner 2 octets par variable... c'est pas énorme mais bon vive l'optimisation^^
6 mars 2008 à 16:37
6 mars 2008 à 16:27
Je vais commencer par les bon point (sinon on va dire que je suis méchant si je débarque directement par ce qui va pas^^) :
- le code est bien commenté
Maintenant voilà quelques conseils d'amélioration :
- revois un peu la mise en page car pour un autre code exemple c'est pas joli (moins de grand saut et rester constant dans les espaces)
- par commodité on préfère mettre les fonctions avant le main ou dans une source séparé rajouté avec un include en entête (ainsi quand on lit le code on sait ce que fait la fonction avant de la voir appeler... c'est une commodité)
- rajouter une sortie correcte au programme (histoire de donner un sens à ton "return 0;" final^^) jors rajouter dans la boucle :
"if (GetAsyncKeyState(VK_SPACE)&0x8000)
drapeau = 0;
}while(drapeau == 1);"
pour sortir quand on appuit sur la touche espace
- rajouter un type à tes fonctions ça aussi serait pas mal... ça compilerai plus facilement je pense^^ jors :
"void Deplacement(POINT &P1 , POINT &P2)"
- pourquoi utiliser des long? un int suffit pas pour tes variables? d'ailleur tes variables manquent d'imagination... au minimum un tableau aurai était plus joli^^... et tu aurais pu réduire le code avec des boucles^^
Enfin bon je suis plutot déçu... rien de nouveau et beaucoup de pire... j'espère revoir ce code mais après correction...
6 mars 2008 à 16:03