Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Langages » C & Cie. » Rendre le contrôle au bios en sortie de programme

Freem
Modérateur
Citer Windows NT Firefox 2 - Posté le 04/11/2007 à 13:51
par Amwus:


Bonjour ! Désolé pour ce long silence j'ai eu pas mal de boulot ces derniers temps, pas bcp le temps de coder !

Merci pour toutes vos informations utiles. Je vais un peu me renseigner sur les diverses méthodes proposées ici.

En attendant le programme définitif, j'en fais un temporaire qui fonctionnera avec le kernel 2.6.23 et sans fichier de config, parce que les commandes de controle du ventilo ont changé dans ce noyau. Bref, j'utilise nanosleep pour lire les températures toutes les 3 secondes.

Et je fais une boucle de ce type, mais ça ne fait pas exactement ce que je veux :


int c;

while ((c = getchar) != EOF)) {
while (1) {
//Lire les températures et changer la vitesse du ventilo si besoin
}
}
// rendre le controle automatique au bios
...


ce que je voudrais, c'est que je tape control-C, il rende le controle au bios avant de quitter le programme.
Mais là, il quitte directement le programme. Logique me direz vous.
Y a -t- il aussi moyen de faire en sorte que lorsque je tape 'q', ça quitte ? Parce si je rempalce EOF par 'q', ça ne fonctionne pas non plus...

J'avais déjà réussi à le faire dans un programme, mais je ne sais plus comment...

Un autre probleme est aussi que je dois taper sur une touche pour lancer l'exécution de la boucle... Y a -t- il moyen de l'éviter ?

Merci d'avance ! (cool)

Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Francesco
Modérateur
RemonterCiter Windows XP Firefox 2 - Posté le 04/11/2007 à 14:11
Le remplacement de EOF par 'q' ne marche pas, et c'est normal.
Regarde bien ton code : tu as 2 boucles while imbriqués, dont la seconde est en fait une boucle infini. Tu n'en sort jamais !

Bilan, si le premier caractère que tu as n'est pas un EOF ou un 'q', alors tu lis la température et ajuste la vitesse du ventilo dans une boucle infini. Tu ne reviens pas dans le test du premier while.

et l'appelle de la fonction getchar c'est "getchar()" et non "getchar" qui représente l'adresse de la fonction (selon les options passé au compilo, dans le cas de gcc, c'est soit une erreur, soit un warning, soit rien du tout)
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 04/11/2007 à 14:41
Oui je sais que c'est une boucle infinie, mais si met mon code dans la première boucle, il faudra que je tape quelque chose au clavier pour relire les températures...

Pour le getchar(), c'est une erreur ici sur le forum, correct dans mon code... Qu'est ce que je peux faire concrètement pour sortir de la boucle à l'appel d'une touche ?
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Freem
Modérateur
RemonterCiter Windows NT Firefox 2 - Posté le 04/11/2007 à 14:50
Pour ce qui est de gérer la détection de l'appui sur une touche, il y à la fonction kbhit() du l'API C, qui pouurait t'aider.
Ensuite, je pense que tu ferais mieux d'utiliser une do...while comme 1ere boucle, sinon, tu devras appuyer sur une touche pour entrer, puis sur 2 touches pour sortir.
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Francesco
Modérateur
RemonterCiter Linux Mozilla 5 - Posté le 04/11/2007 à 16:16
kbhit, c'est portable ?

Sinon, pour répondre à ta question Amwus, tu peux aussi faire de la programmation multithread. Une tâche qui gère le ventilo, qui est executer toutes les x secondes, et ta boucle principale, qui prend les commandes. Tu as plusieurs possibilité pour ca :
- fork (*nix)
- create_thread, de la norme POSIX, donc portable.

[HS]
Mon dieu, j'ai osé posté pendant que j'étais sur Windows ! lol. Faudra que je pense à le virer un jour (langue)
[/HS]
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 04/11/2007 à 17:27
J'avais même pas pensé au do while pour ne pas devoir taper sur une touche ! Rolalala c'est honteux. Bon je vais me pencher sur ces méthodes... merci bien...

