bonjour tout le monde...
et oui ! encore un problème d'input... mais bon là je galère vraiment...
voilà mon souci, je sais qu'il faut rediriger les interruptions 1 et 5, etc..
bon, pour la une, pas de problème, mais le 5 elle gère les timers non ?
mon problème c'est que je procède à la lecture du clavier dans une boucle se finissant lorsqu'un timer expire... autant dire que je ne peux pas désactiver les timer... pour info, c'est pour un jeu tetris
pour l'instant, je n'ai pas touché à l'AI5 et le programme tourne assez convenablement... mais bon ça ne me semble pas propre du tout...
alors que faire ?
voilà le code qui fait descendre ma pièce..
while (1)
{
OSFreeTimer (USER_TIMER) ;
OSRegisterTimer (USER_TIMER, Timer) ;
while (!OSTimerExpired (USER_TIMER))
{
if (_keytest (RR_ESC)) {running = 0 ; return ;} ;
if (_keytest (RR_RIGHT)) Try2MoveRight () ;
else if (_keytest (RR_LEFT)) Try2MoveLeft () ;
if (_keytest (RR_DIAMOND)) RotateCW () ;
else if (_keytest (RR_2ND)) RotateCCW () ;
OSFreeTimer (BATT_TIMER) ;
OSRegisterTimer (BATT_TIMER, 5) ;
while (!OSTimerExpired (BATT_TIMER)) ;
}
if (Collision ())
break ;
REDRAW_PIECE ;
++CurrPiece->pY ;
REDRAW_PIECE ;
}
ah oui, on m'a parlé de redéfinir l'interruption 5, mais bon, je ne vois pas trop en quoi cela pourrait m'aider... (je débute, hein...)
...donc les timers ne marcheront toujours pas :/
Par contre, tu peux récrire un handler (regarde la doc de DEFINE_INT_HANDLER) qui fait office de compteur.
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
déjà merci les gars pour vos réponses
c'est fait pour le DUMMY_HANDLER, j'ai vu ça et ça marche nickel pour l'AI1
ok pour réécrire un handler, c'est ce qu'on m'avait précédemment conseillé...
je saurais le déclarer et rediriger les AI5 vers lui, ok, mais je ne vois pas QUOI lui faire faire.. ?
je suis désolé, ce n'est pas très clair pour moi toutes ces histoires d'interruptions...
bon alors ça servirait à quoi de définir un nouveau handler ?
il serait censé faire quoi ?
merci de votre patience, hein...
hmm... à mon avis j'ai du mal à comprendre où se situe le conflit entre rowread et l'AI5...
est-ce que tu es en train de me dire que si je redirige l'AI5 vers un simple handler du type
DEFINE_INT_HANDLER(MyInt5)
{
ExecuteHandler (OldInt5);
}
ou bien entendu, OldInt5 est le précédent handler sauvegardé...
alors, mon problème sera résolu ?
j'ai fait ça et mon programme tourne parfaitement !
mais bon, il tournait également sans problème avant que je redirige l'AI5 vers ce handler...
pas très clair pour moi tout ça...
en règle générale, si tu laisses l'AUTO_INT_5 d'AMS (ce que tu fais au post 6), ton programme fonctionnera
mais de temps en temps, un problème peut se poser ; par exemple, ton programme peut croire qu'une touche a été pressée sans que ça n'ait été le cas en réalité (me semble que c'est le genre de bug que ça peut poser)
ok, c'est bien ce que je pensais... mais si je le vire le timer marche autant que que si je redirigeai l'AI5 vers un DUMMY_HANDLER, ok ? en gros, ça marche pas...
alors ma question c'était, comment on garde un timer en redirigeant l'AI5... ??
et si faut définir un nouveau Handler, on met quoi dedans ?
ok !
donc on laisse tomber les OSFreeTimer et compagnie c'est bien ça ?
très bien expliqué en tout cas, merci beaucoup !
je test de ce pas et je vous tiens au courant
et bien cette fois çi j'ai compris !
merci beaucoup pour ces explications..
Bah c'est pas très compliqué, c'est juste un masque de bits...et puis la touche on n'est pas masquable il me semble, donc au pire il suffit de rallumer.
Ca change rien. Même si tu désactives la prise en compte de l'autoint 6 par le processeur via le sr, tu supprimes pas le signal électrique correspondant, et l'asic le verra. Donc il relancera le processeur (qui sera alors libre d'ignorer royalement l'autoint 6 s'il veut, l'important étant qu'il soit relancé).
C'était un exemple. Ce que je voulais montrer c'est que la gestion de l'autoint 6 est totalement dissociée de l'asic qui bloque et relance le processeur.
ouaip, sauf que pendant mon timer je regarde ce qui se passe au niveau du clavier, donc je pense pas qu'il doit trop dormir l'autre...
mais merci en tout cas pour ces précisions...
si je peux mettre mon grain de sel...
dans le handler que tu as marqué, squall... tu mets
DEFINE_INT_HANDLER(mine)
{
compteur++;
}
je sais pas comment certains vont prendre ça, mais un ++compteur à la place marcherait autant, si ce n'est mieux
en effet l'opérateur de pré incrémentation est "bien mois lourd" que celui de post incr, dans la mesure où il n'a pas à faire de copie de l'objet avant de l'incrémenter, et qu'il peut renvoyer directement le résultat de l'incrémentation, au lieu de renvoyer la copie...
pour une telle fonction appellée une 20aine de fois par seconde, le résultat est exactement le même est est plus "propre"
c'était juste pour pinailler !
je ne veux donner de cours à personne, je partage quelque chose que j'ai appris il y a peu et qui m'a fait ouvrir les yeux sur ce qu'était un programmme "bien foutu", et qui peut être utile quand on ne programme pas sur des architextures à 8GHz, non ?
voilà, et encore merci à tous pour votre aide précieuse
Jyaif Le 22/03/2006 à 10:16 là tu est sur le bon forum si tu veux pinailler, surtout quand il s'agit d'optimisation.
au passage, je crois que tu dis n'imp.
désolé squale, un vieux reste de ff8 je suppose, héhé
ouaip, bon, je ne connais pas la signification d'overhead, je me doutais bien que le copmilateur gérait tout seul ce genre d'optimisations, mais bon, tant qu'à faire...
et puis c'est vrai que je taquine quand même mieux le c++ que le c...
au temps pour moi, et vive les i++