Condition et strcmp

Condition et strcmp - C - Programmation

Marsh Posté le 30-08-2004 à 16:18:22    

bon, salut à tous!!!!
 
J'essaye de modifier un programme en C pour les besoins de mon responsable et comme je ne le maitrise pas et que ca marche pas,  je vous soumet la partie que j'ai faite: en fait c'est une simple condition qui dit
si(A==true et (b == true ou c == true)
alors rien  

Citation :

if ( (strcmp("10.3.2.15",a)==0) && ( (strcmp("0:4:33:b7:41:52",e1)==0 ) ||
  (strcmp("0:4:33:b7:41:53",e1)==0)) )
  return;


merci à ceux qui prendront qques minutyes pour repondre

Reply

Marsh Posté le 30-08-2004 à 16:18:22   

Reply

Marsh Posté le 30-08-2004 à 16:23:07    

si(A==true et (b == true ou c == true)  
 
 
t'as une drôle de façon de penser toi ...
 
 
sinon personne voit de problème nulle part : si l'adresse IP est "10.3.2.15" et si l'adresse MAC est "0:4:33:b7:41:52" ou bien "0:4:33:b7:41:53" alors arrêter

Reply

Marsh Posté le 30-08-2004 à 16:23:44    

euh il faut plus de précision :
1/ qu'est-ce qui ne marche pas ? (syntaxe ou bug d'exécution)
2/ type de a, type de e1
:)

Reply

Marsh Posté le 30-08-2004 à 16:49:49    

Pour commencer trop de parenthèses, pas besoin d'alourdir la syntaxe.
 

Code :
  1. if (strcmp("10.3.2.15",a)==0 && (strcmp("0:4:33:b7:41:52",e1)==0 || strcmp("0:4:33:b7:41:53",e1)==0))
  2.   return;

Reply

Marsh Posté le 30-08-2004 à 16:57:12    

+1 utilisez au maximum les règles de priorités ISO/ANSI C.

Reply

Marsh Posté le 30-08-2004 à 17:03:36    

pains-aux-raisins a écrit :


2/ type de a, type de e1
:)


arf, comme quoi on peut etre programmeur et faire des erreurs de debutant quand on se trouve sur un nouveau langage (moi c plus java)...à moins que je ne sois pas bien reveillé :/

Citation :

register u_int32_t a, register u_char *e1,


et oui je voulais donc comparer une string avec des entiers...
dans le programme apparemment il y a un transtypage:

Citation :

intoa(a)


 
Sinon, pour expliquer mes besoins:
j'utilise arpwatch qui couple les MAC address à leur IP correspondantes et lorsqu'une MAC address n'a pas la mm IP que precedemment alors il envoie un mail... or mon problème c'est qu'il y a une machine avec deux MAC pour la même IP(ne me demandait pas pk je ne suis qu'étudiant pris en intérim' apres son stage avant de reprendre les cours)...si je laisse cela comme ca mon responsable peut recevoir plusieurs dizaines de mails par jour(voir des centaines) donc j'ai pensé à une condition qui dit pour tel IP et pour l'une de ses deux Mac ne pas envoyer d'email

Reply

Marsh Posté le 30-08-2004 à 17:10:53    

Tu va voir Hurric, le C c'est merveilleux par rapport à Java :lol:

Reply

Marsh Posté le 30-08-2004 à 17:16:56    

ok ben je te laisse le C je garde Java...mais pour le transtypage c bien comme ca : intoa(a)?

Reply

Marsh Posté le 30-08-2004 à 17:23:56    

précision : itoa(...) n'est pas une fonction standard C. Vérifier qu'elle est bien dispo avec ton compilo.
 
exemple d'utilisation :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4.   char str[50]; /* prévoir suffisamment grand */
  5.  
  6.   printf("15 en binaire est %s\n", itoa(15, str, 2));
  7.   printf("15 en octal est %s\n"  , itoa(15, str, 8));
  8.   printf("15 en décimal est %s\n", itoa(15, str, 10));
  9.   printf("15 en hexa est %s\n"   , itoa(15, str, 16));
  10.   return 0;
  11. }


 
