Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3324 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

une erreur en C que je n'arrive pas à résoudre !

n°1468861
bb charlie
Posté le 01-11-2006 à 21:30:12  profilanswer
 

Reprise du message précédent :
:sweat:  
ouais, c'est quand même un peu fou que l'on puisse apprendre le B.A BA alors qu'on code régulièrement en C (même si c'est pas du tout mon boulot), pourquoi permettre un pointeur sans initialisation si c'est aussi dangeureux...?
Bon, ceci dit, maintenant, j'ai un autre problème qui n'a rien à voir, mais ma fonction lecture_param ne me renvoie plus les bonnes valeurs, "smtp" contient la même valeur que "destinataire" (je régresse ! ça marchait très bien ça !), encore un résultat farfelu ça...je vais corriger ça fissa, j'ai du faire des erreurs dans les malloc  ;)

Message cité 1 fois
Message édité par bb charlie le 01-11-2006 à 21:33:11
mood
Publicité
Posté le 01-11-2006 à 21:30:12  profilanswer
 

n°1468862
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 21:35:17  profilanswer
 

bb charlie a écrit :

Alors là, je dois vous avouer que pensais que ça ne changerai rien...c'était même pas des tableaux, non, des petits pointeurs sur des char perdus dans le code,


Utiliser des variables non initialisées invoque un comportement indéfini.
 
Un comportement indéfini est un des pires bugs qui soit. En effet, le comportement étant imprévisible, il peut arriver n'importe quoi, y compris un comportement visible normal.  
 
Il est donc impossible de le détecter de façon certaine à l'exécution. Aucun test unitaire ne peut en venir à bout à 100%.
 
C'est, je le répète, la pire peste du programmeur quel que soit le langage. Mais le C en compte de centaines tapis dans l'ombre qui n'attendent que le moment propice pour sauter à la gorge du pauvre programmeur...
 
Pour éviter ça, il faut très bien connaitre le langage pour les repérer au premier coup d'oeil, et appliquer certaines regles de bonne conduite comme toujours donner une valeur valide (ou NULL) à un pointeur. C'est particulièrement vrai dans les structures contenant des pointeurs...
 
Comme je dis souvent, mais qui est en général mal compris :
 
"Le C n'est pas un langage de débutant"
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1468863
bb charlie
Posté le 01-11-2006 à 21:40:29  profilanswer
 

mais justement, ne m'as-tu pas dit dans un précédent message que donner une valeur NULL a un pointeur n'était pas une solution puisque si on le passe en paramètre d'une fonction ce sera une adresse non valide ?
 
edit: problème arrangé, j'avais mal initialisé un pointeur sur char...

Message cité 1 fois
Message édité par bb charlie le 01-11-2006 à 21:51:50
n°1468866
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 21:40:58  profilanswer
 

bb charlie a écrit :

ouais, c'est quand même un peu fou que l'on puisse apprendre le B.A BA alors qu'on code régulièrement en C (même si c'est pas du tout mon boulot), pourquoi permettre un pointeur sans initialisation si c'est aussi dangeureux...?


Bienvenu dans le monde merveilleux du C. Tu as lu ma devise :  
 
"C is a sharp tool"
 
En voilà une autre :  
 
http://mapage.noos.fr/emdel/images/c_warn.png
 
Je crois que je vais bientôt en faire des T-shirts...

Citation :


Bon, ceci dit, maintenant, j'ai un autre problème qui n'a rien à voir, mais ma fonction lecture_param ne me renvoie plus les bonnes valeurs, "smtp" contient la même valeur que "destinataire" (je régresse ! ça marchait très bien ça !), encore un résultat farfelu ça...je vais corriger ça fissa, j'ai du faire des erreurs dans les malloc  ;)


malloc() n'est pas la panacée. J'ai indiqué 3 méthodes d'initialisation des pointeurs. Autre solution utiliser un tableau...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1468869
bb charlie
Posté le 01-11-2006 à 21:48:23  profilanswer
 

Décidemment, j'ai du mal à te suivre  :sweat:  
Autre solution, utiliser un tableau pour éviter malloc ? Mais justement, j'utilise justement malloc pour initialiser mes tableaux (le tableau de struct tm par ex) comme mes pointeurs...je sais bien qu'un tableau est un pointeur pointant vers l'adresse du premier élément, mais ça m'aide pas à saisir là...

Message cité 1 fois
Message édité par bb charlie le 01-11-2006 à 21:49:02
n°1468871
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 21:49:48  profilanswer
 

bb charlie a écrit :

