Copie de tableau [Résolu]

cs_RMI 305 Messages postés vendredi 18 juillet 2003Date d'inscription 2 août 2010 Dernière intervention - 30 nov. 2009 à 11:11 - Dernière réponse : krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention
- 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 

9 réponses

Répondre au sujet
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 1 déc. 2009 à 02:16
+3
Utile
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++;
}
}
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Lutinore
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 30 nov. 2009 à 13:50
0
Utile
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
cs_RMI 305 Messages postés vendredi 18 juillet 2003Date d'inscription 2 août 2010 Dernière intervention - 30 nov. 2009 à 13:57
0
Utile
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
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 30 nov. 2009 à 14:10
0
Utile
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
cs_RMI 305 Messages postés vendredi 18 juillet 2003Date d'inscription 2 août 2010 Dernière intervention - 30 nov. 2009 à 14:36
0
Utile
Ok merci beaucoup !

RMI
Commenter la réponse de cs_RMI
cs_RMI 305 Messages postés vendredi 18 juillet 2003Date d'inscription 2 août 2010 Dernière intervention - 1 déc. 2009 à 09:11
0
Utile
Merci Lutinore

C'est exactement ce que j'attendais.



RMI
Commenter la réponse de cs_RMI
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 1 déc. 2009 à 09:41
0
Utile
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
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 1 déc. 2009 à 11:15
0
Utile
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
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 1 déc. 2009 à 11:51
0
Utile
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.