Incrémentation

Incrémentation - C - Programmation

Marsh Posté le 07-06-2005 à 13:04:30    

Bonjour tout le monde.
 
Pourriez vous me donner l'astuce pour incrémenter une variable alphanumérique?
 
Exemple , incrémentation de la variable A qui a pour valeur BOB_0001...
 
Merci
 
 

Reply

Marsh Posté le 07-06-2005 à 13:04:30   

Reply

Marsh Posté le 07-06-2005 à 13:37:56    

programme en perl, c'est plus facile

Code :
  1. $A = "BOB_0001";
  2. $A++;

Reply

Marsh Posté le 07-06-2005 à 13:54:14    

Merci pour ta réponse Ritzle, mais en réalité j'ai pas trop le choix pour la prog/
Je taffe sur un logiciel de gestion commercial et pour imprimer les étiquettes avec les numéros de série d'article qui se suivent, je dois créer une formule m'affichant la liste de ces numéros de série.  
Rien n'étant prévu pour, je me coltine la besogne... dur dur.  
Et donc pas le choix. J'ai tenté de faire un strtonum , incrémenter et revenir en numtostr mais évidemment ça ne marche pas.  
Le fait que je ne sois pas une lumière de prog, ça n'arrange rien, mdr.
 
Merci quand même.

Reply

Marsh Posté le 07-06-2005 à 14:16:05    

snprintf(buffer, sizeof buffer, "BOO_%04d", i);

Reply

Marsh Posté le 07-06-2005 à 20:07:35    

ritzle a écrit :

programme en perl, c'est plus facile

Code :
  1. $A = "BOB_0001";
  2. $A++;



C'est intelligent comme réponse sur un forum C...
 
T'as voulu étaler ta science, tu n'as fait que te ridiculiser en public...
 
 


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

Marsh Posté le 08-06-2005 à 09:54:35    

Emmanuel Delahaye a écrit :

C'est intelligent comme réponse sur un forum C...
 
T'as voulu étaler ta science, tu n'as fait que te ridiculiser en public...


Je pense qu'il voulait faire un pointe d'humour.
D'autant plus qu'il a précisé que c'était du PERL.
Apparamment vous n'avez pas le même humour.

Reply

Marsh Posté le 08-06-2005 à 09:58:30    

Emmanuel Delahaye a écrit :

C'est intelligent comme réponse sur un forum C...
 
T'as voulu étaler ta science, tu n'as fait que te ridiculiser en public...


Ce sont les risques du métier... :D

Reply

Marsh Posté le 08-06-2005 à 10:08:26    

phnatomass a écrit :

Je pense qu'il voulait faire un pointe d'humour.
D'autant plus qu'il a précisé que c'était du PERL.
Apparamment vous n'avez pas le même humour.


 
+1


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 09-06-2005 à 02:56:17    

Citation :

Code :
  1. snprintf(buffer, sizeof buffer, "BOO_%04d", i);



 
ça marche presque (en 64 bits)

Reply

Marsh Posté le 09-06-2005 à 07:53:06    

fra0 a écrit :

Citation :

Code :
  1. snprintf(buffer, sizeof buffer, "BOO_%04d", i);



 
ça marche presque (en 64 bits)


Pourquoi presque ?
Pourquoi 'en 64 bits' ?
 


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

Marsh Posté le 09-06-2005 à 07:53:06   

Reply

Marsh Posté le 09-06-2005 à 08:35:53    

bon je vous remercie pour le coeur que vous y avait mis tous et toutes.  
Je crois que de toute façon ça n'est même pas du C ... Dur dur.
 
Enfin bref, merci quand même.
 

Reply

Marsh Posté le 09-06-2005 à 08:44:24    

jmy1904 a écrit :

bon je vous remercie pour le coeur que vous y avait mis tous et toutes.  
Je crois que de toute façon ça n'est même pas du C ... Dur dur.
 