mais justement, ne m'as-tu pas dit dans un précédent message que donner une valeur NULL a un pointeur n'était pas une solution puisque si on le passe en paramètre d'une fonction ce sera une adresse non valide ?


Dans mon code, il y aurait eu un  

Code :
  1. {
  2.    if (param != NULL)
  3.    {
  4.       /* ah, enfin, on va pouvoir bosser... */
  5.    }
  6.    else
  7.    {
  8.       puts ("laisses tomber ton joint et mets toi au boulot !" );
  9.    }
  10. }


Ca calme...
 
Ca permet d'avoir un comportement défini, même si ce n'est pas celui qu'on attend. Encore une fois, l'ennemi absolu du programmeur, le Diable, le Démon, la Peste, c'est le comportement indéfini. Ca rentre ou il faut que j'aille chercher le gros marteau ?
 
http://www.artofmarkbryan.com/images/bryan_man_sledgehammer_500.jpg


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1468875
bb charlie
Posté le 01-11-2006 à 21:53:38  profilanswer
 

décidemment, nos réponses sont en oppositions de phase ! Je poste ce message sans autre question en cas que tu répondes à mon précédent message et que le petit manège continue...
Pour le marteau, merci pour la proposition, mais je vais essayer de rentrer ça autrement  :D


Message édité par bb charlie le 01-11-2006 à 21:55:07
n°1468878
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 21:59:11  profilanswer
 

bb charlie a écrit :

Mais justement, j'utilise justement malloc pour initialiser mes tableaux


Ca, c'est une énormité.
 
Avant tout, il faut créer le tableau. Pour ça il y a 2 méthodes (on va faire simple, OK?)
 
Le tableau statique qui existe sous 4 formes :  

Code :
  1. /* global public (deconseille) */
  2. type G_tab[TAILLE];
  3. /* global prive (deconseille) */
  4. static type g_tab[TAILLE];
  5. /* persistant de portee locale (deconseille) */
  6. ...
  7. {
  8.    static type s_tab[TAILLE];
  9.    ...
  10. }
  11. /* local (conseille si pas trop gros) */
  12. ...
  13. {
  14.    type tab[TAILLE];
  15.    ...
  16. }


Le tableau dynamique crée par malloc (ou calloc ou realoc)

Code :
  1. ...
  2. {
  3.    type *p = malloc (sizeof *p * TAILLE);
  4.    if (p != NULL)
  5.    {
  6.       ...
  7.       free (p), p = NULL;
  8.    }
  9. }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1468881
bb charlie
Posté le 01-11-2006 à 22:02:42  profilanswer
 

Ah, ben justement, avant je faisait la dernière version du statique, et pour résoudre mon problème je suis passez à la version dynamique. Si j'ai bien compris, ça n'a servi à rien, la version statique numero 4 est parfaitement correcte et le problème ne venait pas des tableaux...?
 
edit: pourtant, si, quand je repasse en déclaration statique, le programme plante comme avant, donc c'est bien de là que venait le problème !  
Dans le main, si j'initialise comme ça:

Code :
  1. struct tm tm_tab[MAX];


ça plante ! Si je fais:

Code :
  1. struct tm *tm_tab;
  2. tm_tab=malloc(MAX * sizeof(struct tm));


ça marche ! Je dois encore mal saisir un truc là ??

Message cité 1 fois
Message édité par bb charlie le 01-11-2006 à 22:09:05
n°1468886
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 22:12:11  profilanswer
 

bb charlie a écrit :

edit: pourtant, si, quand je repasse en déclaration statique, le programme plante comme avant, donc c'est bien de là que venait le problème !  
Dans le main, si j'initialise comme ça:

Code :
  1. struct tm tm_tab[MAX];


ça plante ! Si je fais:

Code :
  1. struct tm *tm_tab;
  2. tm_tab=malloc(MAX * sizeof(struct tm));


ça marche ! Je dois encore mal saisir un truc là ??


Ca dépend de la valeur de MAX. Les gros tableaux en local, ça plante, c'est normal. Je l'avais déjà signalé...

Citation :

Code :
  1. /* local (conseille si pas trop gros) */
  2. ...
  3. {
  4.   type tab[TAILLE];
  5.   ...
  6. }



Message édité par Emmanuel Delahaye le 01-11-2006 à 22:17:03

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 01-11-2006 à 22:12:11  profilanswer
 

n°1468887
bb charlie
Posté le 01-11-2006 à 22:14:43  profilanswer
 

