Gestion de tableau

cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 - 14 mars 2006 à 15:18
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 - 15 mars 2006 à 10:31
Bonjour,



Quel est la méthode la plus rapide pour passer par exemple d'un tableau à 1 dimension à un tableau à 2 dimensions ?



Exp: j'ai un tableau

byte[10]

et je souhaite le transformer en byte[2,5] (sans faire de boucle for)

sachant que tous les octets sont correctement alignés

Théo

10 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
14 mars 2006 à 15:25
avec une boucle while :o)


Sébastien FERRAND (
blog)
[Microsoft MVP Visual C#]
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
14 mars 2006 à 15:52
tu doit surement pouvoir le faire avec le Marshalling/Unmarshalling, mais perso je te conseil d'utiliser une boucle for

tu peux te faire une fonction generique au cas ou tu aurais plusieurs tableau a traiter, et de tailles variables, du genre :

byte[,] TransformArray(byte[] array, int xx, int yy)
{
byte[,] result = new byte[xx, yy];
int k = 0;
for (int x = 0; x < xx; x++)
{
for (int y = 0; y < yy; y++)
{
result[x, y] = array[k++];
}
}
}
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
14 mars 2006 à 15:53
// oups...
return (result);

// evidement ^^
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
15 mars 2006 à 08:01
Je vois que Sebmafate est en forme ...



En fait je gère des tableaux assez importants qui me sont retournés
sous forme unidimensionnelle et je souhaitais gagner du temps.



Bon tant pis, merci quand même.

Théo
0

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

Posez votre question
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
15 mars 2006 à 08:45
je suis dans ma période "clown"...

en fait, si tu avais été en C, le problème ne serait pas posé, car tu as accés directement à la mémoire, tu pourrais donc directement utilser ton tableau à partir de son pointeur.

mais en C#, l'accés à la mémoire est unsafe.
C'est pour cela, que la seule solution qui me vient à l'esprit est d'utiliser une boucle... à moins de faire du code unsafe.


Sébastien FERRAND (
blog)
[Microsoft MVP Visual C#]
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
15 mars 2006 à 08:50
Je me doutais qu'il y avait bien une solution. Je sais faire faire du
unsafe car j'ai déjà eu à bidouiller des images, mais je nes ais pas
faire des copies de blocs. Pourrais-tu être plus explicite STP?

Théo
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
15 mars 2006 à 09:06
si C# fonctionne comme C, tu dois pouvoir avoir l'équivalent suivant :

byte[,] ==> byte*

donc tu dois pouvoir écrire une boucle (tu ne peux pas faire autrement) comme ceci :

byte[,] b;
byte[] b2;

fixed (byte* b1 = b) {
for (int i=0; iSébastien FERRAND (
blog)
[Microsoft MVP Visual C#]
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
15 mars 2006 à 09:12
Dans ce cas, le parcours du tableau sera plus rapide, mais la copie par bloc l'aurait été encore plus.



Merci de tes conseils.

Théo
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
15 mars 2006 à 10:26
Salut, La copie par bloc ? Y'a la classe Buffer mais je sais pas si elle est vraiment rapide et si elle accepte les tableaux à plusieurs dimensions, faut tester.. mais y'aura pas plus rapide que la copie bit à bit avec les pointeurs, à la rigueur avec un pointeur int* pour limiter les passages dans la boucle. Pour un max de performance faudrait fixer les deux tableaux, et utiliser une variable plutôt que la propriété Length, le gain sera visible uniquement sur les grand tableaux.

byte[ ] t1 = new byte[ ] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
byte[ , ] t2 = new byte[ 2, 5 ];


unsafe
{ fixed ( byte* pSrc t1, pDst t2 )
{
int len = t1.Length; // les tableaux doivent avoir la même taille !


for ( int i = 0; i < len; i++ )
{
pDst[ i ] = pSrc[ i ];
}
}
}
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
15 mars 2006 à 10:31
Merci à tous les 2 de vos interventions, je vais essyer de mettre celà en place.

Théo
0
Rejoignez-nous