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

  1. #21
    Membre habitué 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
    Points : 133
    Points
    133
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     gchar nom[256],num[4];
        gchar *txt;
        FILE *fp;
     
        nom = NULL;
        num = NULL;
    bah de toute facon ca ne marche pas !
    'incompatibles types in assignment'
    En fait ca ne marche pas parce que j'ai deja alloué un espace memoire aux chaines ...

  2. #22
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    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.

  3. #23
    Membre habitué 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
    Points : 133
    Points
    133
    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

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par skip78
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     gchar nom[256],num[4];
        gchar *txt;
        FILE *fp;
     
        nom = NULL;
        num = NULL;
    bah de toute facon ca ne marche pas !
    'incompatibles types in assignment'
    En fait ca ne marche pas parce que j'ai deja alloué un espace memoire aux chaines ...
    Ouh la la ! Faudrait voir à réviser les tableaux !

    Un tableau statique ne peut jamais être mis à NULL puisqu'il est alloué en dur.
    De plus, mettre à NULL l'adresse d'un tableau (dynamique) ne modifie en rien son contenu.
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  5. #25
    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
    Exact, là, ce ne sont pas des pointeurs.

    Et pour le coup de la boucle for avec strlen(), pour moi, selon l'optimiseur, le comportement peut être indéterminé.

    Pour "vider" ainsi un tableau statique, il faut utiliser l'opérateur sizeof(), ou mieux, un truc comme la macro ARRAYSIZE() quand on n'est pas sûr de la taille.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Peut être déjà définie par une plate-forme, et souvent en mieux : 
    //Voir le ARRAYSIZE() de Visual quand on compile en C++
    #ifndef ARRAYSIZE 
    #define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
    #endif
    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.

  6. #26
    Membre habitué 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
    Points : 133
    Points
    133
    Par défaut
    Bon lol on s'eloigne de la question là j'ai mis des exempàles à l'arrache il est evident que sizeof ne peut pas s'employer quand la chaine est vide.

    La question est donc comment initialise tu une chaine de caractere defini comme cela :

    sans utiliser ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<25;i++)nom[i] = (int)NULL;
    A noter que ca n'à aucune incidence sur mon code c'est par simple curiosité !

  7. #27
    Membre habitué 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
    Points : 133
    Points
    133
    Par défaut
    Bon en tout cas les gens je pense que mon problème est résolu grace à la copie de mon const gchar* en gchar* parce que le premier était en statique.
    Toujours est il que si vous avez des temoignages à apporter vous êtes les bienvenus et de plus j'attends toujours une reponse pour l'init de chaine de caractere

    C'est pourquoi je ne met pas 'resolu'

    En tout cas bonnes vacances à vous tous je re dans quelques temps
    Et merci à tous ce fut rapide et precis, comme je l'aime

    A bientot, Skip

  8. #28
    Membre averti
    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
    Points : 338
    Points
    338
    Par défaut
    25 pointeurs sur gchar, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gchar* nom[25];
    for(i=0;i<25;i++) 
       nom[i] = (gchar *)NULL;

  9. #29
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Citation Envoyé par joellel
    25 pointeurs sur gchar, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gchar* nom[25];
    for(i=0;i<25;i++) 
       nom[i] = (gchar *)NULL;
    c'est joli ...
    moi j'aime bien cette forme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gchar *nom[25] = { NULL };
    pas besoin de cast il me semble.
    NULL etant defini comme un void* (enfin, j'ai pas verif la norme).
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  10. #30
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par skip78

    La question est donc comment initialise tu une chaine de caractere defini comme cela :

    Euh, ceci n'est pas une chaine de caractères, mais un tableau de pointeurs (ou de chaines de caractères pas encore allouées).

    Pour une seule chaine, ce serait plutôt:

    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  11. #31
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par skip78
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     gchar nom[256],num[4];
     
        nom = NULL;
        num = NULL;
    bah de toute facon ca ne marche pas !
    'incompatibles types in assignment'
    En fait ca ne marche pas parce que j'ai deja alloué un espace memoire aux chaines ...
    Fais gaffe c'est limite bêtisier du langage C....
    Medinoc a dit que cela pourrait être un problème d'Unicode; as-tu vérifié ?

  12. #32
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    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

  13. #33
    Membre habitué 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
    Points : 133
    Points
    133
    Par défaut
    Salut à tous
    De retour de vacances, je me retrouve toujours face au même problème de portage

    J'ai beau avoir copié mon chemin sur une chaine de caractere dynamique, rien n'y fait

    Donc bon si à tout hasard quelqu'un à un debut de reponse, il est le bienvenue

  14. #34
    Membre habitué 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
    Points : 133
    Points
    133
    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 ^^

  15. #35
    Membre habitué 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
    Points : 133
    Points
    133
    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

  16. #36
    Membre habitué 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
    Points : 133
    Points
    133
    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 ???

  17. #37
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    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++


  18. #38
    Membre habitué 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
    Points : 133
    Points
    133
    Par défaut
    Merci beaucoup gege je commencais à m'inquieter

  19. #39
    Membre habitué 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
    Points : 133
    Points
    133
    Par défaut
    Bon bah en fait pas merci lol je pensais que c'était des outils tout fait mais non

    J'ai un peu la flemme de me lancer la dedans je dois l'admettre

  20. #40
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par skip78
    Bon bah en fait pas merci lol je pensais que c'était des outils tout fait mais non

    J'ai un peu la flemme de me lancer la dedans je dois l'admettre
    Faut savoir tu veux un outils complet (par conséquent il faut passer quelques heures dessus pour le comprendre réussir à faire ce que tu veux) ou un outils maison plus simple d'utilisation mais qui te demande un peut de travail

    Pour mon code, si tu veux éviter de transformer les noms de fonction, tu peux remplacer les macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define sma_malloc /* ... */
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define malloc /* ... */
    Dans ce cas il te suffit d'inclure le fichier, mais attention, il doit être inclue en dernier (pour ne pas faire de remplacement dans stdlib.h par exemple) et tu doit ajouter des #undef au début du fichier sma.c pour utiliser les vrai fonctions.

    Mais sans un minimum d'effort, ton programme ne va pas se corriger tout seul.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 4 PremièrePremière 1234 DernièreDernière

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