[C] Pointeur vers tableau Multidimensionnel
Fermé
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
-
19 juin 2005 à 02:46
Cybergourou - 20 oct. 2012 à 01:25
Cybergourou - 20 oct. 2012 à 01:25
A voir également:
- [C] Pointeur vers tableau Multidimensionnel
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Windows 7 vers windows 10 - Accueil - Mise à jour
5 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
Modifié le 20 juin 2005 à 10:44
Modifié le 20 juin 2005 à 10:44
A) RAPPELS : ALLOCATION MEMOIRE
1) Statique :
Cette variable est allouée et sera détruire à la fin de l'appel de la fonction dans laquelle tu la déclare.
Interêt : on ne se prend pas la tête pour allouer / vider la mémoire
Inconvénient : c'est statique donc on alloue souvent un truc disproportionné.
Remarque importante : par la suite accéder à machaine[i] revient à considérer la valeur stockée i case de taille char (car ma chaine est un char[]) après l'adresse de machaine.
Remarque : En particulier on a donc *machaine <=> machaine[0]
2) dynamique
Interêt : allocation idéale de la mémoire
Inconvénient : faut la gérer ;o)
B) ZE PROBLEM
Maintenant on peut regarder comment allouer une matrice :
Après à toi de définir les opérateurs que tu veux (produits, tranposée que sais-je... ;) )
Bonne chance
1) Statique :
char[10] unechaine;
Cette variable est allouée et sera détruire à la fin de l'appel de la fonction dans laquelle tu la déclare.
Interêt : on ne se prend pas la tête pour allouer / vider la mémoire
Inconvénient : c'est statique donc on alloue souvent un truc disproportionné.
Remarque importante : par la suite accéder à machaine[i] revient à considérer la valeur stockée i case de taille char (car ma chaine est un char[]) après l'adresse de machaine.
Remarque : En particulier on a donc *machaine <=> machaine[0]
2) dynamique
char *machaine=(char *)malloc(sizeof(char)*10); //mais à la place de 10 on peut mettre n ;o) ... // manipulations sur machaine ... free(machaine);
Interêt : allocation idéale de la mémoire
Inconvénient : faut la gérer ;o)
B) ZE PROBLEM
Maintenant on peut regarder comment allouer une matrice :
int matrice[5][5]; //alloue une matrice de manière statique // allouer une matrice 2d dynamiquement int **matrice2d = (int**)malloc(sizeof(int*) * nb_ligne); for(unsigned int i = 0; i < nb_ligne; i++){ matrice2d[i] = (int*)malloc(sizeof(int) * nb_colonne); } // allouer une matrice 23d dynamiquement int ***matrice3d = (int***)malloc(sizeof(int**) * nb_couche); for(unsigned int j = 0; i < nb_couche; i++){ matrice2[j] = (int**)malloc(sizeof(int*) * nb_ligne); for(unsigned int i = 0; i < nb_ligne; i++){ matrice2[j][i] = (int*)malloc(sizeof(int) * nb_colonne); } } //détruire une matrice 2d for(unsigned int i=0;i<nb_ligne;i++){ free(matrice2d[i]); } free(matrice2d); //...pour la matrice 3d je te laisse deviner ;o) //initialiser matrice3d[i][j][k] matrice3d[i][j][k]=2;
Après à toi de définir les opérateurs que tu veux (produits, tranposée que sais-je... ;) )
Bonne chance
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
177
19 juin 2005 à 12:31
19 juin 2005 à 12:31
salut killian, our_char n'est pas un pointeur et p_our_char est un pointeur donc l'affectation est incompatible. En fait ton p_our_char est un pointeur vers un tableau de pointeurs. Alors qe our_hcar est un tableau de tableau, ce n'est pas implémenté de la meme maniére et tu risques de ne pas avoir ce qe tu veux. En fait lorsqe tu vas faire p_our_char[i] est un pointeur alors qe our_char[i] est un ensemble contigu de valaurs. Je ne sais pas si j'ai été clair.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
19 juin 2005 à 15:19
19 juin 2005 à 15:19
Salut,
Oki, mais pourtant le nom d'un tableau est bien un poiteur vers le début de ce tableau?
En toute logique our_char[10] est un pointeur.
Donc le nom d'un tableau de tableaux devrait lui aussi être un pointeur.
Qui plus est un pointeur vers un pointeur de début de tableau.
Pour shématiser, dans mon esprit ça donne:
our_char qui pointe vers our_char[0] qui pointe vers our_char[0][0]
Le argv passé en paramètre dans le main fonctionne comme ça je crois...
Oki, mais pourtant le nom d'un tableau est bien un poiteur vers le début de ce tableau?
En toute logique our_char[10] est un pointeur.
Donc le nom d'un tableau de tableaux devrait lui aussi être un pointeur.
Qui plus est un pointeur vers un pointeur de début de tableau.
Pour shématiser, dans mon esprit ça donne:
our_char qui pointe vers our_char[0] qui pointe vers our_char[0][0]
Le argv passé en paramètre dans le main fonctionne comme ça je crois...
argv n'est pas passé de la même manière, argv est un pointeur sur chaîne dynamique ce qui est foncièrement différent de ce que tu dis, tu peux caster c'est sur mais ce n'est pas pareil. De plus essaie de voir ton our_char[0] comme un vecteur et ton our_char[0][0] comme une matrice et tu comprendras ton erreur. Avec 7ans de retard bien sur ;)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
19 juin 2005 à 09:34
19 juin 2005 à 09:34
Bonjour kilian,
essaie
char **p_our_char
Contrairement à un tableau où les cases sont allouées statiquement à la déclaration, un pointeur de pointeur n'alloue aucun espace.
Donc toujours malloc() pour créer ce qui peut être une colonne de pointeurs.
essaie
#include <stdio.h> #include <string.h> #include <stdlib.h> main() { char **p_our_char; char our_char[10][20]; strcpy(our_char[0],"CHAINE0"); strcpy(our_char[1],"CHAINE1"); p_our_char=malloc(sizeof( char *)); *p_our_char=our_char[0]; *(p_our_char+1)=our_char[1]; printf("%s\n",*p_our_char); printf("%s\n",*(p_our_char+1)); }
char **p_our_char
p_our_char est l'adresse du 1er élément, donc l'adresse de pointeur de caractère *p_our_char est le contenu du 1er élément, donc un pointeur de caractère **p_our_char est la donnée pointée par le 1er élément, donc un caractère.
Contrairement à un tableau où les cases sont allouées statiquement à la déclaration, un pointeur de pointeur n'alloue aucun espace.
Donc toujours malloc() pour créer ce qui peut être une colonne de pointeurs.
l'access au 1er pointeur se note *p_our_char l'access au 2ème pointeur se note *(p_our_char +1)
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
19 juin 2005 à 15:13
19 juin 2005 à 15:13
Salut Lami20j,
Mais dans ce cas, je perds l'avantage d'utiliser mon pointeur comme une référence vers une chaine déjà existante.
Dans ton exemple (qui marche bien :-) il faut copier à chaque fois la valeur de chaines déjà existantes dans un espace alloué.... Ca crée un doublon inutile dans la memoire....
Mais dans ce cas, je perds l'avantage d'utiliser mon pointeur comme une référence vers une chaine déjà existante.
Dans ton exemple (qui marche bien :-) il faut copier à chaque fois la valeur de chaines déjà existantes dans un espace alloué.... Ca crée un doublon inutile dans la memoire....
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
19 juin 2005 à 16:07
19 juin 2005 à 16:07
Ah non je comprends mieux, on allour de la place pour un pointeur, pas pour une chaîne. Donc ta solution est la bonne....
Ok ok...
J'ai encore du mal à comprendre le système....euh je reviendrais peut être bientôt... :-)
J'ai du mal à comprendre pourquoi il faut reserver un emplacement memoire.....
Ok ok...
J'ai encore du mal à comprendre le système....euh je reviendrais peut être bientôt... :-)
J'ai du mal à comprendre pourquoi il faut reserver un emplacement memoire.....
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
19 juin 2005 à 16:21
19 juin 2005 à 16:21
Re,
Regarde un peu
donc il y a une colonne des pointeurs alloués
Regarde un peu
**p | | *p -> our_char[0][0] our_char[0][1] ----------------our_char[0][19] | | | *p + 9 -> our_char[9][0] our_char[9][1] ----------------our_char[9][19]
donc il y a une colonne des pointeurs alloués
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
>
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
19 juin 2005 à 16:53
19 juin 2005 à 16:53
Oui mais ce qui me semble bizzare c'est que tu n'alloues la place que pour un seul (char *)...
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
19 juin 2005 à 17:10
19 juin 2005 à 17:10
C'est vrai,
au début j'ai mis 10 * sizeof ( char *) mais empirique j'ai vu que ça marche que pour un seul.
Moi aussi j'essaie de m'expliquer des choses.
au début j'ai mis 10 * sizeof ( char *) mais empirique j'ai vu que ça marche que pour un seul.
Moi aussi j'essaie de m'expliquer des choses.
Latifah
Messages postés
27
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
15 avril 2008
6
19 juin 2005 à 14:17
19 juin 2005 à 14:17
bjr. j'aimerai savoir ou trouver un cours complet sur les matrices (tableaux à +ieurs dimensions). aidez moi please, j'ai vraiment cherché mais je trouve que des trucs trés résumés.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
19 juin 2005 à 17:38
19 juin 2005 à 17:38
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
20 juin 2005 à 10:44
20 juin 2005 à 10:44
Ok merci pour l'info :-)