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 :

Segfault - perl_call_argv :(


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Segfault - perl_call_argv :(
    Salut les gens
    Voila, petit segfault tres enervant et je ne vois vraiment pas pourquoi il rsete colle a mon executable... si quelqu'un avait une idee ca me depannerait beaucoup !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      char    **tab;
     
      tab = malloc(3 * sizeof(char *));
      tab[0] = malloc(sizeof(char *));
      tab[0] = fd;
      if (!(perl_call_argv("pl_read", G_SCALAR | G_DISCARD, tab)))
        {
          perror("Didn't work!\n");
          exit(EXIT_FAILURE);
        }
    J'ai essaye en declarant uniquement char *tab[2], en ne mallocant pas, en mallocant, et tout et tout, et rien n'y fait.... Help :'(

    Et merci d'avance a tous !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    et de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab = malloc (3 * sizeof (*tab));
    tab[0] = malloc(sizeof(**tab));
    d'ailleurs un conseil, vérifie le retour des malloc systématiquement !

    Un lien qui peut t'être utile: http://c.developpez.com/faq/c/?page=...bleau_2D_alloc
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      tab = xmalloc(3 * sizeof(*tab));
      tab[0] = xmalloc(sizeof(**tab));
    Rien n'y fait, le segfault est toujours la
    (et merci de m'avoir rappele de verifier mes valeurs de retour ^_^)

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    fd correspond à quoi (surtout le type) ? Tu comptes utiliser les trois indice alloués ou bien que un seul car dans ce cas précis, n'en alloue que un, tu fera une réallocation plus tard pour les autres si le nombre est indéterminé !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Invité
    Invité(e)
    Par défaut
    fd correspond a un file descriptor (mais je l'ai declare en int)...

    Concernant les indices, dans ce cas precis je n'en ai besoin que d'un en l'occurence... Erreur de ma part que je vais corriger de ce pas !

    De plus la fonction perl_call_argv prend en troisieme parametre un char **, donc j'hesitais un peu a passer autre que ca, meme en castant.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Hé bien le seul truc que je vois qui me turlupine un peu, serais de créer convertir fd sous forme de chaine de caractère puis d'affecter cette chaine au tableau, étant donné que tu as fait un tableau de chaines !

    Pour moi si ca ne résoud pas le problème c'est qu'il viens d'autre part car à part ca je ne vois pas !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je viens de passer a mon tableau un char * (en realite j'ai fait tab[0] = "lol", et le segfault n'est plus la...
    Donc c'est bien la ! Le probleme c'est que je n'arrive pas a filer au pointeur un simple char

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Un simple char s'écrit de la manière suivant, par exemple:
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Oui je sais bien, mais la fonction perl_call_argv recquiere un char **argv, donc je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void fonction(int fd)
    {
      char    **tab;
     
      tab = xmalloc(sizeof(*tab));
      tab[0] = fd;
    }

    Apparement, je ne peux pas passer un int a ce .... de char ** !
    Des qu'il lance la fonction perlcall, ==> Segfault... je suis vraiment perdu -_- Je suis si nul que ca ou quoi? Un tableau ne peut pas prendre de int ?

  10. #10
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    La doc dit:
    perl_call_argv calls the Perl subroutine specified by the C string stored in the subname parameter. It also takes the usual flags parameter. The final parameter, argv, consists of a NULL terminated list of C strings to be passed as parameters to the Perl subroutine.
    Donc il ne faut pas oublier de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab[1] = NULL;
    tab[2] = NULL;

  11. #11
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      char    *tab[1];
     
      tab[0] = fd;
      tab[1] = NULL;
      if (!(perl_call_argv("pl_read", G_SCALAR | G_DISCARD, tab)))
        {
          perror("Didn't work!\n");
          exit(EXIT_FAILURE);
        }

    Marche pas non plus -_- Je suis stupide ?

  12. #12
    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
      char    **tab;
     
      tab = malloc(3 * sizeof(char *));
      tab[0] = malloc(sizeof(char *));
      tab[0] = fd;
    Tout ceci à l'air incohérent.
    - si tab est un char ** , tab[0] est un char * et le deuxième malloc doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[0] = malloc(sizeof(char)) // = malloc(1);
    - Probablement, 1 char ne suffit pas sinon, il n'y a pas grand intérêt à faire tout ça.
    - Tu dis que fd est un int. va tronquer ton int en un char.
    Il semble plus correct d'écrire qq chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     char    **tab;
     tab = malloc(3 * sizeof(char *)); // donc 2 chaînes utiles pour perl_call_argv
     tab[2] = NULL; // pour terminer la liste des chaînes
     tab[0] = malloc(N); // A définir N pour dimensionner chaque chaîne 
    // N peut être différent pour chaque chaîne
     strcpy(tab[0] ,"La chaîne à mettre");
    ....

  13. #13
    Invité
    Invité(e)
    Par défaut
    Donc en gros je devrais essayer de convertir un int en char... pour faire l'inverse de "l'autre cote"... une idee de comment faire tout ca?

  14. #14
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par NaeiKinDus
    Donc en gros je devrais essayer de convertir un int en char... pour faire l'inverse de "l'autre cote"... une idee de comment faire tout ca?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf (tab[0], "%d", fd);

  15. #15
    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
    Donc en gros je devrais essayer de convertir un int en char... pour faire l'inverse de "l'autre cote"... une idee de comment faire tout ca?
    pas un int en char mais un int en chaîne de caractères mais tout dépend des arguments attendus par "pl_read"

  16. #16
    Invité
    Invité(e)
    Par défaut
    En effet Diogene, plutot en chaine de caracteres ^_^
    Et merci beaucoup Crocodilex je vais essayer ca de suite !

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par NaeiKinDus
    Voila, petit segfault tres enervant

    J'ai essaye en declarant uniquement char *tab[2], en ne mallocant pas, en mallocant, et tout et tout, et rien n'y fait...
    Il faut arréter de bricoler. Que dit la spec de perl_call_argv() ? Il s'agirait peut être de ne pas passer n'importe quoi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      tab[0] = malloc(sizeof(char *));
      tab[0] = fd;
    Et là, il faut refléchir 2 secondes...
    • Tu alloues un pointeur. Pourquoi ?
    • Tu écrases immédiatement la valeur du bloc alloué avec un entier ! Pourquoi ?

Discussions similaires

  1. Segfault sous gtk
    Par poxigua dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 01/12/2006, 12h29
  2. Malloc => segFault
    Par Chewbi dans le forum C++
    Réponses: 11
    Dernier message: 12/08/2006, 15h07
  3. [Signaux] et segfaults ;)
    Par tfe dans le forum C
    Réponses: 3
    Dernier message: 23/03/2006, 09h49
  4. segfault dépassement tableau ?
    Par ggnore dans le forum C
    Réponses: 7
    Dernier message: 22/12/2005, 17h39
  5. [linux]segfault lors d'un realloc d'une structure
    Par le mage tophinus dans le forum C
    Réponses: 2
    Dernier message: 10/10/2005, 13h30

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