voilà


Message édité par pains-aux-raisins le 30-08-2004 à 17:24:59
Reply

Marsh Posté le 30-08-2004 à 17:29:43    

itoa n'existe pas partout

Reply

Marsh Posté le 30-08-2004 à 17:29:43   

Reply

Marsh Posté le 30-08-2004 à 17:48:47    

dans sa version simple (décimal positif) voici un code simplifié (désoptimisé) :

Code :
  1. char* itoa(int num, char* str) {
  2.    int i, n1, n, nlen;
  3.    /*--- Combien de caractères il faut ? ---*/
  4.    nlen = 1; /* nombre de cars nécessaires */
  5.    n = 10;   /* base 10                    */
  6.    while (num / n != 0) {
  7.       nlen = nlen + 1;
  8.       n = n * 10;
  9.    }
  10.    /*--- Ici on examine les chiffres un par un ---*/
  11.    n1 = num;
  12.    i = 0;
  13.    do {
  14.       n = n1 % 10;
  15.       n1 = n1 / 10;
  16.       str[nlen - i - 1] = '0' + n;
  17.       i = i + 1;
  18.    } while (n1 != 0);
  19.    str[i] = '\0';
  20.    return str;
  21. }


 
cette fonction pourra être appelée en déclarant un buffer (2e parametre) qui recevra la représentation caractere du nombre.
 

Code :
  1. #include <stdio.h>
  2. int main() {
  3.    char buffer[50];
  4.    itoa(15, buffer);
  5.    printf("15 = %s, c'est vrai !\n", buffer);
  6.    return 0;
  7. }


 
En espérant que je me suis pas gourré dans ce code... :D


Message édité par pains-aux-raisins le 30-08-2004 à 17:49:33
Reply

Marsh Posté le 30-08-2004 à 18:28:44    

génial c'est vachement sécure, et uis au moins, t'as pas l'impression de réinventer sprintf et le bien meilleurs snprintf
 

Code :
  1. snprintf(buffer, sizeof buffer, "%d", i);

Reply

Marsh Posté le 30-08-2004 à 19:26:30    

+1 j'y ai pensé en rentrant... :D

Reply

Marsh Posté le 30-08-2004 à 19:27:06    

Le truc c'est qui m'a troublé avec sa fonction itoa...

Reply

Marsh Posté le 30-08-2004 à 19:28:35    

surtout qu'apparament il dit que son prog utilise déjà cette fonction... mais bon, question portabilité, on est d'accord, c'est zéro..

Reply

Marsh Posté le 31-08-2004 à 16:28:38    

c'était pas itoa mais intoa... ce que c'est je sais pas je connasi pas le C...mais j'ai réussi à me débrouiller en utilisant un transtypage forcé...en tout cas ca marche ...merci pour vos réponses ;)

Reply

Marsh Posté le 31-08-2004 à 16:47:13    

dsl c de ma faute intoa est une classe du logiciel     :whistle:


Message édité par Hurric' le 31-08-2004 à 16:48:24
Reply

Marsh Posté le 31-08-2004 à 16:56:04    

;)

Reply

Marsh Posté le 01-09-2004 à 17:12:45    

bon ca marche bien mon responsable recoit bien les mails mais pas ceux de la machine qui pose probleme et il est ainsi tout content mais il s'est dit: "tiens !!! il faudrait que nous soyons deux à recevoir des mails...Comme ca si l'un d'entre nous n'est pas là ...l'autre pourra tjs surveiller..."
bon ben il a pas tort mon responsable...c'est important que cela soit toujours surveiller mais moi, j'ai bien essayé de  modifier le programme mais il y a la commande execl qui apparemment ne veut pas etre placé deux fois à la suite...mon ami google m'a dit que cette fonction s'occupe des processus...mais je sais pas j'y arrive pas..programmer de base d'accord même si c'est en C mais programmer avec les processus non je peux vraiment pas... voila une partie du code : verriez vous une solution à mon probleme?

