Salut 👋
Enfaite je me suis bloquée dans un code.
Il s’agit de transférer les données d’un tableau à 2 dimensions L et C dans un tableau à une dimension L*C mais je sais pas comment faire. Aidez moi svp !
Version imprimable
Salut 👋
Enfaite je me suis bloquée dans un code.
Il s’agit de transférer les données d’un tableau à 2 dimensions L et C dans un tableau à une dimension L*C mais je sais pas comment faire. Aidez moi svp !
Il faut passer d'1 tableau[a][b] à 1 tableau[(a * C) + b].
Tout tableau en C est stocké en 1 seul bloc, ligne par ligne.
Bonjour,
il y a la méthode «classique» que l'on apprend telle que décrite par Foetus, mais il y a aussi la méthode que l'on utilisera plus volontiers hors cursus.
Comme un tableau en C n'a jamais qu'une dimension et que les données seront obligatoirement stockées consécutivement en mémoire, ce qu'on nomme un tableau à «deux dimensions» n'est qu'un tableau «à une dimension» dont chaque élément est lui-même un tableau à une dimension. Cela fait que que tous les éléments sont stockés consécutivement «dimension après dimension».
Passer de l'un à l'autre revient à copier une zone mémoire vers une autre, et cela peut se faire efficacement avec un [/c]memcpy[/c] si les deux zones mémoires ne se chevauchent pas. Donc un code comme (attention c'est du C moderne) :
On pourrait même s'en tirer avec des transtypages … nais ce ne serait pas une solution des plus propres.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 #include <stdio.h> #include <string.h> void flatten(size_t m, size_t n, int src[restrict m][n], int dst[restrict m*n]); void print_array_2(size_t m, size_t n, int array[m][n]); void print_array_1(size_t n, int array[n]); int main(void) { int first[3][2] = { {0,1}, {2,3}, {4,5} }; print_array_2(3, 2, first); int second[6]; flatten(3, 2, first, second); print_array_1(2*3, second); print_array_1(2*3, (int *)first); return 0; } void flatten(size_t m, size_t n, int src[restrict m][n], int dst[restrict m*n]) { memcpy(dst, src, m*n*sizeof(int)); } void print_array_1(size_t n, int array[n]) { printf("[ "); for(size_t i=0; i<n; i++) printf("%d ", array[i]); printf("]\n"); } void print_array_2(size_t m, size_t n, int array[m][n]) { printf("{ "); for(size_t i=0; i<m; i++) print_array_1(n, array[i]); printf("}\n"); }
Fœtus j’ai pas vraiment compris d’où vient le C
WhiteCrow
Enfaite suis en première année on vient presque de débuter avec le langage C du coup avec tous ces void là je m’y perds
C'est le nombre de colonnes. C'est toi qui l'écrit :mrgreen: dans un tableau à une dimension L*C
C'est logique si tu mets les lignes bout à bout : 1 élément à la ligne A, tu auras avant cet élément les (A - 1) lignes (*) contenant C/ nombre de colonnes éléments.
Mais comme les tableaux sont 0 indexés, on n'a pas besoin du "- 1" dans (*)
Je comprends maintenant merci beaucoup mais pour l’affichage j’ai du faire
I allant de C+1 à (L*C)+C pas de 1 pour que ça puisse marcher