Probleme bizard sur les pointeurs en C !

Probleme bizard sur les pointeurs en C ! - C - Programmation

Marsh Posté le 19-04-2004 à 15:58:18    

Bonjour,
 
j'ai un probleme bizard en C. J'execute un programme executable en C, compilé donc. Je lui passe 3 paramètres.
Si je depasse un certain nombre de caractere sur le 1 parametre, ça me genere un segfault.
Le plus bizard, c'est qu'en voulant debuguer, j'ai :
printf("TOTO \n" );
ça passe
printf("TOTO" );
segfault !
 
Voila la fonction :

Code :
  1. int obtenirParametres(int nbParametres, char * tableauParametres[])
  2. {
  3. if (nbParametres < 7)
  4. {
  5.  printf("Erreur, le nombre de paramètres doit être d'au moins de 6 \n" );
  6.  return (-1);
  7. }
  8. /* Récupération des paramètres du TraitCode128 */
  9. printf("lecture des paramètres\n" );
  10. while(--nbParametres)
  11. {
  12.  *++tableauParametres;
  13.  switch( *(*tableauParametres+1) & 0xDF)
  14.  {
  15.  case 'C':
  16.   /* Indice de la colonne: -c numéro de la colonne dans le fichier d'index */
  17.   *++tableauParametres;
  18.   printf("LA \n" );
  19.   printf("TERMINE \n" );
  20.   printf("TEST3 %s \n",*tableauParametres);
  21.   tcIndice=malloc(sizeof *tableauParametres);
  22.   printf("OUF \n" );
  23.   sprintf(tcIndice,"%s",*tableauParametres);
  24.  break;
  25.  case 'I':
  26.   /* fichier d'index en entrée : -i */
  27.   *++tableauParametres;
  28.   tcIndex_entree=malloc(sizeof *tableauParametres);
  29.   sprintf(tcIndex_entree,"%s",*tableauParametres);
  30.   printf("TEST %s \n",tcIndex_entree);
  31.  break;
  32.  case 'O':
  33.   /* fichier d'index en sortie: -o */
  34.   *++tableauParametres ;
  35.   printf("TEST1 %s \n",*tableauParametres);
  36.   tcIndex_sortie=malloc(sizeof *tableauParametres);
  37.   printf("TEST1c \n" );
  38.   sprintf(tcIndex_sortie,"%s",*tableauParametres);
  39.   printf("TEST1 \n" );
  40.  break;
  41.  default :
  42.   /* paramètre inconnu*/
  43.   printf("Le paramètre %s n'est pas connu ! \n",*tableauParametres);
  44.   return (-1);
  45.  break;
  46.  }
  47.  nbParametres--;
  48. }
  49. return 1 ;
  50. }


 
nbparametres c'est le argc et tableauParametres le argv de la fonction main.
 
Quelqu'un aurait une idée ?

Reply

Marsh Posté le 19-04-2004 à 15:58:18   

Reply

Marsh Posté le 19-04-2004 à 16:07:58    

*(*tableauParametres+1) & 0xDF)  
 
c'est quoi ça ? mettre en majuscule ? bordel ce que c'est crade. toupper() et on en parle plus
 
tcIndice=malloc(sizeof *tableauParametres);
bonjour, vous venez d'allouez 4octets ...
 
tu veux pas utiliser un i comme tout le monde, parce que là sinon, c'est crade, tu incrémentes, tu décréments, tu dereferences, etc ... tu t'y perds

Reply

Marsh Posté le 19-04-2004 à 16:12:01    

Taz a écrit :

*(*tableauParametres+1) & 0xDF)  
 
c'est quoi ça ? mettre en majuscule ? bordel ce que c'est crade. toupper() et on en parle plus
 
tcIndice=malloc(sizeof *tableauParametres);
bonjour, vous venez d'allouez 4octets ...
 
tu veux pas utiliser un i comme tout le monde, parce que là sinon, c'est crade, tu incrémentes, tu décréments, tu dereferences, etc ... tu t'y perds


En fait c'est du code que j'ai repris, du code "pro" comme ils disent.
c'est quoi le "i" comme tout le monde ?  
Sinon, vois tu le probleme ? Des que me parametre 1 fait disons moinds de 10 caracteres, ça passe. Des qu'il depasse les 20 caracteres, segfault :/

Reply

Marsh Posté le 19-04-2004 à 16:13:26    

ben for(i=0; i<nbparam; ++i) { }
 
le problème ? ben c'est le sizeof te retourn invariablement sizeof(char*)

Reply