Enfin bref, merci quand même.


 
post un bout de code (et arrête d'essayer de modifier un code pompé ci ou là)


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 09-06-2005 à 09:02:45    

exemple de code:
 
"N° Série : " + ART_SERIED + If(ART_SERIEF=ART_SERIED,"", " / " + ART_SERIEF)
 
voilà tout .
Merci

Reply

Marsh Posté le 09-06-2005 à 09:03:35    

en effet, c'est pas du C...


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 09-06-2005 à 14:54:30    

Emmanuel Delahaye a écrit :

Pourquoi presque ?
Pourquoi 'en 64 bits' ?


 
ok c'est sûr que c'est la bonne méthode,
snprintf est robuste (mais est-il portable ?),
et dans un contexte dynamique, je crains le pire
sur le sizeof buffer.... m'enfin.

Reply

Marsh Posté le 09-06-2005 à 15:06:55    

tu peux nous en dire plus ...

Reply

Marsh Posté le 09-06-2005 à 15:13:24    

tu peux poster une focntion complète ?

Reply

Marsh Posté le 09-06-2005 à 15:16:01    

non. j'ai déjà donné tout ce qui est utile. Mais explique nous donc pourquoi "dans un contexte dynamique" des fois snprintf pourrait ne pas bien fonctionner ...

Reply

Marsh Posté le 09-06-2005 à 15:23:18    

Citation :

ok c'est sûr que c'est la bonne méthode,
snprintf est robuste (mais est-il portable ?),
et dans un contexte dynamique, je crains le pire
sur le sizeof buffer.... m'enfin.


[:petrus75] c'est formidable comme reflexion çà
 
sinon pour allouer automatiquement la taille du buffer on peut utiliser un truc comme çà

Code :
  1. /**
  2. * purpose: une routine semblable à sprintf mais qui alloue l'espace nécessaire pour écrire toutes les données
  3. * include: stdio.h stdlib.h stdarg.h string.h
  4. * return: un pointeur vers la chaine formatée si OK, NULL si echec d'allocation mémoire
  5. * require: libération de l'espace mémoire alloué dans la fonction
  6. */
  7. char * dyn_sprintf( const char * format, ...){
  8.   va_list arguments;
  9.   char * ret = NULL;
  10.   int size = 64;
  11.   int nb_w;
  12.   va_start( arguments, format );
  13.   while( 1 ){
  14.     ret = realloc( ret, size );
  15.     if( ret == NULL )
  16.       break;
  17.     nb_w = vsnprintf(ret, size, format, arguments);
  18.     if( (nb_w >= 0) && (nb_w < size) )
  19.       break;
  20.     size = size + 64;
  21.   }
  22.   va_end(arguments);
  23.  
  24.   return ret;
  25. }


avec un code appelant du genre  

Code :
  1. int int1 = 42;
  2.   int int2 = 24;
  3.   char * str = NULL;
  4.   str = dyn_sprintf( "%d, %d", int1, int2);
  5.   if( str == NULL )
  6.     /* gestion erreur */

Reply

Marsh Posté le 09-06-2005 à 15:29:04    

parceque le premier argument de snprintf est un pointeur,
 

Code :
  1. int i=0;
  2. char *buffer=malloc(8);
  3. snprintf(buffer, sizeof buffer, "BOO_%04d", i);
  4. // peux-tu garantir ce qui est dans buffer maintenant ?
  5. free (buffer);

Reply

Marsh Posté le 09-06-2005 à 15:33:09    

ben si tu alloues la mémoire comme un gland forcemment...

Reply

Marsh Posté le 09-06-2005 à 15:34:36    

au moins je la libère  :lol:

Reply

Marsh Posté le 09-06-2005 à 15:37:39    

t'as bouffé un clown?

Citation :

* require: libération de l'espace mémoire alloué dans la fonction


En ne mettant l'exemple complet, je croies t'avoir surestimé

Reply

Marsh Posté le 09-06-2005 à 15:46:52    

Reply

Marsh Posté le 09-06-2005 à 16:05:07    

supaire tu l'as lu ton truc?
Alors il parle des diverses extensions qu'on peut trouver par rapport au C ANSI et comme c'est pas standard ben forcemment çà change [:petrus75].
Ensuite il dit qu'on peut avoir des problèmes sur des Unix datant de matusalem comme SunOS 4.1 qui a 15 ans soit 1 an de plus que l'ANSI C89 [:moule_bite]

Reply

Marsh Posté le 09-06-2005 à 16:18:38    

#     ret = realloc( ret, size );
#     if( ret == NULL )
#       break;
 
 
oh le massacre

Reply

Marsh Posté le 09-06-2005 à 16:18:55    

fra0 a écrit :

parceque le premier argument de snprintf est un pointeur,
 

Code :
  1. int i=0;
  2. char *buffer=malloc(8);
  3. snprintf(buffer, sizeof buffer, "BOO_%04d", i);
  4. // peux-tu garantir ce qui est dans buffer maintenant ?
  5. free (buffer);



c'est une blague ce code ?

Reply

Marsh Posté le 09-06-2005 à 16:23:54    

Taz a écrit :

#     ret = realloc( ret, size );
#     if( ret == NULL )
#       break;
 
 
oh le massacre


[:tang]
merci Taz

Reply

Marsh Posté le 09-06-2005 à 19:01:56    

non sérieusement, est-ce que tu vois le problème ?

Reply

Marsh Posté le 09-06-2005 à 19:30:34    

le problème ?
 
moi je vois que ça pédale pas mal dans la choucroute
et que size peut avoir une valeur absolue différente de son cast en size_t ...
 
et sinon les amis,
 
snprintf(buffer, 9, "BOO_%04d%c", 9999+1,0);
 
que contient buffer maintenant ?
et à quoi il devrait être égal si on était un peu consistant ?
 
/*  
    char *l=src+n;
    assert(n>1);
    while(src<l&&(!(n=abs(atol(src)))))++src;
    for(++n;n&&--l!=src-1;n/=10)*l=n%10+'0';
*/


Message édité par fra0 le 09-06-2005 à 19:58:07
Reply

Marsh Posté le 09-06-2005 à 20:04:48    

c'est à moi que tu poses la question?
si oui ben en fait je sais pas trop comment gérer une telle situation (plus de mémoire utilisable) mais dans le cas de mon bon code vite torché j'ai estimé qu'il n'était pas de l'objet de la fonction de le gérer, je me contenerais donc dans mon cas de libérer l'emplacement allouer préalablement

Code :
  1. ret = realloc( ret, size );
  2. if( ret == NULL ){
  3.   free(ret);
  4.   break; // cassos on renvoie NULL, pas de libération mémoire dans l'appelant   
  5. }


une autre solution serait peut etre de retenter un realloc moins gourmand et s'il échoue de paramètrer la terminaison avec atexit ??
Enfin bref la gestion de ce genre de situation dépend avant tout de l'appli j'imagine.
Une solution miracle serait la bienvenue :) c'est quoi selon toi le gros problème?

