Forum Clubic

Problème tableaux 2d langage c

Bonjour à tous,

Je voudrais créer un tableau 2D de façon dynamique mais d’un type que j’ai créer (le type en question étant une structure).
Est-ce qu’on fait :

damier=(int**)malloc(hauteursizeof(int));
for(i=0;i<hauteur;i++)
{
damier[i]=(type*)malloc(hauteur*sizeof(type));
}

ou

damier=(type**)malloc(hauteursizeof(type));
for(i=0;i<hauteur;i++)
{
damier[i]=(type*)malloc(hauteur*sizeof(type));
}

Et quel est alors le type du tableau?

Merci pour votre aide.

Salut,

Il faut prendre ta 2ème proposition, tu vas créer un tableau de pointeurs de type.

Le 1er n’est pas logique, tu créerais un tableau de pointeurs de d’entier et tu y alloues des type.

Merci de ta réponse.

Donc le tableau est de type “type”

Encore une question : si on envoie ce tableau en argument à une fonction quelle est la syntaxe exacte pour modifier une valeur d’un élément d’une case ?

par exemple est-ce que tableau [ i ] [ y ] . element = valeur ; est correct ?

et est-ce que on peut faire des test sur ces valeurs (par exemple dans un if) et est-ce que la syntaxe est la même ?

Merci
Edité le 23/03/2008 à 16:08

Oui, si par exemple “element” est un entier tu peux y accéder en lecture ou écriture avec cette syntaxe.

Tiens et si je postais une peu sur ce forum aussi :ane:

Les tableaux 2D en C se font en effet avec un malloc puis une boucle de mallocs sur le tableau 1D de pointeurs.
Mais mais mais si il a une chose à savoir :
malloc te donne un bloc de mémoire continu donc les caches de nos proc actuels se régalent et donc c´est bcp bcp plus rapide de parcourir tout un tableau 2D “dans les sens des blocs alloués”.
Prends un tableau 1000 par 1000 rempli de 1 et somme le en bouclant sur i puis sur j et refais le en bouclqnt sur j puis sur i…tu vas vori la différence (c’est énorme).

Bref, il faut toujours construire son tableau en pensant au sens de parcours le plus courant dans la suite du code.
Encore mieux, si tu trouves que c’est lourd de construire un tableau NM avec tous ces mallocs ben fais un tableau 1D à NM en mettant toutes les lignes (ou les colonnes) bout à bout. L’accès à l’élément (i,j) se fait alors par T[i+M*j]. La encore le choix de l’ordre des indices à une influence énormes sur les perfs :slight_smile:

C’est exacte surtout en traitement image !

Et quand on veut tous les éléments, on fait une seule boucle de 0 à M*N-1 :slight_smile:
Bref, c´est à se demander à quoi servent les tableaux ND N>1 C ?
Est ce que A[i][j] est plus rapide que A[i+M*j] ? J’en doute si on utilise un bon compilo.

“Est ce que A[i][j] est plus rapide que A[i+M*j] ? J’en doute si on utilise un bon compilo.”

Ce n’est peut-etre pas plus rapide, mais avec un “bon compilo” ca ne devrait pas etre plus lent non plus.