Marsh Posté le 19-04-2004 à 16:17:37    

          tcIndice=malloc(sizeof *tableauParametres);
           printf("OUF \n" );
           sprintf(tcIndice,"%s",*tableauParametres);  
 
 
t'es sous linux sam ?
 
tcIndice = strdup(*tableauParametres);
 
fera bien mieux le boulot (strdup étant malloc + strcpy)

Reply

Marsh Posté le 19-04-2004 à 16:31:02    

samuelp a écrit :

...

Code :
  1. ...
  2. case 'C':
  3.   /* Indice de la colonne: -c numéro de la colonne dans le fichier d'index */
  4.   *++tableauParametres;
  5.   printf("LA \n" );
  6.   printf("TERMINE \n" );
  7.   printf("TEST3 %s \n",*tableauParametres);
  8.   tcIndice=malloc(sizeof *tableauParametres);
  9.   printf("OUF \n" );
  10.   sprintf(tcIndice,"%s",*tableauParametres);
  11.   break;
  12. ...



Il faut aussi vérifier que le paramètre *++tableauParametres existe réellement.

Reply

Marsh Posté le 19-04-2004 à 16:32:38    

*++tableauParametres;
 
moi pas comprendre cette instruction avant le switch

Reply

Marsh Posté le 19-04-2004 à 16:46:02    

Taz a écrit :

*++tableauParametres;
 
moi pas comprendre cette instruction avant le switch


 
je parie que c'est pour sauter le '-' dans les options...
par exemple, pour le "-C" il regarde "C"
 
t'as pas getopt ou un equivalent , là ?

Reply

Marsh Posté le 19-04-2004 à 16:46:28    

Et moi je ne comprends pas non plus pourquoi il y a :
while(--nbParametres)  
et à la fin du while nbParametres--;  
 
si nbParametres est impair c'est badaboum

Reply

Marsh Posté le 19-04-2004 à 16:48:42    

fli a écrit :

Et moi je ne comprends pas non plus pourquoi il y a :
while(--nbParametres)  
et à la fin du while nbParametres--;  
 
si nbParametres est impair c'est badaboum


 
même ordre d'idée : le nbParametres-- doit etre là pour sauter la valeur du parametre que l'on vient de trouver...
 
franchement, en ré-ecrivant la fonction tu gagnerais du temps...

Reply

Marsh Posté le 19-04-2004 à 16:48:42   

Reply

Marsh Posté le 19-04-2004 à 16:49:26    

philou_a7 a écrit :


 
je parie que c'est pour sauter le '-' dans les options...
par exemple, pour le "-C" il regarde "C"
 
t'as pas getopt ou un equivalent , là ?

sauf que ça n'est pas la bonne expression

Reply

Marsh Posté le 19-04-2004 à 16:51:00    

philou_a7 a écrit :


 
je parie que c'est pour sauter le '-' dans les options...
par exemple, pour le "-C" il regarde "C"
 
t'as pas getopt ou un equivalent , là ?


 
pour sauter le moins c'est dans le switch : *(*tableauParametres+1)

Reply

Marsh Posté le 19-04-2004 à 17:36:56    

Taz a écrit :

*++tableauParametres;
 
moi pas comprendre cette instruction avant le switch


Le nom du programme ? :D
Ben non en fait, c'est dans le switch.
Ben si c'est ça, en fait la premère fois ça saute le nom du programme et ensuite la valeur qui vient d'être prise en compte.


Message édité par darkoli le 19-04-2004 à 17:51:59
Reply

Marsh Posté le 19-04-2004 à 17:54:58    

pour le toupper, ça me fait un warning :
tableauParametres[i]=toupper(tableauParametres[i]);
 
Je sais pourquoi, mais comment dire au systeme que je m'attend à un caractere ???

Reply

Marsh Posté le 19-04-2004 à 17:57:07    

Taz a écrit :

sauf que ça n'est pas la bonne expression


 
j'avoue que j'ai pas detaillé le code, c'etait la premiere chose qui me venait a l'esprit :p

Reply

Marsh Posté le 19-04-2004 à 18:02:24    

samuelp a écrit :

pour le toupper, ça me fait un warning :
tableauParametres[i]=toupper(tableauParametres[i]);
 
Je sais pourquoi, mais comment dire au systeme que je m'attend à un caractere ???


Le paramètre de la fonction doit être un caractère et pas une chaîne.

TOUPPER(3)                                         Manuel du programmeur Linux                                        TOUPPER(3)
 
NOM
       toupper, tolower - Conversion de lettres en majuscules ou minuscules.
 