Freem va me dire que je pose encore une autre question, mais 10 000 posts sur un meme programme ça va pas non plus ! (héhé

Si mes températures sont dans un vecteur temp_vect[16], comment feriez vous pour vérifier que l'une d'elle ne dépasse pas une limite ? Pour l'instant je parcours tout avec un simple for, mais il y a peut etre mieux... Toute idée est la bienvenue...

Merci !
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Francesco
Modérateur
RemonterCiter Linux Mozilla 5 - Posté le 04/11/2007 à 17:39
Parcourir l'ensemble des valeurs est sans doute la méthode la plus simple.

Pour éviter de parcourir la liste, tu peux utiliser un compteur. Lorsque tu modifie la température à l'emplacement j pour y mettre la valeur T, alors,
- avant modification, si temp_vect[j] > T_max, tu décrémentes le compteur
- temp_vect[j] = T
- si T > T_max, tu incrémentes le compteurs.

Ainsi, sans parcourir l'ensemblre de la liste, tu peux savoir :
- si il y a des températures supérieures à la température max (compteur > 0);
- le nombre de température supérieure à la température max.

Bon, ensuite tout dépend comment tu gère ta liste de température. Mais quoi qu'il en soit, dans ton cas, je préviligirais la technique de la boucle for. Car tu ne lis ton vecteur qu'une fois toute les 3s, et ce n'est pas avec une boucle contenant 16 itérations que ton système sera surchargé (sourire)

Qui plus est, niveau maintenant de code, cela sera sans doute plus simple...
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Freem
Modérateur
RemonterCiter Windows NT Firefox 2 - Posté le 04/11/2007 à 17:47
Francesco, pour répondre à ta question sur la portabilité de kbhit: http://msdn2.microsoft.com/en-us/library/ms235390(vs.80).aspx
En gros ils disent que c'est POSIX (et dépassé, aussi, pour visual, mais moi, je dirai que c'est visual qui pue...), donc si la norme POSIX est portable, kbhit aussi (clein d'oeil)
Sinon, pour en revenir au sujet, j'utiliserai aussi la boucle for, mais ca dépends à quoi c'est censé servir (sourire)
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 04/11/2007 à 18:44
En fait, j'ai finalement simplement fait une recherche de maximum dans ma boucle for.

Donc j'ai une fonction qui me renvoit la température maximum et j'en ai une autre qui à partir de cette température définit la nouvelle vitesse du ventilo. Mais... cette dernière n'est pas encore tout à fait au point... Je suis dessus...

Plus que ça et techniquement ma gestion de ventilo fonctionnera. Il ne restera plus que le probleme du controlC...
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Francesco
Modérateur
RemonterCiter Linux Mozilla 5 - Posté le 04/11/2007 à 19:56
Microsoft et ses normes. Ayant fait un man kbhit et ayant un petit message me signalant que cette page du manuel n'existe pas, j'ai fait une rapide recherche google.

http://c.developpez.com/faq/?page=clavier_ecran#SCREEN_ecoute_clavier_unix

En gros, cette commande est dispo sous Windows, mais pas sous *nix, bien qu'il soit possible de la simuler.

Ensuite, sur le lien que tu as donné Freem, il fait référence à la fonction _kbhit qui serait défini dans le standard ISO C++. Personnellement, j'y crois pas trop. J'essai de trouver la norme et je vous tiens au courant.
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Freem
Modérateur
RemonterCiter Windows NT Firefox 2 - Posté le 04/11/2007 à 19:59
hum... t'as peut etre raison...
Mais sinon il est possible de rendre non bloquant les truc comme getchar,scanf & co...
Je sais plus comment, faudrai que je regarde mes cours, mais je sais pas si je les ai encore (cool)
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2008 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,037 s - Crédits - Stats
1 connecté