Citation :

if ( strcmp("10.1.3.5",intoa(a))==0 && ( strcmp("0:5:12:b7:47:51",(char)e1)==0  ||
  strcmp("0:5:12:b7:47:52",(char)e1)==0) )
  return;
 else {  
   execl(sendmail, "sendmail1", "-odi", watcher, NULL);
   syslog(LOG_ERR, "execl: %s: %m", sendmail);  
   
 /*watcher pointe vers l'adresse mail enfin je crois pasque en C c'est bizzare les pointeurs...je pensais mettre un watcher1 et un watcher*/
   
   
   }
 exit(1);


Message édité par Hurric' le 01-09-2004 à 17:16:18
Reply

Marsh Posté le 01-09-2004 à 17:19:38    

(char)e1
 
à ouais ça marche terrible
 
 
engager quelqu'un, de toutes évidences tu en as rien à foutre du C, tu cherche juste à ce que quelqu'un fasse ton travail. c'est hors charte

Reply

Marsh Posté le 01-09-2004 à 17:22:01    

Taz a écrit :

(char)e1
 
à ouais ça marche terrible
 
 
engager quelqu'un, de toutes évidences tu en as rien à foutre du C, tu cherche juste à ce que quelqu'un fasse ton travail. c'est hors charte


Du code pareil, j'ai mal au coeur.  :sweat:

Reply

Marsh Posté le 01-09-2004 à 17:40:08    

Taz a écrit :

(char)e1
 
à ouais ça marche terrible
 
 
engager quelqu'un, de toutes évidences tu en as rien à foutre du C, tu cherche juste à ce que quelqu'un fasse ton travail. c'est hors charte


non je ne cherche pas quelqu'un pour faire mon travail...je fais parti de quelque forums et je sais que les personnes du forums ne sont là que pour répondre si ils le souhaitent à des problèmes donnés...ce que je fait quand j'en ai le temps... Or là le temps c'est ce qui me manque car je suis seulement etudiant engagé en intérim' en tant qu'assistant informaticien pendant l'été et jusqu'à vendredi...
j'ai passé toute mon aprés midi dessus et si on compte avec hier... ce n'est pas en deux jours que je vais pouvoir apprendre le C...ce qui m'intéresserait tout de même mais pas possible maintenant...si j'ai mis du code c'était que vous ayez un visuel de la partie du logiciel que je suis en train de modifier (arpwatch soit dit en passant et aucune documentation à part le man n'est dispo sur le net) et pour me lancer sur quelques pistes..je sais que faire du transtypage de la sorte n'était pas le meilleur moyen mais manque de temps et de connaissances dans ce langage je n'ai pu faire mieux... VOilà donc si vous ne voulez pas m'aider (j'ai bien dit aider et pas faire car cela ne m'apporterait rien)...ben tant pis, j'ai d'autres problèmes en plus de celui là à résoudre mais j'aurais quand même aimer finir
Hurric'

Reply

Marsh Posté le 01-09-2004 à 17:46:06    

débrouilles toi tout seul. ça n'a rien à voir avec la volonté. t'es hors charte. tu veux qu'on fasse le travail à ta place, tu t'en fiches bien de savoir ce qui ne va pas. lis la charte, et reviens quand tu l'auras assimilée

Reply

Marsh Posté le 01-09-2004 à 18:16:06    

extrait charte:

Citation :

[0C] On ne fait pas le boulot à votre place.
 
    * Les demandes du style "vous pouvez faire un programme faisant [...] pour moi ?" sont assez mal vues et n'obtiennent que très rarement de réponses.
    * Les offres d'emploi et recrutements (même non rémunérés) ont plutôt leur place sur Emploi & Études.  
 
 
 
