IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème de OR


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 42
    Par défaut Problème de OR
    Bonjour les gens,
    J'ai un souci vraiment bête avec un OR qui ne veut pas marcher
    Voilà la ligne qui coince :

    if((strcmp(aw_string(AW_AVATAR_NAME),"Kurt")!=0) || (strcmp(aw_string(AW_AVATAR_NAME),"Biganon")!=0)) {

    C'est donc un if, avec un or au milieu. Le blême c'est que ça marche pas... Je vous explique un peu : j'utilise une SDK pour des bots sur un tchat en 3D, un peu à la Second Life. Son but est de téléporter au point d'entrée tout utilisateur qui tenterait de pénétrer dans un territoire interdit. Tous... sauf certains privilegiés, dont les pseudos sont Lolman et Hyperion. Seulement, quand je met ce OR, aucun de ces deux utilisateurs n'est privilegié, les deux subissent le téléport comme les autres... par contre sans if :

    if(strcmp(aw_string(AW_AVATAR_NAME),"Lolman")!=0) {

    Ca marche très bien :/

    Donc pourquoi mon || ne marche pas ? C'est étrange...

    Merci d'avance, a+

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Kalyptus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(strcmp(aw_string(AW_AVATAR_NAME),"Lolman")!=0 || strcmp(aw_string(AW_AVATAR_NAME),"Hyperion")!=0) {
    C'est donc un if, avec un or au milieu. Le blême c'est que ça marche pas... Je vous explique un peu : j'utilise une SDK pour des bots sur un tchat en 3D, un peu à la Second Life. Son but est de téléporter au point d'entrée tout utilisateur qui tenterait de pénétrer dans un territoire interdit. Tous... sauf certains privilegiés, dont les pseudos sont Lolman et Hyperion. Seulement, quand je met ce OR, aucun de ces deux utilisateurs n'est privilegié, les deux subissent le téléport comme les autres...
    Si tu veux que les 2 conditions soient réunies, il faut utiliser ET...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 42
    Par défaut
    Bah justement, je veux pas que les deux soient réunies... Si le pseudo de l'utilisateur est Lolman OU Hyperion, pas les deux en même temps...

    A+

  4. #4
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    essaie
    si non (A et B)

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Kalyptus Voir le message
    Bah justement, je veux pas que les deux soient réunies... Si le pseudo de l'utilisateur est Lolman OU Hyperion, pas les deux en même temps...
    Dans ce cas ("le pseudo <...> est"), c'est pas !=0 mais == 0. Relis la doc de strcmp()...

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Kalyptus Voir le message
    Son but est de téléporter au point d'entrée tout utilisateur qui tenterait de pénétrer dans un territoire interdit. Tous... sauf certains privilegiés, dont les pseudos sont Lolman et Hyperion
    ce qui se traduit par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    si utilisateur est différent de Lolman ET utilisateur est différent de Hyperion
           teleportes
    Sinon
           ne fait rien


  7. #7
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    excuse moi ! Ca ne doit pas être ça, en fait tu veux l'un mais pas l'autre ...
    si c'est le cas c'est un OU exclusif XOR.

    Si( (non A et B) ou (A et non B) )

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par yakamoneye Voir le message
    excuse moi ! Ca ne doit pas être ça, en fait tu veux l'un mais pas l'autre ...
    si c'est le cas c'est un OU exclusif XOR.

    Si( (non A et B) ou (A et non B) )
    Pas la peine de cherche aussi complique, la chaine ne pouvant pas prendre deux valeurs, le cas ou la chaine vaut A et B n'est pas possible.

    Son problème est tout simplement celui souligné par Emmanuel et Souviron.

  9. #9
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Pas la peine de cherche aussi complique, la chaine ne pouvant pas prendre deux valeurs, le cas ou la chaine vaut A et B n'est pas possible.
    C'est pas faux !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 42
    Par défaut
    J'ai lu la doc de strcmp(), merci...

    Justement, strcmp() renvoie 0 si les chaînes sont égales, or je veux que l'action (= le téléport) ne prenne effet QUE si les chaînes ne sont PAS égales !
    Car aw_string(AW_AVATAR_NAME) correspond au pseudo de la personne traitée. Il ne faut téléporter la personne QUE si son pseudo n'est NI Lolman, NI Hyperion...
    Donc je ne vois vraiment pas pourquoi mon code ne marchait pas...
    Et comme l'a dit gl, la personne ne peut pas avoir deux pseudos à la fois

    Je vais essayer un ET, c'est vrai que y'aurait une certaine logique :

    Si pseudo est différent de Lolman ET que pseudo est différent de Hyperion alors
    téléporter
    Sinon
    bah rien

    Mais un OU aurait du marcher quand même... Ouache ça m'embrouille tout ça !
    Enfin merci pour vos réponses, hésitez pas à répondre encore

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 42
    Par défaut
    Tain c'est pas possible, ET ne marche pas, et pire (c'est hallucinant) :

    En fait ça fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void bouge(void) {
            if(aw_int(AW_AVATAR_X) > 12000 || aw_int(AW_AVATAR_X) > 5000 && aw_int(AW_AVATAR_Z) < -5000) {
                    if((strcmp(aw_string(AW_AVATAR_NAME),"Lolman")==0) || (strcmp(aw_string(AW_AVATAR_NAME),"Hyperion")==0)) {
                    aw_string_set(AW_CONSOLE_MESSAGE,"C'est bon, t'es privilegié");
                     aw_console_message(aw_int(AW_AVATAR_SESSION));
                    } else {
                     aw_teleport(aw_int(AW_AVATAR_SESSION));
                     aw_string_set(AW_CONSOLE_MESSAGE,"Vous n'êtes pas autorisé à entrer dans cette partie du Monde.");
                     aw_console_message(aw_int(AW_AVATAR_SESSION));
            }
            }
    }
    Et quand j'entre dans la zone interdite sous mon pseudo (Hyperion) alors j'ai LES DEUX MESSAGES O_O
    J'ai : "C'est bon, t'es privilegié", puis "Vous n'êtes pas autorisé [...]"

    Par contre si j'y vais sous un AUTRE pseudo, alors j'ai que le message "Vous n'etes pas autorisé [...]"...

    C'est à n'y rien comprendre

    A+

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Kalyptus Voir le message
    Tain c'est pas possible, ET ne marche pas, et pire (c'est hallucinant) :

    Et quand j'entre dans la zone interdite sous mon pseudo (Hyperion) alors j'ai LES DEUX MESSAGES O_O
    J'ai : "C'est bon, t'es privilegié", puis "Vous n'êtes pas autorisé [...]"

    Par contre si j'y vais sous un AUTRE pseudo, alors j'ai que le message "Vous n'etes pas autorisé [...]"...

    C'est à n'y rien comprendre

    A+
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          if ((strcmp (aw_string (AW_AVATAR_NAME), "Lolman") == 0)
              || (strcmp (aw_string (AW_AVATAR_NAME), "Hyperion") == 0))
    Sauf changements en sous-main non documentés (lecture de flux, incrément de variable statique cachée etc.), je ne vois pas comment 2 appels successifs de la même fonction avec les mêmes paramètres ('aw_string (AW_AVATAR_NAME)') pourraient donner un résultat différent...

    Mais tant qu'on a pas le code compilable...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 42
    Par défaut
    Bah ce aw_string(AW_AVATAR_NAME) renvoie le nom de la personne lorsqu'un évenement est déclenché, en l'occurence l'évenement aw_event(AW_AVATAR_CHANGE), qui indique un changement d'état de la personne, ici un changement de position. Ce que je fais c'est :
    Si la personne bouge, alors :
    Si la personne est dans le territoire interdit (test de ses coordonnées X et Z), alors:
    Si le pseudo de la personne est Lolman OU Hyperion, alors :
    Ne rien faire, sinon :
    Téléporter la personne au point d'entrée du monde.

    Bref je comprends rien de rien.
    A+

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Comme l'a dit Emmanuel, en l'état on ne peut pas t'aider. Faudrait avoir plus de code.

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Kalyptus Voir le message
    ...
    Traduction directe de l'algo (compilé, cette fois !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include <string.h>
     
    int main (void)
    {
       char const *pseudo = "machpro";
     
    /* Si le pseudo de la personne est Lolman OU Hyperion, alors : */
       if (strcmp (pseudo, "Lolman ") == 0 || strcmp (pseudo, "Hyperion") == 0)
       {
    /* Ne rien faire, */
       }
    /* sinon : */
       else
       {
    /* Téléporter la personne au point d'entrée du monde. */
       }
     
       return 0;
    }
    Y'a pas besoin de faire plus compliqué...

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 42
    Par défaut
    C'est ce que j'ai fait et ça ne fonctionne pas...

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 42
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void bouge(void) {
            if(aw_int(AW_AVATAR_X) > 12000 || aw_int(AW_AVATAR_X) > 5000 && aw_int(AW_AVATAR_Z) < -5000) {
                    if((strcmp(aw_string(AW_AVATAR_NAME),"Lolman")==0) || (strcmp(aw_string(AW_AVATAR_NAME),"Hyperion")==0)) {
                    } else {
                     aw_int_set (AW_TELEPORT_X, 0);
                     aw_int_set (AW_TELEPORT_Y, 0);
                     aw_int_set (AW_TELEPORT_Z, 0);
                     aw_int_set (AW_TELEPORT_YAW, 0);
                     aw_string_set (AW_TELEPORT_WORLD, "");
                     aw_bool_set (AW_TELEPORT_WARP, 0);
                     aw_teleport(aw_int(AW_AVATAR_SESSION));
                     aw_string_set(AW_CONSOLE_MESSAGE,"Vous n'êtes pas autorisé à entrer dans cette partie du Monde.");
                     aw_int_set(AW_CONSOLE_RED,255);
                     aw_int_set(AW_CONSOLE_BLUE,0);
                     aw_int_set(AW_CONSOLE_GREEN,0);
                     aw_int_set(AW_CONSOLE_RED,255);
                     aw_bool_set(AW_CONSOLE_BOLD,1);
                     aw_bool_set(AW_CONSOLE_ITALICS,0);
                     aw_console_message(aw_int(AW_AVATAR_SESSION));
            }
            }
    }
    Ca c'est mon code. Quand j'y vais en Hyperion (le DEUXIEME test) alors ça marche, le bot n'agit pas sur moi. Mais quand j'y vais en Lolman il agit.
    Et non, je ne peux pas vous donner un truc compilable, dans la mesure où pour le lancer il faut un accès privilegié au tchat et que je ne peux évidemment pas le donner.

    A+

    EDIT :

    J'ai encore simplifié, maintenant j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void bouge(void) {
            if(strcmp(aw_string(AW_AVATAR_NAME),"Lolman")!=0 || strcmp(aw_string(AW_AVATAR_NAME),"Hyperion")!=0) {
                    printf("%s a bougé !\n",aw_string(AW_AVATAR_NAME));
            }
    }
    Et devinez quoi ? En Lolman, le printf marche En Hyperion, non... Même chose donc... C'est quoi ce OR qui ne marche pas ??!

  18. #18
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    alors c'est que

    a) tu n'as pas tapé le bon nom (majuscules/minuscules/espace)
    b) il y a quelque chose qui se passe pour ce Lolman qui est différent de Hypérion et qui modifie son nom...

    mais le test est bon..

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 42
    Par défaut
    J'ai tapé rigoureusement le même nom, je l'ai fait des dizaines de fois depuis plusieurs jours... Et je ne vois pas ce qui se passerait pour l'autre...

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 42
    Par défaut
    Bon. J'ai remplacé le || par un &&. A ce moment, le printf ne marche NI pour Lolman, NI pour Hyperion, c'est donc bien. Je vais essayer avec le vrai code maintenant.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo