Copie de tableau [Résolu]

Signaler
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
-
krimog
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
-
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

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
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++;
}
}
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
31
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é ! -
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010

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
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
31
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é ! -
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010

Ok merci beaucoup !

RMI
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010

Merci Lutinore

C'est exactement ce que j'attendais.



RMI
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
31
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é ! -
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
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 ] [ ];
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
31
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é ! -