MAX vaut 500, c'est pas non plus monstrueux. Puis dans tous les cas, que ce soit avec la première méthode ou la seconde, y'a MAX qui intervient dans l'allocation de la mémoire, donc si c'était trop gros, les deux planteraient non ?

n°1468888
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 22:22:30  profilanswer
 

bb charlie a écrit :

MAX vaut 500, c'est pas non plus monstrueux


C'est gros.

Code :
  1. #include <stdio.h>
  2. #include <time.h>
  3. int main (void)
  4. {
  5.    struct tm tm_tab[500];
  6.    printf ("sizeof tm_tab = %lu\n", (unsigned long) sizeof tm_tab);
  7.    return 0;
  8. }


sizeof tm_tab = 18000
 
Press ENTER to continue.


quand même, c'est pas rien..

Citation :


Puis dans tous les cas, que ce soit avec la première méthode ou la seconde, y'a MAX qui intervient dans l'allocation de la mémoire, donc si c'était trop gros, les deux planteraient non ?


Ben non. Dans le cas du tableau statique , les 500 * sizeof (struct tm) bytes sont pris dans le mémoire automatique qui est une ressource restreinte et incontrôlable, d'où le risque de plantage (on est pas prévenu).
 
Dans le deuxième cas, un pointeur occupe quelques bytes (2, 4...) dans la mémoire auto et le bloc alloué est pris dans la mémoire dynamique qui peut être énorme. En cas d'erreur, malloc() retourne NULL.  
 
"Everything is under control."


Message édité par Emmanuel Delahaye le 01-11-2006 à 22:27:53

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1468890
bb charlie
Posté le 01-11-2006 à 22:26:52  profilanswer
 

Hum, c'est effectivement plus subtil que ce que je pensais.
Cependant, je me souviens avoir testé avec MAX petit (genre 2), et ça plantait quand même, ce n'est pas un problème de mémoire. Ca m'intrigue ce plantage sauvage lorsque les tableaux sont définis en statique et qui disparait dès qu'on le fait en dynamique...

n°1468893
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 22:29:25  profilanswer
 

bb charlie a écrit :

Hum, c'est effectivement plus subtil que ce que je pensais.
Cependant, je me souviens avoir testé avec MAX petit (genre 2), et ça plantait quand même, ce n'est pas un problème de mémoire. Ca m'intrigue ce plantage sauvage lorsque les tableaux sont définis en statique et qui disparait dès qu'on le fait en dynamique...


Il y avait peut être autre chose. J'ai pas dit 'ça plante', j'ai dit 'c'est gros'. Nuance...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1468895
bb charlie
Posté le 01-11-2006 à 22:32:26  profilanswer
 

je sais bien  ;) . Mais moi, je le dis: lorsque je remplace  

Code :
  1. struct tm *tm_encheres;
  2. tm_tab=malloc(MAX * sizeof(struct tm));


au tout début du main par:

Code :
  1. struct tm tm_tab[MAX];


boum, ça fait un crash sauvage lors de l'exécution de "lecture_params" qui pourtant n'a rien à voir avec tm_tab !! Si ça c'est pas incompréhensible...en tout cas ça me titille sévère, parceque ça veut dire que je pourrais etre confronté à ce problème sans savoir ce qu'il se passe...

Message cité 1 fois
Message édité par bb charlie le 01-11-2006 à 22:33:35
n°1468903
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 22:42:58  profilanswer
 

bb charlie a écrit :

boum, ça fait un crash sauvage lors de l'exécution de "lecture_params" qui pourtant n'a rien à voir avec tm_tab !! Si ça c'est pas incompréhensible...en tout cas ça me titille sévère, parceque ça veut dire que je pourrais etre confronté à ce problème sans savoir ce qu'il se passe...


J'insiste : ça ne veut pas dire que la cause réelle n'est pas ailleurs...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1468904
bb charlie
Posté le 01-11-2006 à 22:45:29  profilanswer
 

de toute façon, cela vient sans doute d'ailleurs, on a jamais vu une déclaration statique raisonnable planter comme ça, c'est vraiment n'importe quoi...ça doit etre truffé de bugs, va falloir que je me colle à un debugage intensif...

n°1469247
Sve@r
Posté le 02-11-2006 à 13:50:36  profilanswer
 

Bon, je suis arrivé après la bataille. Tout ce qui peut être dit l'a été
 

bb charlie a écrit :

de toute façon, cela vient sans doute d'ailleurs, on a jamais vu une déclaration statique raisonnable planter comme ça, c'est vraiment n'importe quoi...ça doit etre truffé de bugs, va falloir que je me colle à un debugage intensif...


