Copie de tableau

Résolu
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 - 30 nov. 2009 à 11:11
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 1 déc. 2009 à 11:51
Bonjour à tous,

J'ai un tableau unidimensionnel que je souhaite transformé en tableau bidimensionnel.
exp pour un tableau tab1 de 144 éléments je peux déclarer un autre tableau tab2 de 12x12 et faire
for (int i=0;i<12;i++)
for (int i=0;i<12;i++)
tab2[i,j]=tab1[i*12 +j]

N'y a t'il pas une autre façon de faire pour une copie plus rapide avec du code unsafe par exemple

Merci d'avance.

RMI

9 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 déc. 2009 à 02:16
Salut, comme en C les tableaux sont stockés en bloc continus.

// SafeCopy
int[ , ] tab2 = new int[ 12, 12 ];
Buffer.BlockCopy( tab1, 0, tab2, 0, sizeof( int ) * 144 );

// UnsafeCopy
fixed ( int* p = tab2 )
{
int i = 0;
while ( i < 144 )
{
p[ i ] = tab1[ i ];
i++;
}
}
3
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
30 nov. 2009 à 13:50
Salut

J'ignore si la méthode memcpy existe en C# unsafe, mais si c'est le cas, tu peux essayer un truc du genre :
for(int i = 0; i < 12; i++)
{
    memcpy(tab2[i, 0], tab1[i * 12], 12 * sizeof(TonType))
}


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
30 nov. 2009 à 13:57
Merci pour ta réponse, mais c'est justement ce que je cherche à savoir, c'est s'il existe un moyen rapide de remplir le tableau sans faire de boucle.
memcpy = Array.Copy en C#


RMI
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
30 nov. 2009 à 14:10
La méthode dont j'ai parlé évite une boucle, mais l'autre est indispensable je crois. J'avoue ne pas connaître le fonctionnement en mémoire des tableaux à 2 dimensions en C#, mais si c'est la même chose qu'en C avec cependant une écriture simplifiée, il n'y a pas moyen de faire ça sans boucle.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
0

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

Posez votre question
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
30 nov. 2009 à 14:36
Ok merci beaucoup !

RMI
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
1 déc. 2009 à 09:11
Merci Lutinore

C'est exactement ce que j'attendais.



RMI
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
1 déc. 2009 à 09:41
Salut, comme en C les tableaux sont stockés en bloc continus.

Euh, en C, les tableaux à une dimension, oui, pas les tableaux multidimensionnels, qui sont des tableaux de pointeurs vers d'autres tableaux.

Mais bon, je ne savais pas si la gestion en mémoire des tableaux multidimensionnels en C# était identique à celle en C. Apparemment non.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 déc. 2009 à 11:15
Krimog > C et C# ont bien la même disposition mémoire pour les tableaux à plusieurs dimensions :

http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html

En C# les tableaux de tableaux sont des "jagged array" :

int[ , ] multiArray = new int[ 2, 2 ];
int[ ][ ] jaggedArray = new int[ 4 ] [ ];
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
1 déc. 2009 à 11:51
J'avoue être étonné par ton lien, Lutinore.

De mon côté, j'ai toujours utilisé un tableau de tableau du genre :
int i;
int** tab = (int**)malloc(x * sizeof(int*));

for(i=0 ; i<x ; i++)
{
    tab[i] = (int*)malloc(y * sizeof(int));
}
Et là ce sera éparpillé dans ta mémoire.

Mais quand il parle de la façon de base de créer un "regular sequential array", dans l'exemple donné, que vaut ttt[0] ou ttt[1] ?


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
0
Rejoignez-nous