comparer deux nombre - C - Programmation
Marsh Posté le 06-07-2016 à 21:15:09
O mon dieu... D'après Wikipédia PFE c'est un projet à la fin des études en école d'ingénieur, c'est vraiment pas rassurant.
http://www.google.fr/search?q=op%C [...] +langage+c
Si ça ne fonctionne pas faut donner plus de détails (exemple court mais complet).
Marsh Posté le 07-07-2016 à 10:37:58
Je pense que le pb se situe sur la conversion en int ou float du nb saisi. Le nb renvoyé par le capteur est bien un nombre alors que le nb saisi est une chaîne de caractères. Si tu fais une comparaison d'une string avec un float, le compilo va caster la string en convertissant chaque caractère de la chaîne dans son équivalent ASCII.
Edit : je confirme que normalement, le PFE est le projet qu'on fait en dernière année d'école d'ingé, sur toute l'année, à raison de 2j par semaine. Mais vu la description de son projet, je doute que ça occupe pendant 2j/semaine sur plusieurs mois
Marsh Posté le 07-07-2016 à 12:52:38
rufo a écrit : Je pense que le pb se situe sur la conversion en int ou float du nb saisi. |
Possible, j'y ai pensé, mais même, sur internet on doit trouver suffisamment d'infos, d'autant qu'on a dû voir ça en cours aussi...
Citation : Le nb renvoyé par le capteur est bien un nombre alors que le nb saisi est une chaîne de caractères. |
ou pas, selon le keypad, le branchement, le code... Impossible de dire avec si peu d'infos. (Il disait "keypad", donc je suppose qu'il ne parle pas d'un clavier sur ordi avec liaison série.)
Citation : Si tu fais une comparaison d'une string avec un float, le compilo va caster la string en convertissant chaque caractère de la chaîne dans son équivalent ASCII. |
et afficher un warning - à condition de lui avoir demandé
edit: J'avais un gros doute donc j'ai vérifié, ça ne compile même pas:
Code :
|
-->tst.c:9:8: error: invalid operands to binary > (have 'char *' and 'float')
Marsh Posté le 07-07-2016 à 15:11:42
Merci infiniment pour vos réponse voici un extrait de ce programme:
for(i=0;i<2;i++){ //programme d'écire à l'aide du clavier
while (number[i] == 0)
{number[i] = Keypad_key_Click();}
if(number[i]==1) number[i] = '1';
if(number[i]==2) number[i] = '4';
if(number[i]==3) number[i] = '7';
if(number[i]==4) number[i] = '*';
if(number[i]==5) number[i] = '2';
if(number[i]==6) number[i] = '5';
if(number[i]==7) number[i] = '8';
if(number[i]==8) number[i] = '0';
if(number[i]==9) number[i] = '3';
if(number[i]==10) number[i] = '6';
if(number[i]==11) number[i] = '9';
if(number[i]==12) number[i] = '#';
Lcd_Chr(2,i+1, number[i]);
}}
void main() {
LCD_init(); ADC_init(); Keypad_init();
LCD_cmd(_LCD_CURSOR_OFF);
while(1){
TRISB.F7=1; if(portb.f7=1) goto loop2;
loop1: {
LCD_cmd(_LCD_CLEAR);
LCD_out(1,1,"A=" );lcd_out(2,1,"B=" );
lcd_out(1,6,"%" );lcd_out(2,6,"%" );
a=ADC_read(0); // programme d'affichege sur LCD
a>=0;a<=992;
if(a>992){aa=100;aa3=(aa/100);lcd_chr(1,3,aa3+48);aa2=((aa/100)-1);lcd_chr(1,4,aa2+48);aa1=((aa/100)-1);lcd_chr(1,5,aa1+48);}
else {
aa=a/10;
aa3=aa/100;
lcd_chr(1,3,aa3+48);
aa2=aa/10;
lcd_chr(1,4,aa2+48);
aa3=aa-(aa2*10);
lcd_chr(1,5,aa3+48);
delay_ms(300);
lcd_cmd(_LCD_CLEAR);
lcd_out(1,1,"maintenir start" ); lcd_out(2,1,"pour commencer" );if(portb.f7=1) goto loop2;
delay_ms(300);
if(portb.f7=1) goto loop2;
goto loop1;
}}}
Marsh Posté le 07-07-2016 à 15:44:51
Merci d'utiliser les balises code
Edit : raaaahhhh, des goto dans un programme en C
Marsh Posté le 07-07-2016 à 17:56:44
j'ai rien compris Mr rufo?
veuillez clarifier votre réponse..ya des goto?..ou est le problème; désolé pour les couleurs, je n'est pas de problème vec la couleur noire..
Marsh Posté le 07-07-2016 à 22:04:50
Utilise les balises code pour rendre ça plus lisible, indente, commente.
De même, les instructions goto comme soulevé précédemment sont à éviter. La seule chose que ça rapporte c'est un programme bancal et la preuve que tu es passé vite sur l’algorithmie.
Sans plus d'informations, je penche également pour un soucis de comparaison entre variables de types différents.
Note que si je ne m'abuses tu ne compare pas des chaînes mais des caractères. Dans ce cas tu peut simplement utiliser les codes ASCII à ton avantage (un char n'est autre qu'un int "déguisé" ).
Marsh Posté le 07-07-2016 à 22:10:09
samjabr a écrit : ya des goto?..ou est le problème |
Le goto donne du code spaghetti, c'est une très mauvaise habitude d'en utiliser et on peut toujours faire sans.
Citation : désolé pour les couleurs, je n'est pas de problème vec la couleur noire.. |
utilise le bouton
Ce code... sans commentaire. C'est bien triste pour un projet en fin d'école d'ingé. Tu as réussi à compiler ça?
>//programme d'écire à l'aide du clavier
???
En plus ce bout de code est en dehors de toute fonction et il y a une erreur au niveau des accolades.
>a>=0;
>a<=992;
statement without effect. Active les warnings!!
>a, aa, aa2, aa3 et tout le premier bloc (a>992)
WTF?
>goto loop2;
défini null part
Tu ne donnes pas la définition de tes variables. Et tu veux comparer quoi exactement?
Simple curiosité, c'est quoi le projet?
edit: Comment peut-on convertir ce "nombre" saisi par le clavier en nombre? Déjà convertir les deux "chiffres" qui sont des codes ASCII dans leurs valeurs numériques respectives (le 0 c'est 48 comme tu semble savoir), ensuite en faire un nombre avec un peu de maths: dizaines*10+unités.
edit tardif orthographe
Marsh Posté le 08-07-2016 à 00:27:37
Je fait ma programmation avec mikroC pour programmer un micro-controlleur pic16f887a... aa3 , aa2 , aa1 sont des caractère qui permettent l'affichage dans le LCD la valeur d'un capteur de pression (entrer analogique) avec aa3:centainnes ; aa2:dizaines ; aa1:unités.
j'ai faisais bien sur la compilation ça travail exellent.
Merci de me donner des réponses plus utiles.
Marsh Posté le 08-07-2016 à 01:48:09
samjabr a écrit : a... aa3 , aa2 , aa1 sont des caractère qui permettent l'affichage dans le LCD la valeur d'un capteur de pression (entrer analogique) avec aa3:centainnes ; aa2:dizaines ; aa1:unités. |
C'est très explicite. Je suppose que ce sont des variables globales en plus?
Citation : j'ai faisais bien sur la compilation ça travail exellent. |
Ton code comme tu l'as posté ne compile certainement pas. Première réponse de ma part: "exemple court mais complet" Et on ne doit pas avoir la même définition de "travail exellent".
a=1002 --> affichage 100
a=999 --> affichage 100
a=993 --> affichage 100
a=500 --> affichage 050
a=327 --> affichage 032
a=99 --> affichage 009
a=7 --> affichage 000
Parfait!
Citation : Merci de me donner des réponses plus utiles. |
Regarde mon edit...
Marsh Posté le 08-07-2016 à 12:06:52
Mr rat de combat vous êtes le plus proche de l'idée principal Merci.
mais la tolérence du capteur m'oblige cette intervention, ainsi que l'orsque le capteur me donne '0 volts' --> a=0 (décimal); l'orque le capteur est au max '5 volts' --> a=1023; je veux afficher de 0 à 100 %...quel methode vous me recommander. Merci infiniment
Marsh Posté le 08-07-2016 à 14:39:21
Ben une simple règle de 3 (proportionnalité), non
Marsh Posté le 08-07-2016 à 15:08:07
vous avez raison Mr rufo on peu faire de cette manière :
aa=(a*99)/992 --> pourquoi 992 c'est simple, l'orsque l'incrémentation du capteur il donne un charactère et non pas un numéro genre (u, <,...) dans a2: les dizaines. petite remarque: il donne un charactère est non pas un num (j'ai vérifier).
Marsh Posté le 08-07-2016 à 15:22:16
samjabr a écrit : aa=(a*99)/992 --> pourquoi 992 c'est simple, l'orsque l'incrémentation du capteur il donne un charactère et non pas un numéro genre (u, <,...) dans a2: les dizaines. petite remarque: il donne un charactère est non pas un num (j'ai vérifier). |
Bon, je sors, il vaut mieux je pense. Soit samjabr est un troll (je crains que non) soit il ne mérite vraiment pas son diplôme (école d'ingénieur!!). Le pire c'est que même avec ce "travail" il risque de l'avoir et peut-être même avec une bonne note.
Marsh Posté le 08-07-2016 à 15:51:24
Le capteur qui donne un caractère au lieu d'un nombre, c'est pas simplement pour utiliser le code ASCII qu'il fait ça ? Genre, le capteur veut renvoyer la valeur 65, il renvoie donc le caractère "A"
J'imagine que le français n'est pas ta langue maternelle, samjabr ? Parce que tes messages ne sont pas très compréhensibles Du coup, ça facilite pas l'aide qu'on pourrait t'apporter. Encore que le sujet semble assez trivial quand on est au niveau ingé Ce genre de PFR serait plus du niveau de 1ère année de DUT GEII...
Marsh Posté le 08-07-2016 à 19:49:21
Dites on sait pas et c'est tout!!...je suis compréhensive ...c'est pas la peine de vous justifier votre imbécilité en utilisant des critiques négatives...band de gamin t'a pas les couille pour l'école d'ingénieur et le C c'est pas ma spécialité c'est pourquoi je demande de l'aide(narmol).. c'est juste un aditif dans le projet principal et tu n'aurai jamais mon parcours diplômatique, c'est pas donner au imbiciles c'est donner au élites...penser à être plus positive c'est 2016
Marsh Posté le 08-07-2016 à 20:00:12
samjabr a écrit : le C c'est pas ma spécialité |
Ça on avait remarqué.
Citation : c'est donner au élites |
Pas de doute, Monsieur fait partie de cette dernière!
Bon, il serait peut-être temps de mettre un terme à cette plaisanterie non?
Marsh Posté le 08-07-2016 à 23:26:25
samjabr a écrit : Dites on sait pas et c'est tout!!...je suis compréhensive ...c'est pas la peine de vous justifier votre imbécilité en utilisant des critiques négatives...band de gamin t'a pas les couille pour l'école d'ingénieur et le C c'est pas ma spécialité c'est pourquoi je demande de l'aide(narmol).. c'est juste un aditif dans le projet principal et tu n'aurai jamais mon parcours diplômatique, c'est pas donner au imbiciles c'est donner au élites...penser à être plus positive c'est 2016 |
T'as conscience que beaucoup des gens qui fréquentent la cat "programmation" de ce forum sont diplômés d'écoles d'ingé en informatique, souvent depuis plusieurs années et exercent dans le domaine en tant que professionnel
Marsh Posté le 06-07-2016 à 20:47:44
Bonjour , j'ai un problème urgent dans mon PFE , problème de comparaison avec deux nombre "un afficher sur LCD" et l'autre "saisie par un clavier (keypad)". l'afficheur LCD affiche une mesure analogique d'un capteur . le nombre saisie par keypad si il est supérieur du nombre afficher un message de "erreur" s'affiche.
j'ai essayer des commandes(strcmp , if....) je ne sais pas comment faire ...Merci de m'aider le plus vite possible...PS : je travaille avec un microcontrôlleur pic 16f877A logiciel mikroC.