Ou alors, s'il n'est pas trop gros, poste ton code dans son intégralité qu'on puisse poser un doigt vainqueur sur la ligne 123 en disant "c'est "...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1469278
bb charlie
Posté le 02-11-2006 à 14:31:43  profilanswer
 

ben il est quand même pas petit, il doit bien faire 500 lignes (bien sûr y'a plus gros, mais bon je vais pas caser 500 lignes dans un post quand même). Puis j'ai bien peur de me faire traiter de tout pas les puristes du C (ils se reconnaitront  :D ) qui trouveront 1000 choses à redire à mon code (dont la source du plantage !) et me sommeront d'arrêter de coder, de prendre un bouquin avant de jouer au programmeur, et moultes choses désagréables...
 
Je vais essayer de me débrouiller et si je trouve des indications plus précises sur le plantage, je vous en ferais part  ;)

n°1470338
Sve@r
Posté le 03-11-2006 à 18:41:11  profilanswer
 

bb charlie a écrit :

ben il est quand même pas petit, il doit bien faire 500 lignes (bien sûr y'a plus gros, mais bon je vais pas caser 500 lignes dans un post quand même).


Oui, ce n'est pas évident.
Quand j'ai un gros problème, j'essaye de refaire un programme similaire mais plus petit et de n'y laisser que les lignes liées au problème...
 

bb charlie a écrit :

Puis j'ai bien peur de me faire traiter de tout pas les puristes du C (ils se reconnaitront  :D ) qui trouveront 1000 choses à redire à mon code (dont la source du plantage !) et me sommeront d'arrêter de coder, de prendre un bouquin avant de jouer au programmeur, et moultes choses désagréables...


Oui, moi aussi parfois je ressens ça et j'hésite souvent à donner du code sur le forum. Et pourtant je ne me considère pas comme un débutant...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1470403
bb charlie
Posté le 03-11-2006 à 21:15:18  profilanswer
 

Sve@r a écrit :

Oui, ce n'est pas évident.
Quand j'ai un gros problème, j'essaye de refaire un programme similaire mais plus petit et de n'y laisser que les lignes liées au problème...

ben tout le problème est là: je ne peux pas préjuger de d'ou viens le problème justement, c'est tellement irréaliste comme comportement que ça peut venir de n'importe quoi, et je serais contraint de poster tout le code...
En tout cas merci pour tout, si je mets le doigt dessus de manière un peu plus préçise, je ferais appel à vos lumières à tous !

 


n°1470459
matafan
Posté le 04-11-2006 à 03:31:49  profilanswer
 

C'est peut-etre le bon moment pour apprendre a utiliser un debugger.

n°1470517
bb charlie
Posté le 04-11-2006 à 12:45:45  profilanswer
 

ah, ça, je dois bien avouer que c'est quelque chose qui m'est totalement étranger...

n°1470569
Je@nb
Kindly give dime
Posté le 04-11-2006 à 15:26:14  profilanswer
 

Ton problème qui apparait en statique et pas en dynamique vient peut être que si on suit ce que tu as marqué au début, tu réassignes au pointeur une nouvelle valeur (qui est pourtant la même que celle du départ). Ca ca marche en statique mais pas en dynamique et on t'a conseillé de mettre void en type de retour à ta fonction et de la lancer sans mettre truc=fonction(...)

n°1470574
bb charlie
Posté le 04-11-2006 à 15:38:24  profilanswer
 

En fait, c'est l'inverse, ça marche en dynamique et pas en statique. Le code tout au début du post n'est plus valable, je suis effectivement passé en void pour tout ce qui est saisie, cf quelques posts plus bas...

n°1470586
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-11-2006 à 16:11:02  profilanswer
 

bb charlie a écrit :

En fait, c'est l'inverse, ça marche en dynamique et pas en statique. Le code tout au début du post n'est plus valable, je suis effectivement passé en void pour tout ce qui est saisie, cf quelques posts plus bas...


Montre  la dernière version de ton code qui ne fonctionne pas et décrit clairement les conditions d'essais qui montrent le problème.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Erreur odbc postgres : "The # of binded parameters < the # of pa ..."erreur pg_restore: large_object
Pascal : erreur de débutante..Erreur php de noobs...
erreur de syntaxe ???[mysql] pourquoi excel n'arrive pas a se connecter a mysql?
erreur lorqu'on veut s'enregistrer sur mon forum[ACCESS] Gestion erreur doublon VBA
erreur move_uploaded_fileErreur SQL/ASP
Plus de sujets relatifs à : une erreur en C que je n'arrive pas à résoudre !


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)