[0D] De la même manière, les demandes de résolutions d'exercices ne seront pas acceptées
 
    * Du moins, s'il s'agit d'une demande de solution toute faite, sans effort manifeste du côté du demandeur. Cette décision a été prise étant donné le nombre croissant de ce type de demandes lors des périodes de reprise des cours ou d'approche des périodes d'examens.
    * Merci aux membres du forum de ne pas donner des résolutions d'exercice lorsqu'il est clair que le demandeur n'a rien fait de son côté


 
 
 
 
 

Hurric' a écrit :

non je ne cherche pas quelqu'un pour faire mon travail...
[...]
 VOilà donc si vous ne voulez pas m'aider (j'ai bien dit aider et pas faire car cela ne m'apporterait rien)...ben tant pis, j'ai d'autres problèmes en plus de celui là à résoudre mais j'aurais quand même aimer finir
Hurric'


 
donc je pensais avoir été clair sur ce que je voulais...mais bon, j'aurais été à votre place j'aurais dis à la personne oui les processus c'est dure/ pas dure à programmer... ou il faut imperativement que ton processus soit finis avant d'en faire una autre ou meme regarde sur ce lien http://forum.hardware.fr/forum2.ph [...] 910&cat=10 ou tel lien qui traite de ce sujet...oui je sais j'ai pas lu toute la charte donc je n'ai pas vu le referencement des liens de forum...je ne le connais pas trop, il est tres grand, beaucoup de monde et de topic ... donc je vais regarder les liens référencés... je vais rechercher dans google car les premieres explications que j'avais trouvées ne m'ont pas été d'un grand secours et donc y passer de longues heures(ou moins j'espère avec un peu de chance) ce que j'aurais fait, et que j'ai fait souvent tout cet été ce qui m'as permis d'apprendre beaucoup de <edit>choses(et pas chances), si il me restait pas aussi peu de temps, c'est pour cela que je souhaitais obtenir un aiguillage sur mes recherches...Donc je vais passer les 3 derniers jours qu'il me reste à chercher et tester et je viendrais vous donner ici le résultat de mes recherches (enfin si j'ai le temps!!!)  
 
Hurric'
au fait j'ai quand meme voulut chercher sur le forum  avant de poster mais cette fonction est inactive pour le moment


Message édité par Hurric' le 02-09-2004 à 15:55:11
Reply

Marsh Posté le 02-09-2004 à 16:22:24    

bonjour,  
 
j'ai galéré tout ce matin en me renseignant sur la fonction execl...
(attention les yeux, il va y avoir du code)

Citation :

execl(sendmail, "sendmail", "-odi", watcher, NULL);


avec watcher pointeur sur une adresse e-mail.
Une idée saugrenue me germait dans la tête depuis hier soir: "et si au lieu d'executer deux fois sendmail...je lui envoyais deux adresses mails? ...non ca doit pas être possible..." mais ce matin après avoir testé différentes méthodes sans succès, j'ai essayé tout de même de remplacer watcher par deux adresses emails.
(attention les yeux, il va re y avoir du code)

Citation :

execl(sendmail, "sendmail", "-odi", "adressemail1 adressemail2", NULL);


et vous savez quoi? ca a marché!!!
Les deux adresses mails recoivent bien les mails envoyés par arpwatch...
 
 
Conclusion:
Que  m'a apporté cette mini-aventure dans le monde fabuleux de C?
déjà , je me suis aperçu qu'il n'est pas si compliqué cela, en particulier, les pointeurs qui d'après ce que j'avais entendu dire etait  l'horreur... je me suis rendu compte que c'est pas pasque je programme sur un autre langage que les causes d'erreur peuvent être lié à mon incompréhension de ce langage mais à une simple erreur d'algo...
 
 
Voilà, je remerci pains-aux-raisins pour son aide et Taz malgrè son acharnement à voir en moi un ...hum...branleur/profiteur/boulay....
 
 :hello:


Message édité par Hurric' le 02-09-2004 à 16:56:09
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed