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

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
Rejoignez-nous