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 dans une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 23
    Par défaut argv dans une fonction
    bonjour,
    une de mes fonction a besoin des argument de argv[] pour fonctionner, comment je fais pour les récupérer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int *ma_fontion(char **argv);
     
    int main(int argc, char *argv[]){
    ma_fontion(argv); // ???? erreur N°1
    }
     
    int *ma_fontion(char **argv){
    int *mes_operations
    // .... 
    return(mes_operations);
    // mes_operations => un tableau qui contient les résultats souhaités
    }
    erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ligne 5: attention : assignment from incompatible pointer type [enabled by default]
    ligne 10: attention : return from incompatible pointer type [enabled by default]

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 048
    Par défaut
    Bonjour,

    Je suis débutant en C, donc je vais essayer de pas dire de bêtises, mais je pense que c'est tout simplement à prendre en compte comme un tableau de char.

    L'indice 0 de ton tableau représente le nom du fichier, et l'indice 1 le paramètre suivant, etc...

    argc représente le nombre d'arguments, tu peux l'utiliser pour vérifier que le nombre de paramètres est cohérent pour l'exécution de ton code.

    Voilà, j'espère pas avoir dis de bêtises

    Un code fonctionnel pour tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(int argc, char *argv[])
    {
        if (argc == 2)
        {
            printf("Le nom de mon fichier est %s\n", argv[0]);
            printf("mon paramètre est %s\n", argv[1]);
            return 0;
        }
        return 1;
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 23
    Par défaut
    "ma_fonction" réalise des opérations avec des arguments, de ce coté là il n'y a pas de problème, et le résultat est stocké dans un tableau "mes_operations"

    le problème se situe au niveau de l'appel de la fonction, et aussi dans le "return(mes_operations)"

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 048
    Par défaut
    Pour ta fonction "ma_fonction"

    devrait être correct, par contre je ne comprend pas les doubles pointeurs, peut-être ne suis-je pas assez avancé pour comprendre cela.

    Mais ça m'étonnerait pas que ton erreur soit une erreur de pointeur, vu ton message d'erreur

    Voilà un autre exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void ma_fonction(char *argv)
    {
        printf("Mon paramètre est %s\n", argv);
    }
     
    int main(int argc, char *argv[])
    {
        if (argc == 2)
        {
            ma_fonction(argv[1]);
            return 0;
        }
        return 1;
    }
    ou ceci est possible aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char *ma_fonction(char *argv)
    {
        return argv;
    }
     
    int main(int argc, char *argv[])
    {
        if (argc == 2)
        {
            printf("mon paramètre est %s\n", ma_fonction(argv[1]));
            return 0;
        }
        return 1;
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 23
    Par défaut
    moi j'ai seulement écouté les avertissements lorsque je compile, on me dit qu'il faut un double pointeur.

    oui ton programme marche très bien, mais c'est pareil de mon coté, lorsque j'utilise un printf dans "ma_fonction", le résultat s'affiche normalement.

    Ce que je cherche à faire, c'est de stocker le résultat dans un tableau au lieu de l'afficher, ensuite le renvoyer vers ma fonction principal, et c'est là que sa se complique

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 048
    Par défaut
    Tu ne peux pas retourner un tableau

    Voir ci-dessus j'ai édité mon message précédent

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 23
    Par défaut
    un pointeur sur un tableau c'est possible

    j'essaie en ce moment de modifier un code qui fonctionnait, mais je l'ai pas encore fini, j'ai une erreur de segmentation, je repasserai tout à l'heure car je dois y aller
    merci pour le coup de main en tout cas

    voila un code un plus complet, la fonction ne fait pas grand chose, elle réalise juste une copie de argv, mais c'est juste un exemple dont je vais m'inspirer pour réaliser mon programme du même style.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
     
    /*  Prototype  */
    int * Function(int la_taille,char **argv);
     
    /*  Main  */
    int main(int argc, char *argv[])
    {
      char *tableau_final;
      int nombre_case = argc;
      int i;
      /* Allocation */
      printf("Affichage depuis la fonction Function:\n");
      tableau_final = Function(nombre_case,argv); // fonction
     
      printf("\n");
      printf("Affichage depuis la fonction main :\n");
      for(i=0;i<nombre_case;i++){
        printf("%s\n",tableau_final[i]);
      }
      printf("\n");
     
      return 0;
    }
     
    /*  Function  */
    int * Function(int la_taille, char **argv)
    {  
      char * tab_a_renvoyer;
      int i;
      /* Allocation */
      if( (tab_a_renvoyer = (char*) calloc (la_taille,sizeof(char))) == NULL)
        {
          perror("Echec");
          exit(0);
        }  
      for(i=0;i<la_taille;i++){
        tab_a_renvoyer[i]=argv[i];
      }
       for(i=1;i<la_taille;i++){
         printf("%s |",argv[i]);
      }
     
      return tab_a_renvoyer;
    }

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    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 492
    Billets dans le blog
    1
    Par défaut
    Je ne suis pas sûr que les warnings que tu indiques soient causés par les passages d'argv en paramètres. J'ai fait une fonction pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void test(char **arguments, int nbarg)
    {
        int c;
        puts("\n\n Fonction test\n");
        for(c=0;c<nbarg;c++)
        {
            printf("argv[%d] = [%s]\n", c, arguments[c]);
        }
    }
    que j'appelle dans le main() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main(int argc, char *argv[])
    {
       test(argv, argc);
       return 0;
    }
    Je n'ai pas de warning à la compilation, en utilisant -Wall -Wextra de gcc.


    Une remarque sur ta fonction utilisant argv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *ma_fontion(char **argv);
    Il faut aussi que tu passes argc en paramètre, sinon impossible pour toi de savoir combien d'éléments contient le tableau. Que souhaites-tu faire dans cette fonction ?

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

Discussions similaires

  1. Recuperation de formulaire dans une fonction
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 23/06/2004, 15h04
  2. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  3. Utilisez MinimizeName() dans une fonction
    Par James_ dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/05/2004, 18h05
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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