SYNOPSIS
       #include <ctype.h>
 
       int toupper (int c);
       int tolower (int c);
 
DESCRIPTION
       toupper() convertit la lettre c en majuscule si c'est possible.
 
       tolower() convertit la lettre c en minuscule si c'est possible.
 
VALEUR RENVOYÉE
       La valeur renvoyée est celle de la lettre convertie, ou bien c si la conversion n'etait pas possible.
 
       Si c n'est ni un caractère non-signé, ni EOF, le comportement de ces fonctions est imprévisible.
 
CONFORMITÉ
       ANSI C, BSD 4.3
 
BOGUES
       La  définition  de  "majuscule"  et "minuscule" dépend de la localisation.  Par exemple la localisation "C" par défaut ne
       connait rien concernant les accents, et n'effectue alors aucune conversion.
 
       Dans certaines langues, des lettres minuscules n'ont pas d'équivalent majuscule.
 
VOIR AUSSI
       isalpha(3), setlocale(3), locale(7)
 
TRADUCTION
       Christophe Blaess, 1996-2003.
 
LDP                                                      21 juillet 2003                                              TOUPPER(3)


Au pire tu peux toujours écrire :

switch (tableauParametres[i][1])
 {
  case 'c' :
  case 'C' :
   ...
   break;
  ...
 }


Mais bon si le paramètre est vide c'est problematique. :D


Message édité par darkoli le 19-04-2004 à 22:23:42
Reply

Marsh Posté le 19-04-2004 à 18:03:22    

:D

Reply

Marsh Posté le 20-04-2004 à 01:55:27    

Code :
  1. int obtenirParametres(int nbParametres, char * tableauParametres[])
  2.   {
  3.      if (nbParametres < 7)
  4.      {
  5.         printf("Erreur, le nombre de paramètres doit être d'au moins de 6 \n" );
  6.         return (-1);
  7.      }


mmm... Je lis pas plus loin


Message édité par jagstang le 20-04-2004 à 01:55:49
Reply

Marsh Posté le 20-04-2004 à 08:58:19    

JagStang a écrit :

int obtenirParametres(int nbParametres, char * tableauParametres[])
 {
  if (nbParametres < 7)
   {
    printf("Erreur, le nombre de paramètres doit être d'au moins de 6 \n" );
    return (-1);
   }
mmm... Je lis pas plus loin

Non c'est bon puisque le nom du programme n'est pas un paramètre même si c'est le premier élément de la liste.

tableauParametres[0]="$chemin$nom_du_programme"
tableauParametres[1]=$paramètre_#1
...


Message édité par darkoli le 20-04-2004 à 09:11:25
Reply

Marsh Posté le 21-04-2004 à 01:20:18    

malloc ( sizeof * xxxx )... Mais bien sur...
 
Un malloc alloue généralement non pas la taille demandée mais la taille aligné sur 8, 16 voire 32 octets...
Donc ton truc doit marcher avec 15 caractères (16 en comptant le 0 de fin) et pas 16...
 
Tu croies encore que sizeof renvoi la longueur d'une chaine ??? Retourne voir tes bases...
sizeof est une commande préprocesseur ! Cela veut dire que c'est à la compilation que la valeur est générée et pas pendant l'exécution.
 
 
Un code pro... code pourri !
Les post et pré incrémentation c'est pour faire genre je suis trop fort... Dans le genre, je fais ça aussi... a = i?(0): (-2);
Et puis on peut faire ça aussi (DWORD)(*((float *)a)[1])+23.1F)
On peut faire tout ce qu'on veut en C... même des plantages fastoches... *((dword *)(a-a)) = 0;


Message édité par christophe_d13 le 21-04-2004 à 01:20:50
Reply

Marsh Posté le 21-04-2004 à 11:44:04    

christophe_d13 a écrit :

malloc ( sizeof * xxxx )... Mais bien sur...

déjà dit

christophe_d13 a écrit :


sizeof est une commande préprocesseur ! Cela veut dire que c'est à la compilation que la valeur est générée et pas pendant l'exécution.

pas en C99

Reply

Marsh Posté le 21-04-2004 à 14:33:46    

Taz> Qu'est ce que j'en sais que c'est en C99 (je ne connaissais même pas son existance...merci Taz et Google, je mourrait moins bête). Mais il a précisé en C.
 
J'ai déjà vu tellement de programmeur faire un sizeof à la place d'un strlen que ça m'énerve toujours plus à chaque fois.
 
Désolé, sans rancune.


Message édité par christophe_d13 le 21-04-2004 à 14:34:17
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed