Salut,
Je voudrais savoir comment declarer un tableau dynamique dont les cases se suivent en memoire.
en faisant: int *a = malloc(10*sizeof(int));
que ce soit pareil que: int a[10];
en mémoire.
Merci à tous.
Salut,
Je voudrais savoir comment declarer un tableau dynamique dont les cases se suivent en memoire.
en faisant: int *a = malloc(10*sizeof(int));
que ce soit pareil que: int a[10];
en mémoire.
Merci à tous.
Salut,
tu viens toi-même de répondre à ta question![]()
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Le tableau créé par l'allocation dynamique est conforme, c'est à dire que ses éléments sont consécutifs en mémoire (heureusement, sinon, à quoi servirait malloc()...). C'est garanti par la norme qui définit le langage C.
Une fois créé, l'usage est strictement identique à celui d'un tableau de taille fixe.
Attention, le tableau ainsi crée n'est ni initialisé, ni contrôlé en taille. Tout débordement entraine un comportement indéterminé.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Désolé, je pensais résoudre mon problème, mais je me suis planté apparemment;
j'ai refait un programme pour tester la continuité en mémoire, ça marche pour l'allocation d'un tableau à une dimension, mais pour 2 dimensions il ne marche plus vraiment; dans mon cas: dans le tableau int cases[8][8], les cases[0][7] et cases[1][0] ne sont pas continue en mémoire. comment faire pour qu'ils soient continue ?
Voilà mon programme:
Merci beaucoup pour l'aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 int largeur = 8, hauteur = 8; int **cases; int **cases_couleur; void init_cases_taille() { int i; cases = malloc(largeur * sizeof(int)); cases_couleur = malloc(largeur * sizeof(int)); for(i=0; i<hauteur; i++) { cases[i] = malloc(hauteur * sizeof(int)); cases_couleur[i] = malloc(hauteur * sizeof(int)); } } int main() { init_cases_taille(); int i, j; for(i = 0; i<8; i++) { for(j = 0; j<8; j++) { printf("&cases[%d][%d] = %d\n", i, j, &cases[i][j]); } printf("\n"); } }
tu peux faire un malloc de taille * largeur * hauteur
Et pour acceder à la case [i][j] il faut faire tableau[ j * largeur + i ]
Pour l'allocation d'un tableau à deux dimensions contigu qui puisse être utilisé avec la syntaxe tab[x][y], voir ce code, qui fait une allocation par dimension:
http://www.developpez.net/forums/sho...70&postcount=7
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
C'est normal (j'ai replacé ton code en haut pour qu'on le revoit mieux)
A chaque tour de boucles for() (tu t'es d'ailleurs trompé de valeur dans le for), tu réserves "n" cases entières. Mais chaque allocation est, du point de vue µc, différente de la précédente et de la suivante. C'est comme si t'avais
Chaque allocation te donnera 5 int continus mais les groupes ne seront pas forcément l'un à la suite de l'autre. Le host te donne la mémoire là où il peut la prendre (et il cherche aussi à optimiser pour éviter de créer un gruyère).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int *a=malloc(5 * sizeof (int)); int *b=malloc(5 * sizeof (int)); int *c=malloc(5 * sizeof (int));
Donc comme les autres l'ont dit, si tu veux "n" int de façon continue, te faut allouer ces "n" int avec un seul malloc puis calculer la position (x,y) en fonction de i et de la largeur du plateau théorique.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Je ne voie pas bien comment la mémoire n'aurait pas pu être contigüe même avant.
Ou alors cela veut dire que malloc aurait pu retourner plusieurs pointeurs sur les différentes zones allouées et que la somme des zones allouées aurait fait la taille demandée. En tant que développeur, je n'aurais pas aimé écrire la fonction malloc() alors![]()
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
- main retourne un int
- les mallocs peuvent échouer donc toujours tester leurs retours
- les premières allocations doivent allouer des tableaux de pointeurs vers int :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 cases = malloc(largeur * sizeof(int*)); cases_couleur = malloc(largeur * sizeof(int*));- tu te mélange un peu les pinceaux avec ces variables largeur hauteur...si je suis ton raisonnement il faut faire :
biensûr cela ne change rien ici puisque largeur==hauteur==8
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void init_cases_taille() { <...> for(i=0; i<largeur; i++) <...> }
Partager