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 :

Opérations sur tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Par défaut Opérations sur tableau
    Bonjour à tous,

    Je travail actuellement sur un petit projet qui doit manipuler des tableaux. Je travail avec un pic18f8520.

    Je suis à la recherche d'une solution pour identifier des commandes reçues. j'ai un doute sur la manière dont je vais m'y prendre.

    Ces commandes arrives dans un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char buffer;[64]
    et j'aimerai établir un tableau de commandes prédéfini comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char cmd[] = {"CMD1","CMD2","CMD3"};
    mon but est donc de décortiquer le buffer suivant les possibilités du tableau de commande.
    J'ai réalisé quelques bout de code avec strcmp voire strncmp mais ça ne marche pas toujours...
    je dois encore y travailler.

    Quoiqu'il en soit, je suis preneur si quelqu'un voit une meilleur solution pour récupérer des commandes depuis un buffer.

    Merci à tous

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Il faut que tu précises un peu ton problème. Donne un exemple, avec un contenu type de ton buffer et quelles opérations tu souhaites réaliser dessus.

  3. #3
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Bonjour,
    Citation Envoyé par GGelec
    et j'aimerai établir un tableau de commandes prédéfini comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char cmd[] = {"CMD1","CMD2","CMD3"};
    Un tableau de pointeur sur char serait mieux adapté pour stocker des chaine de caractères.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par CGi Voir le message
    Un tableau de pointeur sur char serait mieux adapté pour stocker des chaine de caractères.
    Je crois que c'est déjà un tableau de pointeurs vers des chaines définies en constantes. Par contre, je ne vois pas l'intérêt de changer les char*, qui sont faits pour travailler avec des chaines en unsigned char*.

    Je propose un tableau de structures contenant le pointeur vers la commande et le pointeur vers la fonction à utiliser.

    A+

    Pfeuh

    Je viens de comprendre qu'on disait la même chose, CGi!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Il faut que tu précises un peu ton problème. Donne un exemple, avec un contenu type de ton buffer et quelles opérations tu souhaites réaliser dessus.
    Merci d'abord pour vos réponses

    Mon readbuffer sera rempli avec soit des messages soit des commandes.
    Je dois interpréter au mieux le contenu du readbuffer.

    Grâce à un tableau de commande hardcodé, j'aimerai juste comparer le contenu du readbuffer avec ce tableau de commande.

    Si une commande correspond au message contenu dans le readbuffer alors établir une action suivant la commande. Si la commande n'est pas reconnu, l’interpréter comme un message simple.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Il faut que tu précises un peu ton problème. Donne un exemple, avec un contenu type de ton buffer et quelles opérations tu souhaites réaliser dessus.
    Bonjour à tous,

    J'ai envisagé une solution, peut être trop compliqué pour ce que je souhaite faire mais elle devrait malgré tout fonctionner.

    Je réalise trois étapes: strstr, strcat et enfin strcmp (voire strncmp).

    Ce que j'aimerai faire c'est normaliser les commandes avec une longueur de 4 char.

    J'ai également l'idée d'implémenter un entête dans la trame que mon système doit recevoir.

    Un moyen donc de détecter si il s'agit d'une commande ou si il s'agit d'un message.

    Grâce à strstr je détermine la présente de cet entête (de 4 char également) pour allé rechercher directement 4 char plus loin la possible commande.

    J'ai écris un bout de code mais je ne suis pas certain au niveau du strcmp.
    Je n'ai pas encore eu l'occasion de tester. Je le fais demain.

    Quoiqu'il en soit voici le bout de code en question que j'aimerai implémenter :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    char readBuffer[10];
    char writeBuffer[10];
    char checkCmd[10];
    char tabCmd[10] = {"cmd1", "cmd2"};
    char *ptr;
    char detectCMD[10] = {"#CMD"}; //4 char
    int res;
    int i;
     
    //Recherche le format des commandes
        ptr = strstr(readBuffer, detectCMD);
     
        if (ptr != NULL) {
            res = ptr - readBuffer + 1;
            printf("\r\n\"%s\" found at position %d\r\n",
                    detectCMD, res);
            //définit la position de la commande reçue (4char)
            res += sizeOfCmd; //position de #CMD + 4 pour débuter la capture de la cmd
            //On place le tout dans un string pour ensuite le comparer au tableau de cmd
            for (i = res; i < res + 4; i++) {
                strcat(checkCmd, readBuffer[i]);
            }
            printf("\r\nCMD need to be check : \"%s\" \r\n", checkCmd);
            //Pour chaque possibilité de commande (2) on check si le string est comparable
            for (i = 0; i < 2; i++) {
                if (strcmp(tabCmd[i], checkCmd) == 0) {
                    printf("\r\nCmd match %s\r\n", checkCmd);
                } else {
                    printf("\r\nNot valide Cmd %s\r\n", checkCmd);
                }
            }
        } else {
            printf("\r\n\"%s\" not found\r\n", detectCMD);
            printf("\r\nProbably a incoming message\r\n");
        }
    Donc si mon buffer contient "#CMDcmd1" = commande reçue, ensuite action suivant la commande.

    j'espère être clair dans mon explication

    D'avance un grand merci pour votre aide déjà

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 119
    Par défaut
    Avec ton système, tu ne va traiter que des commandes fixée, tu n'auras pas besoin de recevoir des arguments variables (un nombre, autre chose) ?


    Essaye, tant que possible de poster du code correct (qui compile).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char tabCmd[10] = {"cmd1", "cmd2"}; //est faux :
    char tabCmd[10] // est un tableau de 10 char.
    {"cmd1", "cmd2"} // correspondrait à l'initialisation des deux premiers éléments d'un tableau de tableau de char.
    Utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const char *tabCmd[] = {"cmd1", "cmd2"}; 
    //ou 
    const char *tabCmd[2] = {"cmd1", "cmd2"};
     
    idem pour char *detectCMD = "#CMD"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (i = res; i < res + 4; i++) {
                strcat(checkCmd, readBuffer[i]); //checkCmd n'est pas initialisé, ça ne va pas marcher
    }
    //doit être remplacé par 
    memcpy(checkCmd,readBuffer[res],4)
    Pour le reste, tu vas avoir une ligne sur deux de tes logs qui sera vide, je ne sais pas si c'est voulu, et des "Not valide Cmd" (enlève ce e !) sur des commandes valides. J'ai un petit doute sur les \r\n (\n ne suffirait-il pas ?), mais je ne connais pas bien Windows.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Par défaut
    Citation Envoyé par gulain Voir le message
    Avec ton système, tu ne va traiter que des commandes fixée, tu n'auras pas besoin de recevoir des arguments variables (un nombre, autre chose) ?


    Essaye, tant que possible de poster du code correct (qui compile).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char tabCmd[10] = {"cmd1", "cmd2"}; //est faux :
    char tabCmd[10] // est un tableau de 10 char.
    {"cmd1", "cmd2"} // correspondrait à l'initialisation des deux premiers éléments d'un tableau de tableau de char.
    Utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const char *tabCmd[] = {"cmd1", "cmd2"}; 
    //ou 
    const char *tabCmd[2] = {"cmd1", "cmd2"};
     
    idem pour char *detectCMD = "#CMD"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (i = res; i < res + 4; i++) {
                strcat(checkCmd, readBuffer[i]); //checkCmd n'est pas initialisé, ça ne va pas marcher
    }
    //doit être remplacé par 
    memcpy(checkCmd,readBuffer[res],4)
    Pour le reste, tu vas avoir une ligne sur deux de tes logs qui sera vide, je ne sais pas si c'est voulu, et des "Not valide Cmd" (enlève ce e !) sur des commandes valides. J'ai un petit doute sur les \r\n (\n ne suffirait-il pas ?), mais je ne connais pas bien Windows.
    Merci pour ta réponse.
    Je vais tenir compte de ce que tu m'as expliqué ci dessus.
    Je ne travail pas sous windows. Je fais de la programmation embarqué (pic).

    Je réfléchi toujours sur la manière de procéder.

    Les commandes à recevoir sont fixes dans le sens où la machine envoi vers mon système "1" ou "6", mais j'envisage de faire plus compliqué pour interpréter des commandes pour pouvoir traiter des commandes plus compliquée comme "TEST" même si la réception d'un "T" suffirait.

    J'y travaille

    désolé pour le "e"

Discussions similaires

  1. [TPW] Opérations sur un tableau
    Par chiichi dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 06/02/2013, 08h48
  2. Opération sur des entiers codés dans un tableau
    Par Nurza dans le forum Langage
    Réponses: 7
    Dernier message: 28/09/2012, 12h57
  3. [XL-2007] Opérations (+,-, ..) sur variables tableau
    Par bob3333 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/04/2011, 15h41
  4. Réponses: 8
    Dernier message: 16/03/2008, 21h02
  5. [VB6]opération sur un tableau complet en une seule fois?
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 24/05/2006, 12h50

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