Go Down

Topic: Une bidouille de variable de long->char->int fontionne t-il ? (Read 897 times) previous topic - next topic

g1_8008

Bonjour,

J'ai plusieurs question de débutant et donc pour être clair je vais éparpiller le temps de parole.
En prime j'ai toujours pas pris le plis de designer les bonnes terminologie aux .. aux heu trucs !
Il y a pas d'application réel je m'écrit quelque chose juste pour m'améliorer ...

Je tente une bidouille sur des variables et je compte bien (oui je compte) utiliser
un unsigned long pour stocker 9 chiffres que je découpe ensuite en unité de 0 à 9,
le tout dans une fonction.

J'utilise un unsigned long plutôt que des bytes puisque je reste sur des chiffres de 0 à 9
et que le "byte" prend 1octet, le "int" 2octet, "unsigned long" 4octet.
9 petits chiffres sur 9 octets, bof ! par contre 9 chiffre sur 4 octet...
Bref, pour une question de place mémoire je gagne bien 50% si je prend en compte le code qui va servir à convertir.

J'ai écrit ceci est-ce que la théorie fonctionne ?
Ou mieux, existe-il mieux ?
Les variables global: unsigned long usage_t[]={} et int ident

Code: [Select]

int traite_id()
{
// variable unsigned long usage_t[]={164233958,220000000,... etc } :
// int 2 octet, donc seulement (111 à 999)
// char 1 octet (1 à 9)
// unsigned long 4 octet (111 111 111 à 999 999 999) <- gain de place
// ident = 1 à 255, dans l'exemple ident = 4
int tt=0,id,t,result=0; unsigned char nomb[10],chiff[2];
t=sizeof(usage_t); // taille total du tableau pour connaitre la fin !
id=ident; // j'en touche une sans faire bouger l'autre
while(id<9){tt++;id-=9;}; //si id supérieur à 9, donc ajoute 1 à tt et -9 à id
if (tt<=t-1)
{
nomb=char(usage_t[tt]); // ex: d'un nombre a 9 chiffre vers une chaine de 9 caract. 164237958='164237958'
chiff=nomb.charAt(id); // ex: d'une chaine '164237958' je sors le 4ieme partant de gauche = '2'
result=int(chiff); // ex: de '2' j'obtient type 2
};
// par defaut result=0
return (result);
}





B@tto

J'ai beaucoup de mal à comprendre ton code, mais tu as l'air de te compliquer la vie pour pas grand chose ^^ en plus tu confonds pas mal de choses : un tableau de char c'est un tableau de byte, donc la tu gagnes rien ... Pour un chiffre de 0 à 10 il te faudra 5 bits (en décimal = de 0 à 15) donc un long de 4 octet pourra contenir 8 x 4 /5 = 6 nombre compris entre 0 et 10. 6 nombre contenu dans 4 byte de mémoire par rapport à 4 bytes contenu donc dans 4 bytes, le gain est très limité ... Surtout que toutes tes fonctions et tes variables vont bouffer plus de RAM que tu ne vas en gagner

g1_8008

