Probleme de backspace avec fprintf.

Probleme de backspace avec fprintf. - C - Programmation

Marsh Posté le 11-11-2004 à 00:36:13    

Voilà, j'aimerais faire en sorte que mon prog c, une fois compilé puisse
"réagir" si il est lancé avec des parametres :
 
Exemple :
 
mon.exe (lancé tout seul) => "Aucun parametre !"
 
mon.exe -a (donc 1 parametre) => "Le parametre est a"
 
Une aide serai la bienvenue :)


Message édité par Chronoklazm le 11-11-2004 à 18:18:16
Reply

Marsh Posté le 11-11-2004 à 00:36:13   

Reply

Marsh Posté le 11-11-2004 à 00:38:01    

Code :
  1. int main(int argc, char **argv)
  2. {
  3. if (argc == 1)
  4.    printf("pas assez de param\n" );
  5. }


Reply

Marsh Posté le 11-11-2004 à 00:43:40    

Oui ! Mais si je veux savoir si le perametre donnée correspond bien a un
parametre que j'ai prevu (ou pas) je fait comment ?


Message édité par Chronoklazm le 11-11-2004 à 00:52:28
Reply

Marsh Posté le 11-11-2004 à 01:24:15    

tu utilises argv (liste des paramètres de longueur argv) ou tu utilise un truc comme getopt ou libpopt si tu as ça de disponible

Reply

Marsh Posté le 11-11-2004 à 01:25:00    

Tu te débrouilles avec argv qui contient les valeur des arguments et argc qui contient le nombre des arguments. Attention la valeur contenu dans argv[ 0 ] est le nom du programme donc si argc == 1 => aucun parametre n'a été fourni, comme dans l'exemple précédent.
Sinon tu as les options simples posix genre -a (1 tiret 1 caractère alphanumérique simple) celà te permet d'indiquer une liste d'option à reconnaitre et de les traiter simplement par un switch.
Sinon tu as les options longues GNU dans getopt.h

Reply

Marsh Posté le 11-11-2004 à 01:28:21    

Code :
  1. int main(int argc, char **argv)
  2. {
  3. int i;
  4. for (i = 1; i < argc; i++)
  5.      if (!(verif(argv[i])))
  6.            printf("Catastrophe !!\n" )
  7. return 0;
  8. }


 
Edit : pourquoi quand je veux dire qqchose, y'a 10 personnes qui le disent avant moi ?


Message édité par fafounet le 11-11-2004 à 01:29:56
Reply

Marsh Posté le 11-11-2004 à 01:38:47    

paske on est les meilleurs http://smileyonline.free.fr/images/gif/inclassable/vignette12/thumbnails/SNORKEL_GIF.gif

Reply

Marsh Posté le 11-11-2004 à 13:25:59    

y a une librairie qui gere ca tte seule (libarg ou qqc comme ca)

Reply

Marsh Posté le 11-11-2004 à 14:12:47    

BIG merci messieurs :)

Reply

Marsh Posté le 11-11-2004 à 14:19:02    

Bon, comme j'ai pas envie de polluer le topic de C avec un nouveau sujet,
je vais continuer ici.
 
J'ai un problem d'allocation memoire avec malloc :
 

Code :
  1. void demande_dim(){
  2. int width, height, taille;
  3. unsigned char c, *carray;
  4. printf("Bienvenue dans BIMTAP !\n\nDonnez les dimensions du tableau sous la forme WIDTHxHEIGHT <Entree>:\n\n===>" );
  5. scanf("%dx%d", &width, &height);
  6. taille=((width/8)+1)*height;
  7. printf("\nVous avez donnez les dimensions : (%dx%d)\n\nLa longueur du tableau sera donc de %d elements\n\n",width,height,taille);
  8. if((carray = (unsigned char)malloc(taille * sizeof(unsigned char))) == NULL){
  9.  printf("Allocation demandee impossible !" );
  10. }
  11. else{
  12.  for(c=0;c<60;c++){
  13.   carray[c]=0;
  14.  }
  15. }
  16. }


 
Pour l'instant elle ne renvoi rien ma fonction, le souci n'est pas là.
 
Et le compilo me dit que il faut que j'utilise un "cast" explicite  :heink:  
 
Sous MSVC++ 6 j'ai le message suivant :
 
============================================================================================================
../Projet.cpp(190) : error C2440: '=' : cannot convert from 'unsigned char' to 'unsigned char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
 
Projet.obj - 1 error(s), 0 warning(s)
============================================================================================================


Message édité par Chronoklazm le 11-11-2004 à 14:20:53
Reply

Marsh Posté le 11-11-2004 à 14:19:02   