Reply

Marsh Posté le 09-06-2005 à 20:32:47    

fra0 a écrit :

le problème ?
 
moi je vois que ça pédale pas mal dans la choucroute
et que size peut avoir une valeur absolue différente de son cast en size_t ...
 
et sinon les amis,
 
snprintf(buffer, 9, "BOO_%04d%c", 9999+1,0);
 
que contient buffer maintenant ?
et à quoi il devrait être égal si on était un peu consistant ?


c'est pour ça qu'il faut vérifier le retour de snprintf !
et je ne vois pas de cast. c'est toi qui pédale

Reply

Marsh Posté le 09-06-2005 à 20:33:24    

manatane a écrit :


Code :
  1. ret = realloc( ret, size );
  2. if( ret == NULL ){
  3.   free(ret);
  4.   break; // cassos on renvoie NULL, pas de libération mémoire dans l'appelant   
  5. }



superbe free(NULL) et toujours la même fuite de mémoire.

Reply

Marsh Posté le 09-06-2005 à 20:48:52    

oh comment ça taille [:ddr555]

Reply

Marsh Posté le 09-06-2005 à 20:59:11    

Citation :

superbe free(NULL) et toujours la même fuite de mémoire.


désolé [:moule_bite]
-> utiliser une variable supplémentaire

Code :
  1. char * dyn_sprintf( const char * format, ...){
  2.   va_list arguments;
  3.   char * ret = NULL;
  4.   char * tmp_ret;
  5.   int size = 64;
  6.   int nb_w;
  7.   va_start( arguments, format );
  8.   while( 1 ){
  9.     tmp_ret = realloc( ret, size );
  10.     if( tmp_ret != NULL ){
  11.       ret = tmp_ret;
  12.       nb_w = vsnprintf(ret, size, format, arguments);
  13.       if( (nb_w >= 0) && (nb_w < size) )
  14. break;
  15.       size = size + 64;
  16.     }
  17.     else {
  18.       // not enought memory
  19.       free(ret);
  20.       break;
  21.     }
  22.   }
  23.   va_end(arguments);
  24.  
  25.   return ret;
  26. }


Bon ok j'espere cette fois ne pas avoir fait de connerie, mais c'est pas un peu se faire chier pour rien étant donné que si le système ne peut plus allouer de mémoire au processus ben il est un peu en mauvaise posture... Ce serait quoi ta solution pour qu'il meurre honorablement ?

Reply

Marsh Posté le 10-06-2005 à 00:32:35    

là il me semble que tu retournes soit NULL, soit un pointer déjà free'é  certaines fois.

Reply

Marsh Posté le 10-06-2005 à 09:36:50    

Encore un topic qui part en live...
Enfin, ça m'a bien fait rire et c'est l'essentiel  :bounce:


Message édité par Sve@r le 10-06-2005 à 09:38:01
Reply

Marsh Posté le 10-06-2005 à 15:25:16    

oui moi aussi, et finalement j'ai résolu mon truc par une requete SQL potable, mdr.
 
Merci pour votre acharnement

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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