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

  FORUM HardWare.fr
  Programmation
  C

  Probleme bizard sur les pointeurs en C !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme bizard sur les pointeurs en C !

n°702944
samuelp
Posté le 19-04-2004 à 15:58:18  profilanswer
 

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 ?

mood
Publicité
Posté le 19-04-2004 à 15:58:18  profilanswer
 

n°702957
Taz
bisounours-codeur
Posté le 19-04-2004 à 16:07:58  profilanswer
 

*(*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

n°702968
samuelp
Posté le 19-04-2004 à 16:12:01  profilanswer
 

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 :/

n°702973
Taz
bisounours-codeur
Posté le 19-04-2004 à 16:13:26  profilanswer
 

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

n°702985
Taz
bisounours-codeur
Posté le 19-04-2004 à 16:17:37  profilanswer
 

          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)

n°702997
darkoli
Le Petit Dinosaure Bleu
Posté le 19-04-2004 à 16:31:02  profilanswer
 

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.

n°702998
Taz
bisounours-codeur
Posté le 19-04-2004 à 16:32:38  profilanswer
 

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

n°703013
philou_a7
\_o&lt; coin ! &gt;o_/
Posté le 19-04-2004 à 16:46:02  profilanswer
 

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à ?

n°703014
fli
Posté le 19-04-2004 à 16:46:28  profilanswer
 

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

n°703015
philou_a7
\_o&lt; coin ! &gt;o_/
Posté le 19-04-2004 à 16:48:42  profilanswer
 

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...

mood
Publicité
Posté le 19-04-2004 à 16:48:42  profilanswer
 

n°703017
Taz
bisounours-codeur
Posté le 19-04-2004 à 16:49:26  profilanswer
 

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

n°703021
fli
Posté le 19-04-2004 à 16:51:00  profilanswer
 

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)

n°703082
darkoli
Le Petit Dinosaure Bleu
Posté le 19-04-2004 à 17:36:56  profilanswer
 

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
n°703104
samuelp
Posté le 19-04-2004 à 17:54:58  profilanswer
 

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 ???

n°703107
philou_a7
\_o&lt; coin ! &gt;o_/
Posté le 19-04-2004 à 17:57:07  profilanswer
 

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

n°703112
darkoli
Le Petit Dinosaure Bleu
Posté le 19-04-2004 à 18:02:24  profilanswer
 

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
n°703113
Taz
bisounours-codeur
Posté le 19-04-2004 à 18:03:22  profilanswer
 

:D

n°703370
jagstang
Pa Capona ಠ_ಠ
Posté le 20-04-2004 à 01:55:27  profilanswer
 

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
n°703421
darkoli
Le Petit Dinosaure Bleu
Posté le 20-04-2004 à 08:58:19  profilanswer
 

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
n°704496
christophe​_d13
L'efficacité à tout prix.
Posté le 21-04-2004 à 01:20:18  profilanswer
 

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
n°704788
Taz
bisounours-codeur
Posté le 21-04-2004 à 11:44:04  profilanswer
 

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

n°705002
christophe​_d13
L'efficacité à tout prix.
Posté le 21-04-2004 à 14:33:46  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Probleme bizard sur les pointeurs en C !

 

Sujets relatifs
Probleme avec les dieses ![C++] Compilateur C++ .NET 2003 / SDL > Problème à la compilation
[CSS] Probleme d'affichage de taille de police sur IE5Problème de calcul de dates
Problème ACCESS et RecorsourceTableau de pointeurs sur fonctons.
[eclipse] probleme de visualisation de page JSPProblème de page
Probleme de transfert de chaîne de caractere vers BDD.HELP!!!![WEB FLASH ] Probléme plubication site flash
Plus de sujets relatifs à : Probleme bizard sur les pointeurs en C !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR