Comment utiliser la souris avec torbo c

ElSultan Messages postés 1 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 4 mai 2009 - 1 juin 2008 à 16:32
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 1 juin 2008 à 20:23
salut!
je veux utiliser la souris dans un programme avec turbo C.
le principe que j'utilise est de subtituer le gestionnaire originale
de l'interruption 1C par mon gestionnaire de souris avec la syntaxe 
_dos_setvect(0x1C,gestionnaire);

Ainsi l'interruption 1C qui est génerer automatiquement chaque tick (1/18.2 secondes)
d'hologe exécutera ma fonction getionnaire dont le role est de verifier
 si on a appuyer sur un bouton de la souris.
Mais le programme se plante chaque fois au moment de changer
l'addresse qui se trouve dans le vecteur de l'interruption 1C ;
c'est à dire au niveau de l'instruction _dos_setvect(0x1C,gestionnaire);

Si quelqun voit quel est mon problème q'il m'aide.
Oubien si il y'a une autre solution pour integrer la souris à une application
avec turbo C je suis preneur.

1 réponse

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
1 juin 2008 à 20:23
Salut,

Autant commencer par le début : je n'ai jamais utilisé Turbo C.

Supposons que ce soit l'appel _dos_setvect(0x1C,gestionnaire) qui plante...

D'une manière générale, une fonction plante quand on lui passe des arguments incorrects, ou lorsque l' "environement" n'est pas près pour l'exécution de cette fonction.

Globalement, ce que doit faire ta fonction, c'est mettre en place Gestionnaire, autrement dit une adresse, à un endroit qui dépend du premier argument, qui est très certainement valide dans ton cas.

Il y a de bonne chance pour que le fait de mettre 12 ou gestionnaire en deuxième argument ne soit pas plus suceptible qu'autre chose de faire planter ton programme. Tout ce que peut faire la fonction pour s'assurer de la validité du deuxième argument, c'est lire quelques octets à cette adresse, ce qui serait mal élevé. Pour que le deuxième argument passe si c'est lui qui pose problème, il faut s'assurer qu'il a le bon prototype comme définit un peu plus bas.

Donc je ne pense pas une seconde que ce soit _dos_setvect qui plante.

Je soupçonne par contre fortement que le problème se situe 1/18.2 secondes plus tard...

Le code ci-dessous, inspiré de ça, devrait passer sans problème, et te permettra de t'assurer que la fonction marche très bien.

#include "dos.h"

void _interrupt _far Gestionnaire(void)
{

}

void (_interrupt _far *old_isr)();   // Sauvegarde de l'ancien ISR

void main(void)
{
  // Sauvegarde du isr courant
  old_isr = _dos_getvect(0x1C);        

  // Mise en place de notre handler 
  _dos_setvect(0x1C, Gestionnaire);     

  // Remise en place du vieux isr
  _dos_setvect(0x1C, old_isr);

  exit(0);
}
0
Rejoignez-nous