Reply

Marsh Posté le 11-11-2004 à 14:20:39    

Code :
  1. carray = (unsigned char)malloc


 
cherche donc l'erreur tout seul [:petrus75]

Reply

Marsh Posté le 11-11-2004 à 14:20:48    

le cast devant ton malloc en sert à rien

Reply

Marsh Posté le 11-11-2004 à 14:22:13    

oui ok, mais ca beug quand meme.

Reply

Marsh Posté le 11-11-2004 à 14:23:01    

Il me dit ca :
 
190) : error C2440: '=' : cannot convert from 'void *' to 'unsigned char *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast

Reply

Marsh Posté le 11-11-2004 à 14:23:34    

bin y'a tout qui est un peu foutraque
 

Code :
  1. if((carray = (unsigned char)malloc(taille * sizeof(unsigned char))) == NULL){
  2.          printf("Allocation demandee impossible !" );
  3.    
  4.      }
  5.    
  6.      else{
  7.          for(c=0;c<60;c++){
  8.              carray[c]=0;
  9.          }
  10.      }


 
ton cast sert a rien, mais si tu tiens vraiment a faire un cast alors cast en "unsigned char *" et pas "unsigned char"
 
ensuite, pourquoi 60 ?

Reply

Marsh Posté le 11-11-2004 à 14:25:04    

pardon c'est taille qu'il faut a la place de 60, sorry

Reply

Marsh Posté le 11-11-2004 à 14:27:01    

et oui suis je bete puisque malloc renvoi un pointeur ... desole.

Reply

Marsh Posté le 11-11-2004 à 14:29:13    

#    if((carray = (unsigned char)malloc(taille * sizeof(unsigned char))) == NULL){
#
#         printf("Allocation demandee impossible !" );
#      
#     }
#      
#     else{
#         for(c=0;c<60;c++){
#             carray[c]=0;
#         }
#     }
 
 
 
on comment prendre une page pour écrire
carray = calloc(taille, 1);

Reply

Marsh Posté le 11-11-2004 à 17:53:24    

Merci Taz
 
Bon maintenant j'ai un autre mini-souci :cry:  
 
J'ai donc ma fonction suivante :
 

Code :
  1. void sauvegarde(unsigned char tab[], int taille, int width, int height){
  2.   /*Creation du fichier de sauvegarde*/
  3.   fopen("37x12.txt", "w" );
  4.   /*Ecriture dans le fichier de sauvegarde*/
  5.   int i;
  6.   FILE *fp ; /* Variable du flot */
  7.   char filename [ ] = "37x12.txt" ; /* Nom du fichier */
  8.   fp = fopen(filename , "a+" );
  9.   /*On ecrit dans le fichier ce qu'il faut*/
  10.   fprintf(fp, "#define exemple37x12_width 37\n#define exemple37x12_height 12\nstatic unsigned char image_bits1[] = {" );
  11.   for(i=0;i<taille;i++){ /* on parcour le tableau pour afficher le contenu */
  12.    
  13.   if((i%12) == 0){ /*On va a la ligne car on ecrite que 12 valeurs par ligne*/
  14.      
  15.    fprintf(fp,"\n" ); /* On passe à la ligne */
  16.    fprintf(fp,"   " ); /* On laisse 3 espaces */
  17.   }
  18.    
  19. else if((int)tab[i] <= 8)/*On ecrit sur 8 bits*/
  20.  fprintf(fp,"0x0%x, ",tab[i]);
  21.    
  22. else 
  23.  fprintf(fp,"0x%x, ",tab[i]);
  24.    
  25.   }
  26.   fprintf(fp,"\b};" );
  27. }


 
Comme vous l'aurez compris c'est pour mettre le tableau dans un fichier.
Bon quand j'ouvre ce fichier avec notepad ou wordpad j'obtient :
 
#define exemple37x12_width 37
#define exemple37x12_height 12
static unsigned char image_bits1[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x84,  
   0xc4, 0x03, 0x44, 0x84, 0x60, 0x26, 0x04, 0x44, 0x84, 0xa0, 0x25,  
   0x7c, 0x48, 0x20, 0xe4, 0x07, 0x84, 0x48, 0x20, 0x24, 0x04, 0x84,  
   0x20, 0x24, 0x04, 0x84, 0x30, 0x20, 0x24, 0x04, 0x7c, 0x30, 0x20,  
   0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
 
Alors qu'il me faudrait la derniere ligne :
   .........................................................., 0x00};
 
Le probleme c'est que j'ai ce putain de "carré" à la fin, j'ai beau mettre
la sequence d'echappement \b il n'y a rien a faire, pourtant il parait
que fprintf et printf ont exactement les meme seq d'echappements.
 
