tableau 2D dynamique

tableau 2D dynamique - C - Programmation

Marsh Posté le 20-10-2010 à 12:46:00    

plop,
 
j'ai creer un tableau 2D dynamique mais je ne comprend pas trop son fonctionnement :
 

Code :
  1. long **Tab;
  2.      Tab = NULL;
  3.    
  4.      Tab = new long*[n]; 
  5.                                
  6.      for(i=0; i<p; i++)
  7.               {
  8.               Tab[i] = new long[p];
  9.               }


 
pourquoi je dois mettre deux etoile?
 
je veux dire, je pourrais tres bien creer un tableau de n case (donc un pointeur avec n case reservé derriere) et le remplir par la suite avec des pointeur sans le preciser au compilo non?
 
genre :

Code :
  1. long *Tab
  2.      Tab = new long[lignes];
  3.      for(i=0; i<colonnes; i++)
  4.               {
  5.               Tab[i] = new long[colonnes];
  6.               }


 
merci

Reply

Marsh Posté le 20-10-2010 à 12:46:00   

Reply

Marsh Posté le 20-10-2010 à 14:41:36    

En fait, en C, les tableaux à plus d'une dimension n'existent pas. On n'a que des tableaux à une dimension. Pour simuler une deuxième dimension, on fait un tableau vers des tableaux de une dimension.
 
Dans la déclaration, long **Tab, les deux étoiles signifient que Tab contient l'adresse d'une case mémoire qui contient une adresse qui contient un long. Si une adresse est codée sur 10 octets (10 est juste une valeur d'exemple, en fait c'est plutôt 4 ou 8), alors la déclaration dit de réserver une zone mémoire de dix octets. Mais ce n'est pas tout. Cette déclaration dit aussi au compilateur de vérifier que ce qui va être mis dans cette zone sera bien des pointeurs vers des long.
 
Dans la déclaration, long *Tab, la réservation en mémoire est la même qu'avant, c'est-à dire la réservation de 10 octets pour une adresse. Mais cette déclaration prévoit que l'on va mettre des long , et donc le compilateur émettra un avertissement ou une erreur quand on voudra affecter autre chose qu'un long dans une case de Tab.


Message édité par olivthill le 20-10-2010 à 14:44:37
Reply

Marsh Posté le 21-10-2010 à 08:25:02    

Je propose d'interdire de répondre à cette question, voire qu'on ferme systématiquement les topics portant sur les tableaux à 2D. Les neuneus qui arrivent et posent pour la 50e fois la même question sans faire la moindre recherche, ça commence à bien faire.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 25-11-2010 à 19:37:27    

Code :
  1. //allocation d'un tableau 2D de taille taille_tableau_x * taille_tableau_y
  2. long* tab = (long*)malloc( sizeof(long) * taille_tableau_x * taille_tableau_y ) );
  3. //accès aux cases du tableau :
  4. for(int y = 0; y < taille_tableau_y; y++)
  5. for(int x = 0; x < taille_tableau_x; x++)
  6.         tab[x + y*taille_tableau_y] = ma_valeur;
  7. //ne pas oublier de librer la ram après :
  8. free(tab);
  9. tab=NULL;
 

en 3D c'est pareil sauf que l'acces se fait ainsi

 
Code :
  1. tab[x + y*taille_y + z*taille_y*taille_z];
 

et de façon analogue quel que soit le nombre de dimension...

 


Message édité par Ivanovitch le 25-11-2010 à 19:39:00
Reply

Marsh Posté le 25-11-2010 à 22:39:36    

non no Non NON.
L'acces linearisé est l'acces le plus lent qui soit ... il est aussi impraticable pour l'extraction de sous région.
 
LA bonne manière de faire est la technique des NRC:
 
http://codepad.org/K2WAwRBP
 
Point.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed