est-ce que la fonction tete doit être utilisée dans un cas particulier?
salutations
fred_paris19
Messages postés1Date d'inscriptionjeudi 23 novembre 2006StatutMembreDernière intervention16 novembre 2010 16 nov. 2010 à 19:18
Ça marche nickel.
Un barcode EAN13 utilise normalement le 13e chiffre comme checksum. Les chiffres du code ont des poids différents selon leur emplacement, pair ou impair.
(cf http://www.easesoft.net/Upc-ean13.html)
On peut le calculer comme suit (attention le args[0] ne doit plus être que de 12 caractères).
int checksum = 0;
for (int i = 1; i<12 ; i+=2)
checksum += Convert.ToInt32(code[i]-48);
checksum *= 3;
for (int i = 0; i<12; i+=2)
checksum += Convert.ToInt32(code[i]-48);
checksum = (10 - checksum % 10) % 10;
code += checksum.ToString(); // on ajoute un 13e chiffre de checksum
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015 19 févr. 2010 à 10:20
Une petite remarque sur ton code :
Accumuler des chaîne dans une string est un tueur de mémoire.
Il faut utiliser à la place une structure de type StringBuilder spécialisée dans ce type d'utilisation.
En fait, quand tu fais "aa' + "bb" tu produits 3 chaînes en mémoire "aa", "bb" et le résultats "aabb". Ces chaînes coexistent jusqu'à ce que celles qui sont inutilisé soient mangées par le garbage collector.
Maintenant, si je rajoute "cc" à ma chaîne résultat, j'ai 5 chaînes en mémoire, celles déjà citées, plus "cc" plus "aabbcc", et aisi de suite. L'augmentation de l'occupation mémoire est comprise entre une fonction linéaire (j'ajoute la chaîne en une fois) et une augementation carrée (si j'ajoute caractère par caractère, les résultantes occuperont le carré du nombre de caractères ajoutés)
Avec un StringBuilder, on créé une structure d'une certaine taille en mémoire dans laquelle on copie brutalement les chaînes ajoutées. Si on dépasse la taille de la structure, on créé un bloc un peu plus loin. l'augmentation de la taille mémoire est linéaire, et légèrement supérieure à la taille de la chaîne résultante. Et surtout, il n'y a pas de redondance.
17 déc. 2015 à 07:15
est-ce que la fonction tete doit être utilisée dans un cas particulier?
salutations
16 nov. 2010 à 19:18
Un barcode EAN13 utilise normalement le 13e chiffre comme checksum. Les chiffres du code ont des poids différents selon leur emplacement, pair ou impair.
(cf http://www.easesoft.net/Upc-ean13.html)
On peut le calculer comme suit (attention le args[0] ne doit plus être que de 12 caractères).
int checksum = 0;
for (int i = 1; i<12 ; i+=2)
checksum += Convert.ToInt32(code[i]-48);
checksum *= 3;
for (int i = 0; i<12; i+=2)
checksum += Convert.ToInt32(code[i]-48);
checksum = (10 - checksum % 10) % 10;
code += checksum.ToString(); // on ajoute un 13e chiffre de checksum
19 févr. 2010 à 10:20
Accumuler des chaîne dans une string est un tueur de mémoire.
Il faut utiliser à la place une structure de type StringBuilder spécialisée dans ce type d'utilisation.
En fait, quand tu fais "aa' + "bb" tu produits 3 chaînes en mémoire "aa", "bb" et le résultats "aabb". Ces chaînes coexistent jusqu'à ce que celles qui sont inutilisé soient mangées par le garbage collector.
Maintenant, si je rajoute "cc" à ma chaîne résultat, j'ai 5 chaînes en mémoire, celles déjà citées, plus "cc" plus "aabbcc", et aisi de suite. L'augmentation de l'occupation mémoire est comprise entre une fonction linéaire (j'ajoute la chaîne en une fois) et une augementation carrée (si j'ajoute caractère par caractère, les résultantes occuperont le carré du nombre de caractères ajoutés)
Avec un StringBuilder, on créé une structure d'une certaine taille en mémoire dans laquelle on copie brutalement les chaînes ajoutées. Si on dépasse la taille de la structure, on créé un bloc un peu plus loin. l'augmentation de la taille mémoire est linéaire, et légèrement supérieure à la taille de la chaîne résultante. Et surtout, il n'y a pas de redondance.