A pardon !
Note : la variable d'origine sera un mémoire programme
...
J'ai beaucoup de mal à comprendre ton code (oui je remarque), mais tu as l'air de te compliquer la vie pour pas grand chose ^^
en plus tu confonds pas mal de choses : un tableau de char (non, de unsigned long) c'est un tableau de byte, donc la tu gagnes rien (conversion )
... Pour un chiffre de 0 à 10 (non, de 1 à 9 inclus aucune dizaine) il te faudra 5 bits (non, 4bits comme un affichage BCD)(en décimal = de 0 à 15)
donc un long de 4 octet pourra contenir 8 x 4 /5 = 6 nombre (non 9, unsigned long 4milliard et des poussières j'utilise les poussières) compris entre 0 et 10 (non non toujours 1 à 9).
6 nombre (non toujours 9 pour 999 999 999) contenu dans 4 byte de mémoire par rapport à 4 bytes contenu donc dans 4 bytes (...heuf ), le gain est très limité ...
(non enfin heu non ! car il va contenir 256 résultat 256/9=28 variable pour un total de 112 octet, pour 28x4)
Surtout que toutes tes fonctions et tes variables vont bouffer plus de RAM que tu ne vas en gagner (Temporairement dans la fonction)
...
Heu voilà donc 256x1 (byte) = 256 ok mais, 256-112=144 octet de gagner(!), est-que le code de la fonction prend 144 octets ? bonne question. Voilà une réponse qui m'intéresse .

fdufnews

#3
Feb 26, 2013, 09:52 pm Last Edit: Feb 26, 2013, 10:09 pm by fdufnews Reason: 1
Code: [Select]
nomb=char(usage_t[tt]); // ex: d'un nombre a 9 chiffre vers une chaine de 9 caract. 164237958='164237958'
usage_t est un tableau d'unsigned long le cast que tu fais là va te retourner l'octet de poids faible et non pas un chaîne de 9 caractères

Code: [Select]
chiff=nomb.charAt(id); // ex: d'une chaine '164237958' je sors le 4ieme partant de gauche = '2'
charAt est une méthode de la classe String et ne s'applique pas sur un tableau de char

Code: [Select]
result=int(chiff); // ex: de '2' j'obtient type 2
Je ne comprends pas bien le but de cette ligne. En tout cas, chiff est déclaré comme un tableau de char donc chiff est un pointeur.

Je crois que tu mélanges un peu les types de variables.

pour faire ce que tu veux je crois qu'il y a plus simple:
      - pour concaténer des chiffres de 0 à 9. il suffit de faire des multiplications par 10 et des additions.
      - pour les extraire des modulos et des divisions par 10

Code: [Select]
long concatener(char[9] donnees){
char index;
unsigned long result;
for (index=0, result=0; index<9; index++){
     result=result*10+donnees[index];
}
return(result);
}


Code: [Select]
void extract(char* donnees, unsigned long monlong){
char index;
unsigned long temp;
temp = monlong;
for (index=0; index<9; index++){
     donnees[index]=temp % 10;
     temp = temp / 10;
}
}

skywodd

Bonjour,

Si j'ai bien compris tu cherches à découper un long en plusieurs sous-variables de 4 bits (0 ~ 15) ?
À mon avis ce que tu cherches à faire c'est une "union".

Exemple de code pour pc :
Code: [Select]
#include <stdio.h>

typedef union {
  unsigned long val;
  struct {
    unsigned long
  subval0: 4,
  subval1: 4,
  subval2: 4,
  subval3: 4,
  subval4: 4,
  subval5: 4,
  subval6: 4,
  subval7: 4;
  };
} SuperLong_t;

int main(void) {

  SuperLong_t l;
 
  scanf("%lu", &(l.val));
  printf("%d %d %d %d\n", l.subval0, l.subval1, l.subval2, l.subval3);
  printf("%d %d %d %d\n", l.subval4, l.subval5, l.subval6, l.subval7);

  return 0;
}


Avec une union+struct en "champs de bits" tu peut accéder à la valeur comme un long classique ou comme une série de sous-valeurs sur 4 bits.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

g1_8008

Ha voilà qui change de mon machin mal taper. Enervant de simplicité, d'ailleurs j'en pleurerai presque.
J'ai du mal à voir comment fonctionne le modulo, j'ai essayer mais lààà alors lààà modulo 10 !
Modulo 10 l'unique usage, le seul qui va me servir, et pourtant au delà de ça le MODULO me passe au dessus comme la physique quantique.
Ma calculette de windows me prouve bien que modulo 10 va systématiquement me sortir l'unité, oui.
Hhaa moi et les maths.

Et pour la seconde solution je m'en sors encore moins bien ... mais bon.

Merci. je prend les deux.

fdufnews

Quote
J'ai du mal à voir comment fonctionne le modulo,

Le modulo c'est le reste de la division. Donc x modulo 10 c'est le reste de la division de x par 10.

Go Up