Copie de tableau [Résolu]

Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Dernière intervention
2 août 2010
- - Dernière réponse : krimog
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
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
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
3
Merci
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++;
}
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Lutinore
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
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é ! -
Commenter la réponse de krimog
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Dernière intervention
2 août 2010
0
Merci
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
Commenter la réponse de cs_RMI
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
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é ! -
Commenter la réponse de krimog
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Dernière intervention
2 août 2010
0
Merci
Ok merci beaucoup !

RMI
Commenter la réponse de cs_RMI
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Dernière intervention
2 août 2010
0
Merci
Merci Lutinore

C'est exactement ce que j'attendais.



RMI
Commenter la réponse de cs_RMI
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
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é ! -
Commenter la réponse de krimog
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
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 ] [ ];
Commenter la réponse de Lutinore
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
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é ! -
Commenter la réponse de krimog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.