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 :

Probleme de bus error, pourquoi ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Par défaut Probleme de bus error, pourquoi ?
    Bonsoir,

    Je veux faire un programme qui récupère dans un char *result ce que l'on read en entrée standard, je veux que le programme tourne en boucle et renvoie 0 lorsqu'il a pu read entièrement ce que je lui donne (jusqu'au '\n').

    Je n'ai pas le droit a la fonction realloc qui m'aurait simplifie la vie, donc je pense avoir trouve une astuce mais j'ai un problème de bus error, sans vraiment comprendre pourquoi.

    En gros je dis que tmp = result et result = tmp + buffer en essayant de free et malloc comme il faut... Voici mon code qui ne fait rien d'extraordinaire:

    .main.c
    .my_get_args.h
    .my_get_args.c


    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
    #include <stdio.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include "my_get_args.h"
     
    int     my_strlen(char *str)
    {
      int   i;
     
      i = 0;
      while (str[i])
        i++;
      return (i);
    }
     
    void    my_putstr(char *str)
    {
      write(1,str,my_strlen(str));
    }
     
    int             main()
    {
      t_test        args;
     
      args.result = malloc(1 *sizeof(*args.result));
      args.result[0] = '\0';
      while (my_get_args(&args) != 0)
          my_putstr(args.result);
      return (0);
    }

    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
    #ifndef         __MY_GET_ARGS_H__
    # define        __MY_GET_ARGS_H__
     
    # define BUFF_SIZE 1
     
    typedef struct  s_test
    {
      char          *result;
      char          *tmp;
    }               t_test;
     
    void            my_strcpy(char *(*tmp), char *(*result), int *i);
    void            my_strcpnext(char *(*result), char *buffer, int *debut, int *i);
    int             my_get_args(t_test *ptr);
    void            my_putstr(char *str);
    int             my_strlen(char *str);
     
    #endif          /*__MY_GET_ARGS__ */

    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
    #include <stdlib.h>
    #include <unistd.h>
    #include "my_get_args.h"
     
    void            my_strcpy(char *(*tmp), char *(*result), int *i)
    {
      while (*result[*i])
        {
          *tmp[*i] = *result[*i];
          *i = *i + 1;
        }
      *tmp[*i] = '\0';
    }
     
    void            my_strcpnext(char *(*result), char *buffer, int *debut, int *i)
    {
      *result[*i] = buffer[*debut];
      *i = *i + 1;
      *debut = *debut + 1;
    }
     
    int             my_get_args(t_test *ptr)
    {
      char          buffer[BUFF_SIZE];
      int           fin;
      int           debut;
      int           i;
     
      debut = 0;
      if (debut == 0)
        fin = read(0, buffer, (BUFF_SIZE + 1));
      buffer[BUFF_SIZE] = '\0'
      i = 0;
      ptr->tmp = malloc(((my_strlen(ptr->result)) + 1) * sizeof(*(ptr->tmp)));
      ptr->tmp[0] = '\0';
      if (ptr->result[0])
        my_strcpy(&(ptr->tmp), &(ptr->result), &i);
      free(ptr->result);
      ptr->result = malloc((my_strlen(ptr->tmp) + my_strlen(buffer) + 1) * sizeof(*(ptr->result)));
      i = 0;
      if (ptr->tmp[0])
        my_strcpy(&(ptr->result), &(ptr->tmp), &i);
      while (debut < fin && buffer[debut] != '\n')
        my_strcpnext(&(ptr->result), buffer, &debut, &i);
      ptr->result[i] = '\0';
      free(ptr->tmp);
      if (buffer[debut] == '\n')
        return (0);
      else
        return (1);
    }

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Moi, je ne comprends pas. Si tu as le droit d'utiliser malloc ou un tableau statique de taille maximale, utilise plutôt strdup et on en parle plus, non ?

    Jc

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Par défaut
    De taille maximale ? J'ai code un shell assez basique, et je ne veux pas qu'il plante quand on lui envoie "de la merde" genre un ./random ou je ne sais quelle autre manip, bref je me prends la tête la dessus pour faire quelque chose d'implantable, je veux donc un code qui peut fonctionner lorsqu'on lui envoie une commande plus grande que le buffer.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void            my_strcpy(char *(*tmp), char *(*result), int *i)
    {
      while ((*result)[*i])
        {
          (*tmp)[*i] = (*result)[*i];
          *i = *i + 1;
        }
      (*tmp)[*i] = '\0';
    }
    et même erreur plus loin.

    Pourquoi pas tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int my_strcpy(char *tmp, char *result, int i)
    {
      while (result[i])
        {
          tmp[i] = result[i];
          i = i + 1;
        }
      tmp[i] = '\0';
      return i;
    }

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Par défaut
    Pour le return de i tu as raison je pourrais faire comme ca, mais dans cette fonction je ne fais pas qu'avancer i, ce que je fais c'est principalement remplir mon char *tmp, car ensuite je free result et le re-remplit grâce a tmp (tmp me sert en fait de buffer, le temp de free result et de le remalloc de la taille de tmp + buffer), que je free après.

    Sinon je viens d'apporter quelques corrections sur mon code, le problème était que je ne mettait pas de '\0' a la fin de mon buffer et que je mettait un OU au lieu d'un ET dans une de mes conditions, mais le programme ne fonctionne toujours pas, il segfault quand il y a plus d'un caractère, avec un seul ca fonctionne mais ca ne quitte pas lorsqu'il atteint le '\n'.

Discussions similaires

  1. Probleme de valeurs fixes et bus error
    Par toto08 dans le forum C
    Réponses: 18
    Dernier message: 02/01/2007, 14h44
  2. VBA EXCEL : Probleme avec On Error
    Par izalec dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2006, 10h23
  3. [Débutant] Bus Error et scanf
    Par BiLLKiLL dans le forum C
    Réponses: 2
    Dernier message: 17/09/2006, 20h47
  4. bus error sur une machine SUN
    Par mhtrinh dans le forum C
    Réponses: 14
    Dernier message: 10/07/2006, 16h43
  5. bus error
    Par salseropom dans le forum C
    Réponses: 3
    Dernier message: 15/12/2005, 11h59

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