FAIRE GLISSER LA SOURIS

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 6 mars 2008 à 16:03
LeFauve42 Messages postés 239 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 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.

https://codes-sources.commentcamarche.net/source/45969-faire-glisser-la-souris

LeFauve42 Messages postés 239 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 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és 7 Date d'inscription jeudi 14 février 2008 Statut Membre Dernière intervention 28 avril 2008
10 mars 2008 à 21:52
salut
bon travail amigo continue
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 141 Date d'inscription mercredi 19 juillet 2006 Statut Membre Dernière intervention 20 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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 141 Date d'inscription mercredi 19 juillet 2006 Statut Membre Dernière intervention 20 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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 141 Date d'inscription mercredi 19 juillet 2006 Statut Membre Dernière intervention 20 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és 94 Date d'inscription jeudi 23 novembre 2000 Statut Membre Derniè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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 141 Date d'inscription mercredi 19 juillet 2006 Statut Membre Dernière intervention 20 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>

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 ;) )
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 94 Date d'inscription jeudi 23 novembre 2000 Statut Membre Derniè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és 94 Date d'inscription jeudi 23 novembre 2000 Statut Membre Derniè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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 79 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 31 octobre 2011 2
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 79 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 31 octobre 2011 2
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 mars 2008 à 16:37
int ou long c'est idem 4 octets.
lynxtyle Messages postés 79 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 31 octobre 2011 2
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 mars 2008 à 16:03
POINT Ecran, c'était à calculer 1 seule fois dans le main().
Rejoignez-nous