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 :

Fonctionnement des adresses, cas pratique


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Points : 50
    Points
    50
    Par défaut Fonctionnement des adresses, cas pratique
    Bonsoir,

    J'ai recemment apprit qu'il etait inutil d'envoyer l'adresse d'un char * pour pouvoir le modifier dans une autre fonction, ce qui est logique vue qu'il s'agit d'un pointeur sur adresse.

    J'ai donc voulut modifier un programme qui fonctionne (un petit interpréteur de commandes) sans envoyer des adresses systématiquement, hors ca ne fonctionne plus ! quand je lance mon exécutable ./minshell, il se print dans mon char **args qui récupère des arguments que je lui envoie par un read de 0.

    J'aimerais comprendre pourquoi je n'obtiens pas la même chose dans ces 2 programmes (évidemment, quand il y a du rouge et du vert, c'est soit l'un, soit l'autre):

    Programme_1 qui me print mon exécutable dans args.args et qui colle la commande par dessus (Ex: si j'entre ls, args.args[0] contient "lsminishell" et si j'entre rien, "./minishell")
    Programme_2 qui fonctionne correctement (qui me print la commande que j'entre en argument dans args.args (Ex: Si j'entre rien args.args[0] contient rien, et si j'entre ls, args.args[0] contient "ls"))

    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
    void            my_malloc_args_tab(char **args char **(*args), int len, char *buffer)
    {
      int           i;
      int           a;
      int           y;
    
      i = 0;
      a = 0;
      y = 0;
      args = malloc((len + 1) * sizeof(*args));
    
      while (buffer[i])
        {
          if (buffer[i] == ' ')
            i++;
          if (buffer[i] != ' ')
            {
              while ((buffer[i]) && (buffer[i] != ' '))
                {
                  args[y][x] = buffer[i];
                  i++;
                  x++;
                }
              y++;
              x = 0;
            }
        }
    }
    
    void            my_malloc_args_tab(char **args, int len, (char **(*args), int *len char *buffer)
    {
      int           i;
      int           a;
      int           y;
    
    
      i = 0;
      a = 0;
      y = 0;
      args = malloc((len + 1) * sizeof(*args));
      while (buffer[i])
        {
          if (buffer[i] == ' ')
            i++;
          if (buffer[i] != ' ')
            {
              while ((buffer[i]) && (buffer[i] != ' '))
                {
                  i++;
                  a++;
                }
              args[y] = malloc((a + 1) * sizeof(**args));
              args[y][a] = '\0';
              y++;
            }
          a = 0;
        }
      args[y] = '\0';
    }
    
    
    void            read_args(t_args *ptr)
    {
      char          buffer[BUFF_SIZE];
      int           i;
    
      i = 0;
      ptr->nb_read = read(0, buffer, BUFF_SIZE);
      while (buffer[i] != '\n')
        i++;
      buffer[i] = '\0';
      len_args(&(ptr->len), buffer);
      my_malloc_args_tab(&(ptr->args), &(ptr->len), buffer);
      full_args_tab((ptr->args), buffer);
     my_malloc_args_tab(&(ptr->args), ptr->len, buffer);
      full_args_tab((ptr->args), buffer);
      i = 0;
      my_putchar('\n');
      my_putstr("Buffer contient:          ");
      my_putchar('[');
      my_putstr(buffer);
      my_putchar(']');
      my_putchar('\n');
      while (buffer[i])
        {
          buffer[i] = 0;
          i++;
        }
    }
    Merci de m'éclairer ! J'ai l'impression de découvrir une notion élémentaire !

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonjour,

    On t'a plus ou moins mal repondu. En fait, j'ai l'impression qu'on t'as donné des information inexacte et mal formulé.



    Dans le cas d'un tableau dynamique (donc au minimum (type) *Tableau) :

    Si tu declare ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *tab = malloc(10);
    Tu as un tableau de 10 char alloué dynamiquement.

    Maintenant, quelle est la difference entre ces deux prototype sachant la declaration de tab ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void Prototype1 (char *tab);
    void Prototype2 (char **tab);

    En realité, le prototype1 ne permettra que de modifier le contenue de tab. Le prototype2 permettra de modifier tab en lui-meme, c'est a dire sa longueur via malloc/calloc/realloc.

    C'est cette erreur que tu as : tu tente de modifier via malloc ton tableau mais tu adopte l'attitude du prototype1.

    C'est donc la version verte qui est correcte et qu'il faut conserver.


    j'espere avoir été clair.

    Bonne soirée

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Points : 50
    Points
    50
    Par défaut
    Oui très clair !

    Merci, bonne soirée !

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

Discussions similaires

  1. [2008R2] Question sur le fonctionnement des jobs en cas d'erreur
    Par Kropernic dans le forum Développement
    Réponses: 8
    Dernier message: 19/02/2013, 16h30
  2. Réponses: 1
    Dernier message: 05/06/2009, 19h56
  3. Réponses: 1
    Dernier message: 24/11/2008, 12h07
  4. Auto suggestion des adresses ne fonctionne pas
    Par Ludo75 dans le forum Outlook
    Réponses: 1
    Dernier message: 27/12/2007, 08h42
  5. [langage] fonctionnement des Processus
    Par GMI3 dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2003, 11h12

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