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

Qt Discussion :

Convertir une fonction en ligne de commande vers une interface graphique


Sujet :

Qt

  1. #1
    Membre habitué Avatar de zodd
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 276
    Points : 147
    Points
    147
    Par défaut Convertir une fonction en ligne de commande vers une interface graphique
    Bonjour,

    Je suis en train d'essayer de reprendre le code source d'une commande Lunix pour le mettre dans un slot appelé par un bouton dans Qt.
    Du coup je part d'un code en C où il y a le parsing des données entrées en ligne de commande et j'essaie de remplacé ce qui est entré au clavier par les contenu des QLineEdit de ma fenêtre (pour l'instant j'utilise de simples Array à la place):

    voilà la fonction de départ:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
     
    int
    main(int argc, char *argv[])
    {
        netsnmp_session session, *ss;
        netsnmp_pdu    *pdu, *response = NULL;
        netsnmp_variable_list *vars;
        int             arg;
        int             count;
        int             current_name = 0;
        int             current_type = 0;
        int             current_value = 0;
        char           *names[SNMP_MAX_CMDLINE_OIDS];
        char            types[SNMP_MAX_CMDLINE_OIDS];
        char           *values[SNMP_MAX_CMDLINE_OIDS];
        oid             name[MAX_OID_LEN];
        size_t          name_length;
        int             status;
        int             failures = 0;
        int             exitval = 0;
     
        putenv(strdup("POSIXLY_CORRECT=1"));
     
        /*
         * get the common command line arguments 
         */
        switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
        case NETSNMP_PARSE_ARGS_ERROR:
            exit(1);
        case NETSNMP_PARSE_ARGS_SUCCESS_EXIT:
            exit(0);
        case NETSNMP_PARSE_ARGS_ERROR_USAGE:
            usage();
            exit(1);
        default:
            break;
        }
     
        if (arg >= argc) {
            fprintf(stderr, "Missing object name\n");
            usage();
            exit(1);
        }
        if ((argc - arg) > 3*SNMP_MAX_CMDLINE_OIDS) {
            fprintf(stderr, "Too many assignments specified. ");
            fprintf(stderr, "Only %d allowed in one request.\n", SNMP_MAX_CMDLINE_OIDS);
            usage();
            exit(1);
        }
     
        /*
         * get object names, types, and values 
         */
        for (; arg < argc; arg++) {
            DEBUGMSGTL(("snmp_parse_args", "handling (#%d): %s %s %s\n",
                        arg,argv[arg], arg+1 < argc ? argv[arg+1] : NULL,
                        arg+2 < argc ? argv[arg+2] : NULL));
            names[current_name++] = argv[arg++];
            if (arg < argc) {
                switch (*argv[arg]) {
                case '=':
                case 'i':
                case 'u':
                case '3':
                case 't':
                case 'a':
                case 'o':
                case 's':
                case 'x':
                case 'd':
                case 'b':
    #ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
                case 'I':
                case 'U':
                case 'F':
                case 'D':
    #endif                          /* NETSNMP_WITH_OPAQUE_SPECIAL_TYPES */
                    types[current_type++] = *argv[arg++];
                    break;
                default:
                    fprintf(stderr, "%s: Bad object type: %c\n", argv[arg - 1],
                            *argv[arg]);
                    exit(1);
                }
            } else {
                fprintf(stderr, "%s: Needs type and value\n", argv[arg - 1]);
                exit(1);
            }
            if (arg < argc)
                values[current_value++] = argv[arg];
            else {
                fprintf(stderr, "%s: Needs value\n", argv[arg - 2]);
                exit(1);
            }
        }
     
        SOCK_STARTUP;
     
        /*
         * open an SNMP session 
         */
        ss = snmp_open(&session);
        if (ss == NULL) {
            /*
             * diagnose snmp_open errors with the input netsnmp_session pointer 
             */
            snmp_sess_perror("snmpset", &session);
            SOCK_CLEANUP;
            exit(1);
        }
     
        /*
         * create PDU for SET request and add object names and values to request 
         */
        pdu = snmp_pdu_create(SNMP_MSG_SET);
        for (count = 0; count < current_name; count++) {
            name_length = MAX_OID_LEN;
            if (snmp_parse_oid(names[count], name, &name_length) == NULL) {
                snmp_perror(names[count]);
                failures++;
            } else
                if (snmp_add_var
                    (pdu, name, name_length, types[count], values[count])) {
                snmp_perror(names[count]);
                failures++;
            }
        }
     
        if (failures) {
            snmp_close(ss);
            SOCK_CLEANUP;
            exit(1);
        }
     
        /*
         * do the request 
         */
        status = snmp_synch_response(ss, pdu, &response);
        if (status == STAT_SUCCESS) {
            if (response->errstat == SNMP_ERR_NOERROR) {
                if (!quiet) {
                    for (vars = response->variables; vars;
                         vars = vars->next_variable)
                        print_variable(vars->name, vars->name_length, vars);
                }
            } else {
                fprintf(stderr, "Error in packet.\nReason: %s\n",
                        snmp_errstring(response->errstat));
                if (response->errindex != 0) {
                    fprintf(stderr, "Failed object: ");
                    for (count = 1, vars = response->variables;
                         vars && (count != response->errindex);
                         vars = vars->next_variable, count++);
                    if (vars)
                        fprint_objid(stderr, vars->name, vars->name_length);
                    fprintf(stderr, "\n");
                }
                exitval = 2;
            }
        } else if (status == STAT_TIMEOUT) {
            fprintf(stderr, "Timeout: No Response from %s\n",
                    session.peername);
            exitval = 1;
        } else {                    /* status == STAT_ERROR */
            snmp_sess_perror("snmpset", ss);
            exitval = 1;
        }
     
        if (response)
            snmp_free_pdu(response);
        snmp_close(ss);
        SOCK_CLEANUP;
        return exitval;
    }
    et voilà ce que j'en ai fait pour l'instant:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    void MainWindow::SnmpSet() {
      init_snmp("snmp set");
      struct snmp_session sessionToPeer;
      snmp_sess_init(&sessionToPeer);
     
      sessionToPeer.peername = strdup(agentDeviceAddressLineEdit->text().toStdString().c_str());
      /*memory allocated by strdup() will be freed by calling snmp_close() */
      if(snmpVersion1RadioButton->isChecked()) {/* snmp version 1 is obsolete, do nothing about it. */
      }
      if(snmpVersion2RadioButton->isChecked()) {/* only version 2 community is implemented here */
        sessionToPeer.version = SNMP_VERSION_2c;
        sessionToPeer.community = (u_char*) (strdup(communityLineEdit->text().toStdString().c_str()));
        sessionToPeer.community_len = strlen((const char*) sessionToPeer.community);
      }
      if(snmpVersion3RadioButton->isChecked()) { //TODO: implement SNMP version 3 options. more item may be needed to add to combo box.
     
      }
      sessionToPeer.retries = retriesSpinBox->value();
      sessionToPeer.timeout = timeoutSpinBox->value();
      SOCK_STARTUP;
      struct snmp_session* sessionReturnedByLibrary = snmp_open(&sessionToPeer);
      if(sessionReturnedByLibrary == NULL) {
    #ifdef QT_DEBUG
        snmp_sess_perror((const char*) "No Ack!", sessionReturnedByLibrary);
    #endif //QT_DEBUG
        SOCK_CLEANUP;
        return;
      }
      struct snmp_pdu* requestPdu = snmp_pdu_create(SNMP_MSG_SET);
      oid requestOid[MAX_OID_LEN];
      size_t requestOidLength = MAX_OID_LEN;
      snmp_parse_oid(mibFileLocationLineEdit->text().toAscii(), requestOid, &requestOidLength);
      char typeArray[6]={'s','t','r','i','n','g'};
      char *valuesArray[6];
      *valuesArray[0]='c';
      *valuesArray[1]='h';
      *valuesArray[2]='t';
      *valuesArray[3]='e';
      *valuesArray[4]='s';
      *valuesArray[5]='t';
      snmp_add_var(requestPdu, requestOid, requestOidLength, typeArray[6], valuesArray[6]);//snmp_add_null_var(requestPdu, requestOid, requestOidLength);
      struct snmp_pdu* responsePdu = NULL;
      int snmpStatus = snmp_synch_response(sessionReturnedByLibrary, requestPdu, &responsePdu);
      if(snmpStatus == STAT_SUCCESS and responsePdu->errstat == SNMP_ERR_NOERROR) {
        /* SUCCESS: Print the result variables */
        struct variable_list *snmpVariables;
    #ifdef QT_DEBUG
        for(snmpVariables = responsePdu->variables; snmpVariables; snmpVariables = snmpVariables->next_variable) {
          print_variable(snmpVariables->name, snmpVariables->name_length, snmpVariables);
        }
    #endif //QT_DEBUG
        /* retrieve response that we're interested. */
    #ifdef QT_DEBUG
        int count = 1;
    #endif //QT_DEBUG
        for(snmpVariables = responsePdu->variables; snmpVariables != NULL; snmpVariables = snmpVariables->next_variable) {
          if(snmpVariables->type == ASN_OCTET_STR) {
            char* response = (char *) malloc(1 + snmpVariables->val_len);
            memcpy(response, snmpVariables->val.string, snmpVariables->val_len);
            response[snmpVariables->val_len] = '\0';
    #ifdef QT_DEBUG
            printf("value #%d is a string: %s\n", count++, response);
    #endif //QT_DEBUG
            resultTextEdit->setText(QString(response));
            free(response);
          } else {
    #ifdef QT_DEBUG
            printf("value #%d is NOT a string! Ack!\n", count++);
    #endif //QT_DEBUG
          }
        }
      } else {
        /* FAILURE: print what goes wrong! */
    #ifdef QT_DEBUG
        if(snmpStatus == STAT_SUCCESS) {
          fprintf(stderr, "Error in packet\nReason: %s\n", snmp_errstring(responsePdu->errstat));
        } else if(snmpStatus == STAT_TIMEOUT) {
          fprintf(stderr, "Timeout: No response from %s.\n", sessionToPeer.peername);
        } else {
          snmp_sess_perror("snmp get", sessionReturnedByLibrary);
        }
    #endif //QT_DEBUG
      }
     
      /*
       * Clean up:
       *  1) free the response.
       *  2) close the session.
       */
      if(responsePdu) {
        snmp_free_pdu(responsePdu);
      }
      snmp_close(sessionReturnedByLibrary);
     
      SOCK_CLEANUP;
    }
    Le problème c'est que lorsque je clique sur le bouton qui envoie le signal au slot, tout se ferme. et je n'ai pas de "mode debug" car j'utilise cmake et pas qmake car je n'arrive pas à m'en servir sur ce projet..
    Stay a while and listen...

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Pour un mode debug avec GCC (ou MinGW) on peut juste dire à CMake de rajouter l'option "-g". Après, je ne sais pas trop d'où peut venir le bogue, mais j'imagine un pointeur NULL.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre habitué Avatar de zodd
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 276
    Points : 147
    Points
    147
    Par défaut
    Merci pour ta réponse. c'est bon j'ai trouvé comment faire en ajoutant ça dans mon cmakelists.txt:

    list( APPEND CMAKE_CXX_FLAGS "-g")
    Stay a while and listen...

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Et cela vous a donné des indications sur le problème ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre habitué Avatar de zodd
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 276
    Points : 147
    Points
    147
    Par défaut
    Carrément, du coup c'est bon j'ai pu trouver d'où venait le problème et me concentrer dessus.. après avoir un peu fouiller dans le code des fonction appelé j'en ai tiré un résultat fonctionnel
    Voilà donc ma fonction SET qui marche ("figée" pour des objets chaînes de caractères mais ce détail est facile à régler):

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    void MainWindow::SnmpSet() {
      init_snmp("snmp set");
      struct snmp_session sessionToPeer;
      snmp_sess_init(&sessionToPeer);
     
      sessionToPeer.peername = strdup(agentDeviceAddressLineEdit->text().toStdString().c_str());
      /*memory allocated by strdup() will be freed by calling snmp_close() */
      if(snmpVersion1RadioButton->isChecked()) {/* snmp version 1 is obsolete, do nothing about it. */
      }
      if(snmpVersion2RadioButton->isChecked()) {/* only version 2 community is implemented here */
        sessionToPeer.version = SNMP_VERSION_2c;
        sessionToPeer.community = (u_char*) (strdup(communityLineEdit->text().toStdString().c_str()));
        sessionToPeer.community_len = strlen((const char*) sessionToPeer.community);
      }
      if(snmpVersion3RadioButton->isChecked()) { //TODO: implement SNMP version 3 options. more item may be needed to add to combo box.
     
      }
      sessionToPeer.retries = retriesSpinBox->value();
      sessionToPeer.timeout = timeoutSpinBox->value();
      SOCK_STARTUP;
      struct snmp_session* sessionReturnedByLibrary = snmp_open(&sessionToPeer);
      if(sessionReturnedByLibrary == NULL) {
    #ifdef QT_DEBUG
        snmp_sess_perror((const char*) "No Ack!", sessionReturnedByLibrary);
    #endif //QT_DEBUG
        SOCK_CLEANUP;
        return;
      }
      struct snmp_pdu* requestPdu = snmp_pdu_create(SNMP_MSG_SET);
      oid requestOid[MAX_OID_LEN];
      size_t requestOidLength = MAX_OID_LEN;
      snmp_parse_oid(mibFileLocationLineEdit->text().toAscii(), requestOid, &requestOidLength);
      /*
      if (tp && type == '=') {
             switch (tp->type) {
            case TYPE_INTEGER:
            case TYPE_INTEGER32:
                type = 'i';
                break;
            case TYPE_GAUGE:
            case TYPE_UNSIGNED32:
                type = 'u';
                break;
            case TYPE_UINTEGER:
                type = '3';
                break;
            case TYPE_COUNTER:
                type = 'c';
                break;
            case TYPE_COUNTER64:
                type = 'C';
                break;
            case TYPE_TIMETICKS:
                type = 't';
                break;
            case TYPE_OCTETSTR:
                type = 's';
                break;
            case TYPE_BITSTRING:
                type = 'b';
                break;
            case TYPE_IPADDR:
                type = 'a';
                break;
            case TYPE_OBJID:
                type = 'o';
                break;
            }
    */
      snmp_add_var(requestPdu, requestOid, requestOidLength, 's', valueLineEdit->text().toAscii());//valuesArray[6]);//snmp_add_null_var(requestPdu, requestOid, requestOidLength);
      struct snmp_pdu* responsePdu = NULL;
      int snmpStatus = snmp_synch_response(sessionReturnedByLibrary, requestPdu, &responsePdu);
      if(snmpStatus == STAT_SUCCESS and responsePdu->errstat == SNMP_ERR_NOERROR) {
        /* SUCCESS: Print the result variables */
        struct variable_list *snmpVariables;
    #ifdef QT_DEBUG
        for(snmpVariables = responsePdu->variables; snmpVariables; snmpVariables = snmpVariables->next_variable) {
          print_variable(snmpVariables->name, snmpVariables->name_length, snmpVariables);
        }
    #endif //QT_DEBUG
        /* retrieve response that we're interested. */
    #ifdef QT_DEBUG
        int count = 1;
    #endif //QT_DEBUG
        for(snmpVariables = responsePdu->variables; snmpVariables != NULL; snmpVariables = snmpVariables->next_variable) {
          if(snmpVariables->type == ASN_OCTET_STR) {
            char* response = (char *) malloc(1 + snmpVariables->val_len);
            memcpy(response, snmpVariables->val.string, snmpVariables->val_len);
            response[snmpVariables->val_len] = '\0';
    #ifdef QT_DEBUG
            printf("value #%d is a string: %s\n", count++, response);
    #endif //QT_DEBUG
            resultTextEdit->append(QString(response));
            free(response);
          } else {
    #ifdef QT_DEBUG
            printf("value #%d is NOT a string! Ack!\n", count++);
    #endif //QT_DEBUG
          }
        }
      } else {
        /* FAILURE: print what goes wrong! */
    #ifdef QT_DEBUG
        if(snmpStatus == STAT_SUCCESS) {
          fprintf(stderr, "Error in packet\nReason: %s\n", snmp_errstring(responsePdu->errstat));
        } else if(snmpStatus == STAT_TIMEOUT) {
          fprintf(stderr, "Timeout: No response from %s.\n", sessionToPeer.peername);
        } else {
          snmp_sess_perror("snmp get", sessionReturnedByLibrary);
        }
    #endif //QT_DEBUG
      }
     
      /*
       * Clean up:
       *  1) free the response.
       *  2) close the session.
       */
      if(responsePdu) {
        snmp_free_pdu(responsePdu);
      }
      snmp_close(sessionReturnedByLibrary);
     
      SOCK_CLEANUP;
    }
    Stay a while and listen...

Discussions similaires

  1. Trouver les paramètres d'une fonction pour la faire tendre vers une valeur
    Par cedrix57 dans le forum Intelligence artificielle
    Réponses: 4
    Dernier message: 24/05/2011, 10h38
  2. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  3. Réponses: 2
    Dernier message: 19/03/2005, 23h09
  4. Création d'une connexion en ligne de commande
    Par Drahu dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/05/2004, 15h19
  5. Lancer une serie de ligne de commande en un coup
    Par dzincou dans le forum Linux
    Réponses: 2
    Dernier message: 15/03/2004, 17h15

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