:fou: :pt1cable: :fou:


Message édité par Chronoklazm le 11-11-2004 à 17:56:17
Reply

Marsh Posté le 11-11-2004 à 19:14:30    

Pourquoi tu crees pas un nouveau sujet plutot que d'allonger ?

Reply

Marsh Posté le 11-11-2004 à 19:20:57    

c'est quoi c'est \b ?
 
quand tu fous \n tu t'attend bien à un \n ?
ben pareil pour \b

Reply

Marsh Posté le 11-11-2004 à 21:06:05    

fafounet ===> oué je sais cété dans le but de pas poluer le topic C avec des Chronoklazm partout :) mais maintenant j'arrete c'est promis :)
 
Taz ========> et bein NON ya rien a faire \n il capte et \b que dalle, c'est ptet ce foutu MSVC++ qui pige rien ou ptet meme moi :(

Reply

Marsh Posté le 11-11-2004 à 21:14:18    

Hmm faudrait peut etre avoir un minimum de competences avant de dire du mal de MSVC++...  
 
C'est quoi pour toi, le caractere \b ?


Message édité par Ace17 le 11-11-2004 à 21:14:25
Reply

Marsh Posté le 11-11-2004 à 21:17:37    

Bon ca va je plaisentais.
backspace
Pourquoi cette question ? :heink:


Message édité par Chronoklazm le 11-11-2004 à 21:20:00
Reply

Marsh Posté le 11-11-2004 à 21:24:56    

c'est quoi backspace ?

Reply

Marsh Posté le 11-11-2004 à 21:27:38    

C'est \b  :D  
 
Bein c'est le retour d'un caractère en arrière, non ?


Message édité par Chronoklazm le 11-11-2004 à 21:28:10
Reply

Marsh Posté le 11-11-2004 à 21:28:19    

Le carre a la fin de ton fichier, c'est justement le caractere backspace.

Reply

Marsh Posté le 11-11-2004 à 21:29:19    

Chronoklazm a écrit :

C'est \b  :D  
 
Bein c'est le retour d'un caractère en arrière, non ?


Et non  :D  
C'est vrai dans une console, mais dans un fichier... ca n'est rien de plus qu'un malheureux octet qui a pour valeur ASCII 08...

Reply

Marsh Posté le 11-11-2004 à 21:29:50    

je crois que y en a qui ont du mal à comprendre le concept de caractère et le rôle de fprintf ...

Reply

Marsh Posté le 11-11-2004 à 21:29:57    

et sous winnt ca fait blue screen [:god]

Reply

Marsh Posté le 11-11-2004 à 21:32:50    

Mais pourtant fprintf et printf emploient les mêmes formatages ??!!  
fprintf() envoie une sortie formatée vers un fichier.
C'est quoi ce delire ? \n marche et \b marche pas   :??:


Message édité par Chronoklazm le 11-11-2004 à 21:35:34
Reply

Marsh Posté le 11-11-2004 à 21:36:00    

Code :
  1. FILE* f = fopen("test.txt", "w" );
  2. fprintf(f, "\b\b\b\b" );
  3. fclose(f);


 
Ouvre test.txt avec un editeur hexa, et tu verras ca :  
08 08 08 08
 
Ouvre test.txt avec un editeur de texte, et tu verras quatre carres.
 
Tu peux refaire la meme experience en remplacant \b par \n.


Message édité par Ace17 le 11-11-2004 à 21:37:11
Reply

Marsh Posté le 11-11-2004 à 21:40:22    

c'est bon a savoir ca, t'as une idée de comment je pourrais faire ? A part intercepter le cas ou j'ecris le dernier caractere ?

Reply

Marsh Posté le 11-11-2004 à 21:41:21    

ne pas l'ecrire

Reply

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

Chronoklazm a écrit :

c'est bon a savoir ca, t'as une idée de comment je pourrais faire ? A part intercepter le cas ou j'ecris le dernier caractere ?


Mais c'est justement ca qu'il faut faire!  :hello:


Message édité par Ace17 le 11-11-2004 à 21:48:00
Reply

Marsh Posté le 11-11-2004 à 22:03:11    

En gros tu veux virer la dernière virgule dans la déclaration de tableau que tu génères ?
Eh bien elle est tout à fait autorisée dans la syntaxe du C, justement pour faciliter ce type de génération...

Reply

Marsh Posté le 11-11-2004 à 22:47:20    

Ho, du coup j'ai pas a reecire ma boucle for, j'aime le C, merci blurk ! :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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