Utilisation des masques

Fermé
maniqk - 29 juil. 2013 à 15:25
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 30 juil. 2013 à 21:44
Bonjour,

Je dispose de données 128 bits dont je souhaite extraire 4 "mots" de 32 bits.
J'ai une fonction (issue d'une librairie) qui fait ça mais intégré à un programme, il semblerait que ce soit pas optimal. Du coup je voulais utiliser un masque.
J'ai probablement des erreurs de syntaxe, donc si quelqu'un peut m'éclairer c'est cool ^_^

Ce que je fais :
__x128_t a; // Crée une variable a de 128 bits
__x128_t b;
a = 0x[etc]; 
b = a & 0x11111111111111111111111111111111[0] // Le [0] représente 96 fois le chiffre 0


Avec ceci, j'ai les erreurs suivantes qui s'affichent :
"Integer constant is too large" et "expression must have integral type"

Que fais-je de mal ? ^^

Merci d'avance,
maniqk

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 juil. 2013 à 16:55
Bonjour,

Ben, le compilateur t'indique ce qui ne lui plait pas (trop grand).
Utilise plutôt : b=a>>32;
C'est plus simple :-).

Cdlt,
0
Bonjour fiddy et merci pour ta réponse.

Ok pour les 32 premiers bits, mais comment ça marche pour les autres "mots" ?

Puis en fait, quand je déclare a = 0x1111111 etc, il me dit que c'est too large, mais bon je peux rien y faire mon nombre est comme ça ! Pis je comprends pas trop vu que c'est pas (forcément) un int...

Et le b=a>>32 me redonne quand même "expression must have integral type"
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 juil. 2013 à 17:38
D'ailleurs, attention tu mélanges le binaire et l'hexa...
b = a & 0x11111111111111111111111111111111[0] // Le [0] représente 96 fois le chiffre 0
Un caractère en hexa se code sur 4 bits. Donc, mets plutôt : b=a & 0xFFFFFFFF[0]; [0] = 24 fois le chiffre 0.

Donc attention à ta définition de a.

Ok pour les 32 premiers bits, mais comment ça marche pour les autres "mots" ?
Bah, faut jongler un peu. Pour récupérer :
les 32 bits de gauche b=a>>96 & 0xffffffff; /*le &0xff... est inutile ici, mais cela permet de voir le début d'une boucle ;-)*/
les 32 bits suivants : b=a>>64 & 0xffffffff;
etc...
0
Et bonjour !

Merci pour vos réponses, mais en fait ça marche pas (il me redonne les mêmes erreurs)... Je me demande si c'est par rapport au logiciel que j'utilise ou pas du tout mais bon.

Je profite du fait que vous soyez tous les deux dans la discussion (parce que vous avez l'air de participer très activement à ce forum ^^) pour demander autre chose.

En fait, l'objectif final de mon programme c'est d'inverser une matrice carrée de taille quelconque. J'ai programmé cette inversion, et maintenant j'aimerais que cette inversion soit passée en fonction.

Je ne sais pas si c'est clair... Actuellement je génère une matrice avec des nombres aléatoires dedans, puis je faisais mon traitement.
A partir de maintenant la matrice en entrée est donnée, ou générée via un autre programme. Et je voudrais faire en sorte que l'inverse de cette matrice soit effectuée via l'appel à une fonction du genre inverse(matrice,...);

Le problème, c'est que pour calculer mon inverse, j'utilise des sous-matrices. Et celles-ci sont déclarées en global dans mon programme, par soucis de mémoire disponible.
J'avais testé, en déclarant mes sous-matrices dans le main() ou dans une autre fonction, le traitement ne se fait plus à partir d'une certaine taille de matrice (parce que justement je n'avais pas assez de place en mémoire pour stocker mes sous-matrices).
En les déclarant en global, le compilateur (je crois) permettait de réserver suffisamment d'espace en mémoire pour les stocker.

Du coup, vu que ce n'est plus moi qui génère ma matrice, je ne connais pas la taille de la matrice à inverser. Avant je faisais des #define dim_matrice 10 par exemple, maintenant je ne connais pas cette valeur. Et donc, mes déclarations en global de mes sous-matrices ne passent plus vu que les tailles des sous-matrices sont inconnues.

Je me demandais en fait si je pouvais créer une fonction qui fait mon traitement tout en gardant mes variables globales. Je ne peux mettre mes déclarations dans ma fonction puisque sinon, à partir d'une certaine taille ça ne fonctionnera plus...

Voilou je crois que j'ai tout dit ^^

Merci d'avance,
maniqk

P.S : Si y faut, je peux aussi recréer une autre discussion mais là c'était juste que vous avez tous les deux répondu donc vous avez probablement reçu un mail pour ce post ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
juliencolin54 Messages postés 217 Date d'inscription dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
Modifié par juliencolin54 le 30/07/2013 à 20:41
Ce serait que tu postes ton code, pour que l'on visualise mieux tes problèmes.

Aussi :
1 - Cela m'étonnerait que tu sois obligé d'utiliser des globales (à éviter), il doit avoir moyen d'arranger cela
2 - Ton programme peut quand même marcher avec des variables globales, pour cela tu dois gérer dynamiquement leurs tailles

Je te conseille de commencer par changer tes matrices statiques en dynamiques, comme dans cet exemple:
// Statique
int tab[2][2];
// Dynamique
int tab**;
tab = malloc(2 * sizeof(int *));
tab[0] = malloc(2 * sizeof(int))
tab[1] = malloc(2 * sizeof(int));


Software is like sex, it's better when it's free - Linus Torvald
0
juliencolin54 Messages postés 217 Date d'inscription dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
29 juil. 2013 à 18:02
Bonjour,

Pour automatiser cela dans une boucle et ne pas faire un décalage de 96 puis 64 puis ...
Tu peux t'inspirer de cela :

int main(void)
{
	int nb = 0xDEADDEAD;
	int i;
	
	for (i = 0; i < sizeof(nb); i++, nb>>=8)
		printf("%x\n", nb & 0xFF);	
	return (0);
}


Ce que tu veux faire (en gros), c'est ce code mais à plus grand échelle. (x4)

Cdlt.
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
30 juil. 2013 à 21:44
Alors tout d'abord qu'appelles-tu inversion de matrice ? Un élément M tel que M'*M = I (matrice identité) ?
Il nous faudrait ton code. Et idéalement, ouvre un autre post :-).

Sinon, il faut éviter les variables globales (à cause de la zone bss/data). Si la taille de ta matrice est trop grande, passe par un pointeur pointant sur une zone allouée du heap (malloc/calloc).

Si tu connais pas la taille de la matrice, ça va être problématique... La fonction te retournant la matrice doit impérativement te retourner la taille.
Aucun moyen de deviner la taille d'un pointeur (sauf convention particulière, se termine par un 0, etc.). Mais ça c'est à toi de nous dire.

Cdlt,
-1