CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Tableaux à 2 dimension (C++)

K-Tastrophe
K-Tastrophe
Niveau 10
27 novembre 2013 à 11:13:07

Bonjour,
J'aimerais savoir comment fait on un tableau à 2 dimensions. Enfaite, je veux pouvoir "representer" une matrice carrée avec un tableau à double entré. Je suis allez voir sur internet mais je comprend pas comment ils font :-(
J'avais pensez faire un vector de vector mais apparemment ca marche pas ;(

Merci :)

myhideout
myhideout
Niveau 7
27 novembre 2013 à 13:18:12

int tableau[5][5];

:hap:

ska1
ska1
Niveau 8
27 novembre 2013 à 18:51:39

et pour l'initialiser:
int tableau[5][5] = {
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
};

Pseudo supprimé
Pseudo supprimé 27 novembre 2013 à 21:52:13

Pour les matrices vaut mieux utiliser un tableau uni dimensionnel.

int tab[5*5]; //Matrice de 5 lignes, 5 colonnes

Et pour accéder, par exemple l'élément en ligne 2, colonne 4 :
tab[5*2+4] = 10;
il faut multiplier la ligne voulu par le nombre d'éléments sur une ligne.

dezq
dezq
Niveau 7
27 novembre 2013 à 21:53:58

Exia93 > Pourquoi ?

Pseudo supprimé
Pseudo supprimé 27 novembre 2013 à 21:57:07

Les performances.

dezq
dezq
Niveau 7
27 novembre 2013 à 22:03:08

Ah ok.
Mais je doute que ça change grand chose non ...

Perso moi j'utilise toujours des multi, c'est plus "clair" et explicite je trouve.

Pseudo supprimé
Pseudo supprimé 27 novembre 2013 à 22:09:48

Un exemple, une matrice avec des tailles inconnu n * m.

La gestion de tous les malloc et delete est laborieuse, de plus les accès au tableau de tableau sont beaucoup plus long et coûteux.

lokilok
lokilok
Niveau 17
27 novembre 2013 à 22:15:56

Beaucoup plus long nan, selon ta façon ça fait tab+sizeof(tab)*(5*2+4) pour avoir sinon c'est tab+sizeof(tab)*2+sizeof(tab)*4.

Enfin je pense que c'est comme ça, c'est comme ça que je le vois en tout cas, du coup pour accéder a un élément les deux seraient égaux.

Enfin j'en sais rien donc je veux pas trop m'avancer mais voila.

lokilok
lokilok
Niveau 17
27 novembre 2013 à 22:18:23

Abawi bah non je me suis trompé je crois.

dezq
dezq
Niveau 7
27 novembre 2013 à 22:24:24

exia93 > je ne fais pas encore d'allocation dynamique mais tu as surement pas tort :(

mais bon sur des petits projets ça doit pas changer grand chose à mon avis.

lokilok
lokilok
Niveau 17
27 novembre 2013 à 22:43:56

Awi c'est plutôt tab+sizeof(tab)*2+sizeof(tab+sizeof(tab)*2)*4 je crois, donc oui ça consomme plus.

Mais franchement c'est inutile je pense dans ce cas la.

lokilok
lokilok
Niveau 17
27 novembre 2013 à 22:50:05

Enfait finalement je crois que je dis complètement de la merde je m'embrouille donc vaut mieux oublier ce que j'ai dis.

godrik
godrik
Niveau 30
28 novembre 2013 à 04:19:00

exia, il n'y a pas de difference de performance entre les deux notation que tu donnes. Parceque quand tu ecris le premier, le compilateur execute le second. Je pense que tu confonds avec les tableaux dynamique multidimensionel.

Quand aux problemes d'allocation desallocation que tu as, c'est ta punition pour ne pas utiliser RAII. :)

papy386
papy386
Niveau 10
05 décembre 2013 à 00:17:36

Bonjour

Je pense aussi que int tab0[5*5] est mieux que int tab1[5][5];

tab0 revient a un pointeur sur une mémoire de 25 entier (linéaire en général).

tab1 lui est un tableau de 5 pointeurs sur 25 entier, et rien de garantie que les 5 sont a la suite vous pouvez avoir le tab1[0] au début et le tab1[1] a 1 mega de "distance".

D'ou les performances moindres.

Pseudo supprimé
Pseudo supprimé 05 décembre 2013 à 10:33:26

le standard c++ dit que les éléments d'un tableau doivent être contigus
en mémoire. quand tu déclares:

    int foo [x][y][z];

le type de foo est [un tableau de x [tableau de y [tableau de z [int]]]] :mort:
pour y voir plus claire, c'est comme si tu avais fait "implicitement"

    typedef int A[z]; // le type A est un tableau de z elements de type int contigus
    typedef B A[y]; // le type B est un tableau de y elements de type A contigus
    typedef C B[x]; // le type C est un tableau de x elements de type B contigus
    C foo;

le type A est un tableau de int, pas de *int. en mémoire, A est {int1, int2, ..., intz}
et non {*int1, *int2, ..., *intz}. c'est la même chose pour les types B et C.
B est {A1, A2, ..., Ay}, pas {*A1, *A2, ..., *Ay} donc par extension B est

{{int1, int2, ..., intz}, {int1, int2, ..., intz}, ...} et ainsi de suite.
même si tu fait int foo[10][10][10][10][10], tout est contigu.

pour faire ce dont tu parles: déclarer un tableau de x pointeurs vers un tableau
de y int, il faut utilise la syntaxe suivante:

    int (*a[x]) [y];

petite question :hap: sachant qu'un pointeur équivaut a 4 bytes, quel est le
sizeof de a, de b, et de c ?

    int (*a[10]) [10];
    int (*b[10][10]) [10];
    int (*(*c[10])[10]) [10];

Pseudo supprimé
Pseudo supprimé 26 janvier 2014 à 15:21:42

Bonjour, je dois creer un tableau a deux dimensions, mais pour contenir des caracteres char...

Je teste donc ce code :
char tableau[8][8] ={{"Hello"},{"Bonjour"}};
Mais mon compilateur bug sur cette ligne, si vous pouviez m'aider :svp: , sachant que :

char tableau[8][8] ={{'H','e','l','l','o'},{'B','o','n','j','o','u','
r'}};

Compile sans probleme, le resultat est le meme, mais c'est beaucoup plus long ainsi...

[denshaotoko]
[denshaotoko]
Niveau 25
26 janvier 2014 à 16:38:42

petite question :hap: sachant qu'un pointeur équivaut a 4 bytes, quel est le
sizeof de a, de b, et de c ?

int (*a[10]) [10];
int (*b[10][10]) [10];
int (*(*c[10])[10]) [10];

:d)
Pour sizeof(a), je dirais :

sizeof(int*)*10 donc 4*10 = 40 bytes

Pour sizeof(b) :

sizeof(int*)*10*10 donc 4*10*10 = 400 bytes

Pour sizeof(c) :

Euh, je vois pas celui là par contre :hap:
c serait un tableau de 10 pointeurs d'entier mais après pour la suite j'ai du mal à voir concrétement avec l'étoile avant le (*c[10])

godrik
godrik
Niveau 30
26 janvier 2014 à 17:46:59

A priori 10 pointeurs. Mais la vraie bonne reponse est: le programmeur qui a pondu une merde pareil doit etre pendu.

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment