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 :

argv et pointeur de type void [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut argv et pointeur de type void
    Bonjour,

    Ma question porte sur l'argv du main(). Je suis toujours sur la compréhension d'un code qui utilise des arguments puis stocke une partie de ceux-ci dans une structure dont un élément est un pointeur de type void.
    Les arguments sont des chaines des caractères.
    A un moment dans le code on passe par un switch() pour valoriser le pointeur. Dans un cas on passe directement l'argurment, dans un autre cas on passe une adresse.
    Pourquoi l'adresse n'est-elle pas specifiée dans le cas de l'argument ?

    UCHAR -> unsigned char
    ULONG -> unsigned long
    PVOID -> pointeur de type void

    La structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct HWMCA_DATATYPE_S {         
       UCHAR                 ucType;                              
       ULONG                 ulLength;
       PVOID                 pData;   
       struct HWMCA_DATATYPE_S *pNext;
    };
    La partie du code
    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
     
    int main(int argc, char *argv[], char *envp[]) {
    ----
    typedef struct HWMCA_DATATYPE_S HWMCA_DATATYPE_T;
    HWMCA_DATATYPE_T    aHwmcaDataType[10];
    ULONG               aulCmdData[10];
    ---
    ----
    switch (aHwmcaDataType[j].ucType) {                   
       case HWMCA_TYPE_OCTETSTRING:                       
          aHwmcaDataType[j].ulLength = strlen(argv[i+1])+1;
          aHwmcaDataType[j].pData    = argv[i+1];
          break;
       case HWMCA_TYPE_NULL:                       
          aHwmcaDataType[j].ulLength = 0;          
          aHwmcaDataType[j].pData    = (PVOID)NULL;
          break;
       default:                                       
          aHwmcaDataType[j].ulLength = sizeof(ULONG); 
          aulCmdData[j]            = atol(argv[i+1]); 
          aHwmcaDataType[j].pData    = &aulCmdData[j];
          break;                                      
    } /* endswitch */ 
    --
    ---
    return (0)
    }
    En fait dans le switch pour le cas HWMCA_TYPE_OCTETSTRING on passe directement argv[i+1] à aHwmcaDataType[j].pData
    alors que dans le cas default on passe l'adresse de aulCmdData[j] à aHwmcaDataType[j].pData
    Pourquoi cette différence ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Parce que le type HWMCA_DATATYPE_S indique une liste chaînée de données brutes de type donné par ucType et de longueur nLength.
    • Si le type est "chaine d'octets", c'est le pointeur de la chaîne qui est stocké, aucune duplication n'est nécessaire.
    • Pour les autres types, la donnée est un ULONG. L'élément contient donc l'adresse du ULONG et nLength est la taille d'un ULONG. C'est logique.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Cela veut dire que si je concatene des arguments argv[n] avec argv[n+1]
    dans une chaine de caractère on ne passe pas par l'adresse pour valoriser pdata car une chaine est un tableau de char ?
    ce code est-il valide pour un cas chaine d'octet (ajout de cmd)?
    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
     
    int main(int argc, char *argv[], char *envp[]) {
    ----
    typedef struct HWMCA_DATATYPE_S HWMCA_DATATYPE_T;
    HWMCA_DATATYPE_T    aHwmcaDataType[10];
    ULONG               aulCmdData[10];
    -----
    char cmd[80];
    strcat(cmd,argv[i]);
    strcat(cmd,argv[i+1]);
    ---
    ---
    switch (aHwmcaDataType[j].ucType) {                   
       case HWMCA_TYPE_OCTETSTRING:                       
          aHwmcaDataType[j].ulLength = strlen(cmd)+1;
          aHwmcaDataType[j].pData    = cmd;
          break;
       case HWMCA_TYPE_NULL:                       
          aHwmcaDataType[j].ulLength = 0;          
          aHwmcaDataType[j].pData    = (PVOID)NULL;
          break;
       default:                                       
          aHwmcaDataType[j].ulLength = sizeof(ULONG); 
          aulCmdData[j]            = atol(argv[i+1]); 
          aHwmcaDataType[j].pData    = &aulCmdData[j];
          break;                                      
    } /* endswitch */ 
    --
    ---
    return (0)
    }

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je n'ai rien compris à ton dernier post.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Désolé, je vais essayé d'être plus clair dans mon propos.

    J'essai d'utiliser un code qui utilise cette structure. Dans la doc accompagnant ce code pour réaliser l'action que je veux faire il est dit que :

    ucType doit ëtre de type octetstring (correspondant à la valeur 4)
    ulLength doit être valorisé à la longueur de la chaine + le caractère de fin de chaine
    pData est un pointeur vers la chaine de caractères.
    pnext doit être NULL puisqu'il n'y à plus d'argument attendu.

    En fait j'ai un doute sur la façon de valoriser les éléments de la structure.

    Je passe ucType en temps d'argument au pgm (argument 5 du pgm)

    Je passe la chaine de caractères (qui contient un espace) également en temps d'argument. Celle-ci contenant un espace elle se prise comme étant 2 arguments différents. (arguments 6 et 7 du pgm)
    ex:
    pgm toto 44 toto 44 4 forum bonjour

    la structure
    UCHAR -> unsigned char
    ULONG -> unsigned long
    PVOID -> pointeur de type void
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct HWMCA_DATATYPE_S {         
       UCHAR                 ucType;                              
       ULONG                 ulLength;
       PVOID                 pData;   
       struct HWMCA_DATATYPE_S *pNext;
    };
    Lors de la valorisation de la structure je fais les opérations suivantes

    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
     
    int main(int argc, char *argv[], char *envp[]) {
    ---
    char Opercmd[80];
    char space =' ';
    typedef struct HWMCA_DATATYPE_S HWMCA_DATATYPE_T;
    HWMCA_DATATYPE_T    aHwmcaDataType[10];
    ---
    /*valorisation des élements de la structure */
       memset(&aHwmcaDataType[j],'\0',HWMCA_DATATYPE_SIZE);         
       switch (aHwmcaDataType[j].ucType) {                    
          case HWMCA_TYPE_OCTETSTRING:                        
                 aHwmcaDataType[j].ucType = (UCHAR)atoi(argv[5]);
                 strcpy(OperCmd,argv[6];
                 strcat(Opercmd,Space);   
                 strcat(Opercmd,argv[7];
                 aHwmcaDataType[j].ulLength = strlen(Opercmd)+1;
                 aHwmcaDataType[j].pData    = Opercmd;
                 aHwmcaDataType[j].pNext = NULL;
                 break;
         default :
                break;
         }  
       ----
       ----
    return(0)
    }
    Je pense que les éléments pNext, ucType et ulLength sont correctement valorisés, mais j'ai un doute pour pData. (je ne peux pas tester le code!!)

    Ma question est Opercmd étant un tableau de char en codant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aHwmcaDataType[j].pData    = Opercmd;
    Est-ce que je passe bien au pointeur pData l'adresse du premier élément du tableau puisque Opercmd est un tableau de char, ou suis je obligé de coder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aHwmcaDataType[j].pData    = &Opercmd;

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    D'après c equi est indiqué dans la définition des valeurs de la structure, =Opercmd devrait être bon.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. invalid static_cast from type `void
    Par barbarello dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 04/01/2006, 12h04
  2. Type void
    Par rod59 dans le forum C
    Réponses: 5
    Dernier message: 19/11/2005, 16h01
  3. [LG]Liste de pointeurs de type pointer
    Par tom_snop dans le forum Langage
    Réponses: 4
    Dernier message: 29/03/2005, 23h40
  4. Type void * ... petite question !
    Par Franck.H dans le forum C
    Réponses: 29
    Dernier message: 28/03/2005, 13h38
  5. type void* dans une structure
    Par barbapapaz dans le forum C
    Réponses: 3
    Dernier message: 16/07/2004, 16h11

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