Alignement d'adresse

cs_potate Messages postés 19 Date d'inscription vendredi 18 novembre 2005 Statut Membre Dernière intervention 12 novembre 2006 - 11 nov. 2006 à 19:00
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 13 nov. 2006 à 12:39
Bonjour à tous, dans le cadre d'un projet scolaire j'ai à coder la fonction malloc.
Mon problème est le suivant : ma fonction doit renvoyer une adresse multiple de sizeof (size_t).,
pour calculer le décalage en bits à effectuer si necessaire il me faudrais donc faire le modulo entre
l'adresse de mon pointeur et sizeof (size_t) (si je me souviens de met cours de math :d).
Or je n'y arrive pas quelqu'un aurait il une methode pour connaitre se décalage à effectuer.
Merci de vos reponses.

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 nov. 2006 à 22:13
DWORD __fastcall bnAlign(DWORD addr, DWORD align)
{
  if(!addr) addr = align;
  else if(addr & (align - 1)) addr = (addr + align) & ~(align - 1);
  return addr;
}


Avec align devant être une puissance de 2 comme il se doit.

ciao...
BruNews, MVP VC++
0
cs_potate Messages postés 19 Date d'inscription vendredi 18 novembre 2005 Statut Membre Dernière intervention 12 novembre 2006
12 nov. 2006 à 17:57
Merci de ta reponse ,

est ce que c'est possible que tu commente un peu ce que tu  m'a
donne car j'ai l'impression que c'est sa mais je ne comprend pas tout.
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
12 nov. 2006 à 19:23
tu serais pas à Epita toi ? :p


BruNews -> moi ce que je ne comprends pas c'est le if(!addr) addr = align;
sinon :

addr 0x0021h, align 2^2 = 0x0004h

align -1 = 0x0003h

21h AND 3h 1h true -> on rentre dans le if car non aligné

pour aligner :

21h+4h = 25h -> non aligné, donc ... on va arranger ça

~(align-1) ~0x0003h  0hFFFC

0025 & FFFC = 0024 -> Aligné !


j'ai bon
_______________________

Omnia vincit labor improbus
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2006 à 22:38
if(!addr) addr = align;
juste pour garantir un alignement hors zéro mais il est clair que je ne mettrais pas ça dans un code, totalement inutile.

ciao...
BruNews, MVP VC++
0

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

Posez votre question
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
13 nov. 2006 à 12:39
oh, ok, tu dis que si !addr , elle est d'ores et déjà alignée ?

hum

oki ^^


PS hors sujet : comment ça, 0 msg ??? ca me parait assez incompatible
avec les 31000 pts ... Nix a codé ça avec un short int et t'a dépassé
le quota ? :D

_______________________

Omnia vincit labor improbus
0
Rejoignez-nous