Tableau

cs_mayalen Messages postés 5 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 2 septembre 2004 - 2 sept. 2004 à 10:04
cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004 - 7 sept. 2004 à 13:12
je veux retourner un tableau dans une fonction comment faire?

???? CEvenement::ShortToByte16( short sNombre)
{
BYTE bTableanByte16[16];

for(int i=0;i<16;i++)
{
bTableanByte16[i]=(unsigned char) (sNombre%2);
sNombre=(short) (sNombre/2);
}

return bTableanByte16;
}

en faite que dois je mettre BYTE BYTE[16] NE MARCHE PAS

merci

12 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
2 sept. 2004 à 10:36
ton tableau n'existe pas dans le contexte appelant (il est "detruit" a la fin de la fonction) du coup en faisant return bTableanByte16 tu retorune une adresse invalide

passe le par reference

void CEvenement::ShortToByte16( short sNombre, BYTE (&bTableanByte16)[16])
...
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 sept. 2004 à 12:39
Tu peux également créer le tableau dans la fonction avec new ou malloc puis le retourner. L'appelant devra alors se charger de libérer la mémoire.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
2 sept. 2004 à 13:46
personnelement je trouve que ce genre de pratique ca passe en c, du moment que c'est bien fais (pas a la porté du debutant) sinon c'est trop dangereux, et si une allocation est caché par une fonction, la liberation doit l'etre egalement par une fonction au nom significatif (comme la plupart des bibliotheque)

mais pas en c++ (faut se servir de la couche objet, de l'abstraction apporté par les conteneurs...)
0
cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004
7 sept. 2004 à 00:29
Je pense qu'une des meilleures solutions est celle-là :

CEvenement::ShortToByte16(short sNombre)
{
  static BYTE bTableanByte16[16] ;

  for (int i=0;i<16;i++)
  {
    bTableanByte16= sNombre&1 ;
    sNombre >>= 1 ;
  }

  return bTableanByte16 ;
}


En effet, return renvoie un pointeur sur le 1er élt de bTableanByte16 qui est stocké dans la pile du programme, dans la meme zone que les variables globales.

Vous remarquerez au passage les optimisation minimes mais mignonnes en [i]italique.

Un dernier chipotage : le préfixe 'b' utilisé dans l'identificateur bTableanByte16 est relativement mal choisi puisqu'officiellement il désigne un type booléen.

@+ !
0

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

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
7 sept. 2004 à 11:00
kelly > sincerement ta methode n'est pas fonctionnelle, pour peu qu'on ai a l'appelée dans un traitement iteratif, il y aura autant de copie a faire

void CEvenement::ShortToByte16( short sNombre, BYTE (&bTableanByte16)[16])

pourquoi s'embeter ?

byte = octet
0
cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004
7 sept. 2004 à 12:39
djl > Au contraire !

static BYTE bTableanByte16[16] ;

indique que le tableau de 16 octets n'existera en mémoire en un et un seul exemplaire. C'est une déclaration statique au sens où les 16 octets sont réservés dès le lancement du programme. Tout appel à CEvenement::ShortToByte16(...) renverra la meme valeur pendant une meme session du programme.

Je n'ai peut etre pas compris ce que tu as voulu dire ?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
7 sept. 2004 à 12:47
for( i = ... )
{
res = o.ShortToByte16( i )
}

on perd le resultat a chaque iteration (tu es d'accord tu l'a dis le tableau est unique), faudrais faire une copie

mais avec

void CEvenement::ShortToByte16( short sNombre, BYTE (&bTableanByte16)[16])

pas besoin de faire une copie a chaque iteration, on travail directement sur le resultat, et puis c'est toujours ce design qui est employé en c/c++, renvoyer l'adresse d'un tableau static c'est un peu un passe droit vu que static a une notion de privé
0
cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004
7 sept. 2004 à 13:00
En effet, tout dépend de l'utilisation que tu souhaites faire de la fonction ShortToByte16

L'aspect privatif est plus ou moins violé, si tu considères que c'est une optimisation relativement propre puisqu'elle évite d'avoir à déclarer un tableau dans l'espace global (ce qui est moche) et que cette déclaration est faite dans la fonction intéressée...

Il y a des usages ou ma solution sera plus lourde , il est vrai :
#define MAX  50
BYTE destbuf [16*MAX*sizeof(BYTE)] ;
for ( i = 0 ; i < MAX ; i++ )
{
 BYTE* res = o.ShortToByte16( i ) ;
 memcpy (destbuf+16*sizeof(BYTE)*i , res , 16*sizeof(BYTE) ) ;
}


Et d'autres ou elle sera moins lourde et évitera des copies supplémentaires.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
7 sept. 2004 à 13:06
tu voulais ecrire

memcpy (destbuf+16*i , res , 16*sizeof(BYTE) ) ;
0
cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004
7 sept. 2004 à 13:09
oui :)

jme suis forcé à mettre un size(BYTE) inutile partout du coup j'en ai mis un de trop :)
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
7 sept. 2004 à 13:11
de toute facon c'est le genre d'erreur qui se ressent tout de suite a l'execution :D
0
cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004
7 sept. 2004 à 13:12
graaave
0
Rejoignez-nous