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 :

Incomprehensible :/ (Pointeur non portable)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut Incomprehensible :/ (Pointeur non portable)
    Salut à tous !

    Alors là je dois dire que c'est trés trés fort ... J'ai un programme qui fonctionne trés bien sur la machine ou je l'ai implémenté, mais qui n'était pas du tout portable à cause de son interface graphique GTK (enfin il à juste fallu que j'insere le runtime windows dans l'install). Soit. Mais alors une fois GTK installé sur la machine recevante, l'erreur la plus improbable de tous les temps est arrivée (il a deja fallu lutter pour voir d'ou ca venait tellemment c'était imprévisible )
    Je m'explique : Au debut de mon programme, je fais une saisie de 'selection gtk' (selection du chemin du fichier à exploiter). Et je stock ce chemin dans un gchar* chemin, qui est mis dans ma structure principale (en GTK pour ceux qui ne connaissent pas, on met tous les elements à passer dans les fonctions dans une même structure car les fonctions callbacks ne supportent qu'un argument). Enfin bref tout ca me paraissait parfait. SAUF QUE sur la machine recevante, le chemin est erroné (il devait me filer l'adresse du pointeur un truc du genre enfin c'était illisible) et alors LA je dois dire que ca m'a vraiment stupefai ! Sincerement je ne comprends pas POURQUOI ca fait ca c'est hallucinant !
    Si quelqu'un à la moindre idée, qu'il reponde parce que en plsu ca intervient alors que je dois rendre le tout donc ca la fout vraiment mal !!!

    Merci, Skip

  2. #2
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Et si tu nous mettais ton code pour voir un peu...
    l'erreur la plus improbable de tous les temps est arrivée
    J'ai tendance à penser l'erreur la plus classique

  3. #3
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    ah bon moi ca me parait inconcevable ce genre de truc mdr
    bah le code je vais essayer de prendre ce qui nous interesse ata je reviens

  4. #4
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    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
     
    typedef struct app
    {
        (...)
        gchar* chemin;
    }APP; 
     
    typedef struct dede
    {
        (...)
        gchar* chemin;
    }DEDE;
     
    void recuperer_chemin (GtkWidget *bouton, GtkWidget *file_selection)
    {
        (...)
        const gchar* prefixe = NULL;
        const gchar* chemin = NULL;
     
        chemin = gtk_file_selection_get_filename(GTK_FILE_SELECTION (file_selection) );
        gtk_widget_destroy(file_selection);
     
        (...)
                prefixe = gtk_entry_get_text(GTK_ENTRY(pEntry));
                break;
        (...)
     
        if(prefixe){
            strcat((gchar*)chemin,"/");
            strcat((gchar*)chemin,prefixe);
     
            APP *app = creer_interface(chemin);
            gtk_widget_show_all(app->window);
        }
        else{
            (...)
        }
    }
     
    APP* creer_interface(const gchar* chemin)
    {
        (...)
        APP *app = NULL;
     
        if((app = (APP*)malloc(sizeof(APP))) != NULL)
        {   
            (...)
            app->chemin = (char*)chemin;
     
            (...)
                /* Creation du boutton 'afficher' (insere dans la table) */
                app->button = gtk_button_new_with_label ("Thanks to choose an area");
                g_signal_connect (G_OBJECT (app->button), "clicked", G_CALLBACK (AffichRep), app);
                gtk_table_attach_defaults(GTK_TABLE(app->table), app->button, 6, 11, 2, 7);
     
            (...)
        }
     
        return app;
    }
     
    void AffichRep (GtkWidget *bouton, APP* app)
    {
      (...)
      DEDE *dede;
      (...)
     
      if(app->affich){
     
          dede = (DEDE*)malloc(sizeof(DEDE));            
     
          (...)
              dede->chemin = app->chemin;
     
              /* Création de l'image affichée (insérée dans la vbox2) */
              for(k=0;k<256;k++)nom[k]=(int)NULL;
              for(k=0;k<4;k++)num[k]=(int)NULL;
              strcpy(nom,app->chemin);
              sprintf(num,"%d",dede->etat);
              strcat(nom,num);
              strcat(nom,".bmp");
              dede->pImg2 = gtk_image_new_from_file (nom);
              gtk_box_pack_start (GTK_BOX (pVbox2), dede->pImg2, TRUE, TRUE, 0);
              (...)
    	      // Voila pourquoi j'utilises dede :
                  g_signal_connect(G_OBJECT(pSuiv), "clicked", G_CALLBACK(OnClickNext), dede);
      (...)
      gtk_widget_show_all (pWindow);
    }
    Voila le code mais bon vu que ca marche sur ma machine de developpement je vois pas pourquoi il y aurait une erreur de code

    Et pour resoudre le probleme peut etre devrais je mettre mon chemin sur pointeur ?

  5. #5
    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
    est-ce qu'on peut voir les déclarations des variables et ce serait sympa de dire où ton programme plante dans le code...

    Jc

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     const gchar* chemin = NULL;
    ...
    strcat((gchar*)chemin,"/");




    Quant au type gchar, je peux y jeter un coup d'oeil ?
    Je parie qu'il y a une embrouille à propos de l'unicode...
    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.

  7. #7
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Citation Envoyé par fearyourself
    est-ce qu'on peut voir les déclarations des variables et ce serait sympa de dire où ton programme plante dans le code...

    Jc
    Bah declarations de variables y'en a un paquet donc j'ai mis que celles qui nous interessent (chemin et prefixe)

    Quant au plantage bah c'est lors de l'appel de l'image avec le chemin precedemment capturé. Il ne reconnais pas le chemin quoi. (ca donne un truc du genre *$%^)

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par skip78
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        chemin = gtk_file_selection_get_filename(GTK_FILE_SELECTION (file_selection) );
        gtk_widget_destroy(file_selection);
    Citation Envoyé par gtk_file_selection_get_filename
    The returned string points to a statically allocated buffer

    Il serait préférable de faire une copie du chemin retrouné grâce à g_strdup.

  9. #9
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Citation Envoyé par gege2061
    Il serait préférable de faire une copie du chemin retrouné grâce à g_strdup.
    Ah bien vu !
    Effectivement ceci expliquerait cela ...
    Si il se fout en static le bougre :/
    Je vais voir ca merci en tout cas merci

  10. #10
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par skip78
    SAUF QUE sur la machine recevante, le chemin est erroné (il devait me filer l'adresse du pointeur un truc du genre enfin c'était illisible) et alors LA je dois dire que ca m'a vraiment stupefai ! Sincerement je ne comprends pas POURQUOI ca fait ca c'est hallucinant !
    Je parie que c'est une erreur du genre depassement, ou double free, ou acces apres un free.. un truc dont on s'aperçoit pas sur une machine A et qui plante par contre sur la machine B.

    Passez vos logiciels à Valgrind
    Faites les bouillir
    Pour voir si les depassements d'origine
    Peuvent revenir

  11. #11
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Citation Envoyé par Gruik
    Je parie que c'est une erreur du genre depassement, ou double free, ou acces apres un free.. un truc dont on s'aperçoit pas sur une machine A et qui plante par contre sur la machine B.
    Je vais voir ca merci ^^

  12. #12
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Ouais bon le programme marche sur certaines machines et pas sur d'autres donc ca doit effectivement être une erreur de depassement de memoire. Le problème c'est que je ne sais pas comment faire pour verifier ca

    Valgrind est une enigme pour moi je l'ai dl sur le site officiel, et il ne s'installe pas et je n'aarive pas à l'installer ni ne sait comment m'en servir
    Ouiii je sais je suis une merde mais là j'ai besoin d'aide alors je l'assumes

  13. #13
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Bon Valgrind ca m'a l'air de marcher que sous linux en fait donc Que faire pour detecter un depassement de memoire ???

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par skip78
    Bon Valgrind ca m'a l'air de marcher que sous linux en fait donc Que faire pour detecter un depassement de memoire ???
    Gestion de la mémoire, ça devrait pouvoir t'aider, par contre il faut remplacer les appel à malloc, free et compagnie par sma_malloc, sma_free et sma_compagnie () et inclure le fichier d'en tête.

    Il y a aussi le module SYSALLOC : http://emmanuel-delahaye.developpez.com/clib.htm d'Emmanuel Delahaye, je ne crois pas qu'il détecte les dépassement de capacité.

    Et l'article qui a inspiré mon module : Allocation de mémoire sécurisée en C et C++


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

Discussions similaires

  1. [debutant] Pointeur non-initialisé ?
    Par Pit29 dans le forum C
    Réponses: 8
    Dernier message: 04/01/2007, 16h55
  2. .exe non portable?
    Par poukill dans le forum C++
    Réponses: 41
    Dernier message: 16/06/2006, 11h09
  3. Framework .NET 2.0: application non portable
    Par alceste dans le forum C++
    Réponses: 10
    Dernier message: 16/06/2006, 08h20
  4. comparaison de pointeur non portable
    Par kykyn dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 10h58
  5. Probléme de code non portable
    Par Stany dans le forum Windows
    Réponses: 2
    Dernier message: 23/08/2005, 11h02

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