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 excecution programme [Linux]


Sujet :

C

  1. #21
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par nuFox Voir le message
    C'est quand meme chiant que ca tourne sous windows et pas sous linux ...

    Le malloc retourne quelque chose ? Me semblait que c'était un void ... Bah je vais tester ca alors ... Pour voir ce qu'il me donne ! Mais bon ... il garnit bien mon paquet ... Je le vois dans les logs :p
    malloc() ne retourne pas void, mais un pointeur générique que type (void *).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  2. #22
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Et? Les arguments des fonctions sont fait pour ça, non? Oui, c'est grave. On ne devrait pas utiliser de variable sauf cas exceptionnel qu'il faut être en mesure de justifier.

    Maintenant, si c'est un projet perso qui n'est pas destiné à être maintenu par un autre programmeur, la gravité de la chose est toute relative. Mais c'est une très mauvaise habitude... et une pratique fortement déconseille. Autant partir d'un bon pied dès le début et prendre de bonnes habitudes aussi dans ses projets persos.

    Thierry
    Bah le projet final est destiné a faire une DLL ... Donc le code ne serait pas dispo ...

    Je vais essayé un maximum de degrossir les variables globales ... Mais bon certaines sont quand meme bien placé genre les step et erreur ... mais merci du conseil ... Je ne savais pas que c'était si mauvais que ca ...

  3. #23
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Bon voila, je viens de tester le retour du malloc ... et il ne vaut pas NULL ... Donc c'est qu'il fait bien l'allocation ... Donc je ne comprend pas pourquoi il ne free pas ... Enfin qu'il me met une erreur de segmentation ... :'(

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    si tu as une erreur de segmentation à cet endroit c'est que packet->data n'est pas une adresse valide.
    Après je sais pas pourquoi.

  5. #25
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Hum... Ok ... Lol ... Bah ... Hum ... Saleté de comportement non comprehensible

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    tu peux déjà mettre un printf avant et après chaque free dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    free(packet->data);
    packet->data = NULL;
    free(packet);
    packet = NULL;
    pour savoir lequel des deux plante

  7. #27
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par pasdeface Voir le message
    tu peux déjà mettre un printf avant et après chaque free dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    free(packet->data);
    packet->data = NULL;
    free(packet);
    packet = NULL;
    pour savoir lequel des deux plante
    C'est ce que j'ai fais ... Il ne va pas plus loin que le premier celui du dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	printf("recv4\n");
    	//Liberation de la mémoire.
    	free(packet->data);
    	printf("recv5\n");
    	packet->data = NULL;
    	printf("recv6\n");
            free(packet);
            packet = NULL;
    	printf("recv7\n");
    Il n'affiche que le recv4

  8. #28
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Quand tu dis :
    // Indiquez l'adresse IP de votre serveur
    Quel type de serveur? que fait ce programme? moi la seule erreur que j'obtiens c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur connexion fonction connect()
    Erreur connexion fonction connect()
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #29
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    en meme temps si tu modifies le code sans le dire (par rapport a ton premier message.. ) !!
    pourquoi avoir ajouté une * devant packet->data?

  10. #30
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Quand tu dis :

    Quel type de serveur? que fait ce programme? moi la seule erreur que j'obtiens c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur connexion fonction connect()
    Erreur connexion fonction connect()
    Le serveur est un automate ... Et le "progamme" est censé échanger des informations avec le serveur ... Il est normale que tu obtienne une erreur puisque tu n'es pas connecté au serveur ... Mais ce probleme a été résolu ... J'avais oublié de relancer mon interface réseaux (pas l'habitude sous linux)
    Et donc il affichais cette erreur parce qu'il ne savait pas contacter l'host puisque je n'étais pas sur le réseaux ... Mais now ca fonctionne ... Et j'échange bien une information ... Mais il plante au free (Je sais que j'échange une info, puisque dans mon log, je vois le paquet qui a été envoyé et celui qui a été recu)

  11. #31
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par pasdeface Voir le message
    en meme temps si tu modifies le code sans le dire (par rapport a ton premier message.. ) !!
    pourquoi avoir ajouté une * devant packet->data?
    Erreur de manipulation .. Il n'y a plus détoile devant le packet->data ... Je pensais que comme c'était un pointeur vers un pointeur, une étoile aurait peut etre été necessaire ... Mais j'ai remarqué que non et donc j'ai remis comme au debut packet->data et j'ai edité mon post :$

    ... Et excuse moi d'avoir mis des printf sans le spécifié :'( ...

  12. #32
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par nuFox Voir le message
    Le serveur est un automate ... Et le "progamme" est censé échanger des informations avec le serveur ... Il est normale que tu obtienne une erreur puisque tu n'es pas connecté au serveur ... Mais ce probleme a été résolu ... J'avais oublié de relancer mon interface réseaux (pas l'habitude sous linux)
    Et donc il affichais cette erreur parce qu'il ne savait pas contacter l'host puisque je n'étais pas sur le réseaux ... Mais now ca fonctionne ... Et j'échange bien une information ... Mais il plante au free (Je sais que j'échange une info, puisque dans mon log, je vois le paquet qui a été envoyé et celui qui a été recu)
    Ok alors je te donne ton erreur :
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packet = malloc(sizeof(struct packetRec));
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packet = malloc(sizeof * packet);
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    packet = malloc(sizeof(struct packetRec));
    memset(packet, 0x0, sizeof(struct packetRec));
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packet = calloc(1, sizeof * packet);
    si tu avais respecté ça, ça t'aurais éviter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    packet = malloc(sizeof(struct packetRec));
    packet->data = malloc(nbCaractere-6);
     
    // Mise à zero.
    memset(packet, 0x0, sizeof(struct packetRec));
     
    memcpy((void*)packet, (const void*)recbuf, nbCaractere);
    j'ai pas besoin d'expliquer, je pense que tout le monde voit le problème...
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  13. #33
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Ok alors je te donne ton erreur :
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packet = malloc(sizeof(struct packetRec));
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packet = malloc(sizeof * packet);
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    packet = malloc(sizeof(struct packetRec));
    memset(packet, 0x0, sizeof(struct packetRec));
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packet = calloc(1, sizeof * packet);
    si tu avais respecté ça, ça t'aurais éviter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    packet = malloc(sizeof(struct packetRec));
    packet->data = malloc(nbCaractere-6);
     
    // Mise à zero.
    memset(packet, 0x0, sizeof(struct packetRec));
     
    memcpy((void*)packet, (const void*)recbuf, nbCaractere);
    j'ai pas besoin d'expliquer, je pense que tout le monde voit le problème...
    Au risque de paraitre con ... Moi je ne vois pas trop le probleme ... :s

    On peut faire un malloc avec comme parametre pour la taille, le packet lui même que l'on vient de creer ? :s

  14. #34
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    packet = malloc(sizeof(struct packetRec));
    packet->data = malloc(nbCaractere-6);
     
    // Mise à zero.
    memset(packet, 0x0, sizeof(struct packetRec));
     
    memcpy((void*)packet, (const void*)recbuf, nbCaractere);
    tu ne vois pas le problème là?
    tu initialises le champ data et puis tu le redéfinis quand tu fais ton memset, donc d'une part ça te fait une fuite de mémoire, d'autre part tu fais un free() sur un pointeur dont l'adresse est 0x00000000.
    Ensuite je ne suis pas sûr du comportement de ton memcpy, mais je n'ai pas poussé plus loin.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  15. #35
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    packet = malloc(sizeof(struct packetRec));
    memset(packet, 0x0, sizeof(struct packetRec));
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packet = calloc(1, sizeof * packet);
    Les deux initialisations se valent et ne sont pas très portables. Je préfère:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    packet = malloc(sizeof *packet);
    if (packet != NULL)
    {
        static struct packetRec const tmp = {0};
        *packet = tmp;
     
         /* Suite du code */
    }
    else
    {
        /* Action en cas d'ecec de l'allocation */
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  16. #36
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Ha ui ... Il va mettre des 0x0 a tout les elements de la structure ... Et comme data est déclaré comme un pointeur, on donne une adresse au pointeur de 0x0 ... Je pense avoir compris ... Mais pourquoi cela fonctionne t'il sous windows ? et pas sous linux ?
    Hum ... Bon maintenant il s'agit de regler le probleme ...

    Mais aussi ... Avec le memset ... Si je ne peux pas le faire parce que je donne une addresse 0x0 a data ... Comment faire ?

  17. #37
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Portables, elles le sont, elles font bien ce qu'elles doivent faire, allouer un espace et mettre des 0 partout, maintenant je n'ai pas dis que c'est ce que le PO voulait, je pense qu'il voulait mettre des valeurs par défaut auquel cas effectivement, ça n'est pas la bonne méthode, à ce sujet la tienne est excellente. ça n'empêche qu'il y a un gros problème avec cette portion de code.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  18. #38
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Correction, elles ne sont portables que sur une architecture ou zéro est toujours représenté par "all bits to zero", quel que soit le type de la variable (ce qui inclut le x86, à ma connaissance).
    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.

  19. #39
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Mais le probleme avec vos déclaration, c'est qu'il ne va pas generer un espace mémoire pour le pointeur data qui se trouve dans la structure ... Mais uniquement pour la structure elle meme ... Enfin j'suis un peu perdu avec toute vos solutions :s

    Excusez moi de mon newbisme

  20. #40
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    et bien c'est simple :
    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
    packet = malloc(sizeof *packet);
    if (packet != NULL)
    {
        static struct packetRec const tmp = {0};
        *packet = tmp;
        packet->data = malloc(nbCaractere-6);
        if (packet->data != NULL)
        {
             /* ton code ici */
        }
    }
    else
    {
        /* Action en cas d'échec de l'allocation */
    }
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/05/2005, 09h50
  2. [TP]Problème de programme exécutable en mode graphique
    Par GoodVibe dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 24/09/2004, 09h47
  3. Livre sur la programmation linux (shell et noyau)
    Par Tchetch dans le forum Linux
    Réponses: 10
    Dernier message: 07/07/2004, 08h27
  4. [Kylix] probleme execution programme
    Par vin's dans le forum EDI
    Réponses: 1
    Dernier message: 31/03/2004, 12h25
  5. Pb passage programme linux->visual C++
    Par StephP dans le forum MFC
    Réponses: 3
    Dernier message: 16/01/2004, 12h56

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