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

  FORUM HardWare.fr
  Programmation
  C

  Incrémentation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Incrémentation

n°1110977
jmy1904
Posté le 07-06-2005 à 13:04:30  profilanswer
 

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
 
 

mood
Publicité
Posté le 07-06-2005 à 13:04:30  profilanswer
 

n°1111009
ritzle
Posté le 07-06-2005 à 13:37:56  profilanswer
 

programme en perl, c'est plus facile

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

n°1111036
jmy1904
Posté le 07-06-2005 à 13:54:14  profilanswer
 

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.

n°1111086
Taz
bisounours-codeur
Posté le 07-06-2005 à 14:16:05  profilanswer
 

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

n°1111775
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-06-2005 à 20:07:35  profilanswer
 

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/
n°1112207
phnatomass
Je m'empare de ton esprit !!
Posté le 08-06-2005 à 09:54:35  profilanswer
 

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.

n°1112213
ritzle
Posté le 08-06-2005 à 09:58:30  profilanswer
 

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

n°1112224
jagstang
Pa Capona ಠ_ಠ
Posté le 08-06-2005 à 10:08:26  profilanswer
 

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?  
n°1113515
fra0
Posté le 09-06-2005 à 02:56:17  profilanswer
 

Citation :

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



 
ça marche presque (en 64 bits)

n°1113527
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-06-2005 à 07:53:06  profilanswer
 

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/
mood
Publicité
Posté le 09-06-2005 à 07:53:06  profilanswer
 

n°1113542
jmy1904
Posté le 09-06-2005 à 08:35:53  profilanswer
 

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.
 

n°1113547
jagstang
Pa Capona ಠ_ಠ
Posté le 09-06-2005 à 08:44:24  profilanswer
 

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?  
n°1113561
jmy1904
Posté le 09-06-2005 à 09:02:45  profilanswer
 

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

n°1113563
jagstang
Pa Capona ಠ_ಠ
Posté le 09-06-2005 à 09:03:35  profilanswer
 

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?  
n°1114080
fra0
Posté le 09-06-2005 à 14:54:30  profilanswer
 

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.

n°1114105
Taz
bisounours-codeur
Posté le 09-06-2005 à 15:06:55  profilanswer
 

tu peux nous en dire plus ...

n°1114119
fra0
Posté le 09-06-2005 à 15:13:24  profilanswer
 

tu peux poster une focntion complète ?

n°1114123
Taz
bisounours-codeur
Posté le 09-06-2005 à 15:16:01  profilanswer
 

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

n°1114139
manatane
En vous remerciant, bonsoir
Posté le 09-06-2005 à 15:23:18  profilanswer
 

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

n°1114155
fra0
Posté le 09-06-2005 à 15:29:04  profilanswer
 

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);

n°1114166
manatane
En vous remerciant, bonsoir
Posté le 09-06-2005 à 15:33:09  profilanswer
 

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

n°1114173
fra0
Posté le 09-06-2005 à 15:34:36  profilanswer
 

au moins je la libère  :lol:

n°1114179
manatane
En vous remerciant, bonsoir
Posté le 09-06-2005 à 15:37:39  profilanswer
 

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é

n°1114205
fra0
Posté le 09-06-2005 à 15:46:52  profilanswer
 
n°1114245
manatane
En vous remerciant, bonsoir
Posté le 09-06-2005 à 16:05:07  profilanswer
 

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]

n°1114280
Taz
bisounours-codeur
Posté le 09-06-2005 à 16:18:38  profilanswer
 

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

n°1114281
Taz
bisounours-codeur
Posté le 09-06-2005 à 16:18:55  profilanswer
 

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 ?

n°1114303
manatane
En vous remerciant, bonsoir
Posté le 09-06-2005 à 16:23:54  profilanswer
 

Taz a écrit :

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


[:tang]
merci Taz

n°1114657
Taz
bisounours-codeur
Posté le 09-06-2005 à 19:01:56  profilanswer
 

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

n°1114695
fra0
Posté le 09-06-2005 à 19:30:34  profilanswer
 

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
n°1114746
manatane
En vous remerciant, bonsoir
Posté le 09-06-2005 à 20:04:48  profilanswer
 

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?

n°1114792
Taz
bisounours-codeur
Posté le 09-06-2005 à 20:32:47  profilanswer
 

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

n°1114797
Taz
bisounours-codeur
Posté le 09-06-2005 à 20:33:24  profilanswer
 

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.

n°1114829
el muchach​o
Comfortably Numb
Posté le 09-06-2005 à 20:48:52  profilanswer
 

oh comment ça taille [:ddr555]

n°1114846
manatane
En vous remerciant, bonsoir
Posté le 09-06-2005 à 20:59:11  profilanswer
 

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 ?

n°1115172
Taz
bisounours-codeur
Posté le 10-06-2005 à 00:32:35  profilanswer
 

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

n°1115294
Sve@r
Posté le 10-06-2005 à 09:36:50  profilanswer
 

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
n°1115852
jmy1904
Posté le 10-06-2005 à 15:25:16  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  Incrémentation

 

Sujets relatifs
[JSP/Javascript] Pb d'incrémentation dans une boucleincrémentation de cx
Incrémentation d'une variable datecherche un truc simple incrementation en dos
vba : incrementation automatiqueIncrémentation d'un enum en Java
Liens à incrémentationIncrementation dans un test ?
Incrémentation Datecompteur avec incrementation auto
Plus de sujets relatifs à : Incrémentation


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