Pb avec une memset () reprogramée, vraiment bizarre !! :-(

Résolu
Signaler
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
-
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
-
Salu tlm, en ce moment je developpe un OS donc je fai joujou avec gcc pour reprogrammer la librairie C (stdio.h + string.h + stdlib.h + math.h + conio.h)
J'ai donc fait ceci (je sais c'est imparfait, si vs avez des remarques je prend !) et en fait j'ai rajouter quelques fonctionalité : (par exemple initialiser 300 octet en memoire avec un long = à 0x10203040 va donner 102030401020304010... en memoire enfin je voudrais )

- mem_start_add est l'adresse de départ du bloc de memoire
- new_mem contient les donées (par ex 0x10203040)
- type indique le type de new_mem (1 pour char, 2 pour short, 4 pour long ...)
- n indique le nombre d'octet a initialiser

void memset (void * mem_start_add, void *new_mem, unsigned char type, int n)
{
int np = 0;


char *cptr, *mcptr; /* fodrais se debarraser de ce sac à pointeur !*/
short *sptr, *msptr;
long *lptr, *mlptr;
double *dptr, *mdptr;



switch (type) /*si on veut initialiser avec un char ou un double ou un long ...*/
{
case 1: /* case char*/
cptr = (char*)new_mem;
mcptr = (char*)mem_start_add;
for (;(np<n);np++)
{
*mcptr=*cptr;
mcptr++;
}
break;

case 2: /* case short*/
n/=2;
sptr = (short*)new_mem;
msptr = (short*)mem_start_add;
for (;(np<n);np++)
{
*msptr=*sptr;
msptr++;
}
break;
case 4:/* case long */
n/=4;
lptr = (long*)new_mem;
mlptr = (long*)mem_start_add;
for (;(np<n);np++)
{
*mlptr=*lptr;
mlptr++;
}
break;
case 8:/* case double*/
n/=8;
dptr = (double*)new_mem;
mdptr = (double*)mem_start_add;
for (;(np<n);np++)
{
*mdptr=*dptr;
mdptr++;
}
break;
}
}

mais quand je fais sa :
char buffer [300];
long lo = 0x10203040
memset (buffer,&lo,4,200);

ma memoire ne contient pas 102030401020... mais 4030201040302010... bizarre !

Merci a tous ceux qui ont lu mon post et merci a lavance de vos reponses

5 réponses

Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Je vois pas ou est ton pb. Tu viens de constater que tu es face à une machine Little Endian.

Cordialement,
Xterminhate.
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Une histoire d'Endian... non ?
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
3
Endian....endian euh www.google.fr lol voila : http://www.iro.umontreal.ca/~dift1225/memoire.html

oui apparement, c'est une histoire d'endian, arf le problème, c'est que je ne vois pas comment on resout sa...
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Commence par choisir l'Endian qui te plait le plus... pour ma part je prefere le plus petit. Question de logique ! ;-)

http://www.cs.umass.edu/~verts/cs32/endian.html
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
3
Ok, je comprend la pb mais quelle est la solution parce que la je vois pas..............