rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

[C] Pointeur vers tableau Multidimensionnel

Posté par kilian, le dimanche 19 juin 2005 à 02:46:26
Bonjour j'ai un soucis avec les pointeurs....

Quand je déclare une chaine de caractères en tableau multidimensionnel, je n'arriave pas à faire pointer une variable sur l'ensemble de ce tableau.

Par exemple:
void truc(){
	char **p_our_char; // pointeur vers tableau multidimensionnel
	char our_char[10][20]; //le tableau multidimensionnel
	strcpy(our_char[0],"CHAINE"); //Affectation d'une première chaine
	
	p_our_char=our_char; // C'est ici qu'arrive l'erreur
	printf("%s\n",p_our_char[0]);
}

Voici l'erreur que Gcc me renvoie:
attention : affectation d'un type pointeur incompatible

Pourtant c'est comme ça que fonctionne argv, il pointe vers un tableau multidimensionnel de chaine... Donc c'est un pointeur vers un pointeur. (D'ailleurs je viens d'essayer de faire pointer p_our_char vers argv et ça marche très bien)....
Je ne comprends pas bien pourquoi ça ne marche pas avec mon tableau.....

....Merci....
Configuration: Debian
Gcc 3.3.5
Répondre à kilian  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le dimanche 19 juin 2005 à 09:34:41
Bonjour kilian,

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)
Répondre à lami20j

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le dimanche 19 juin 2005 à 15:13:43
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....
Répondre à kilian

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le dimanche 19 juin 2005 à 16:07:17
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.....
Répondre à kilian

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le dimanche 19 juin 2005 à 16:21:51
Re,

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
Répondre à lami20j

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le dimanche 19 juin 2005 à 16:53:13
Oui mais ce qui me semble bizzare c'est que tu n'alloues la place que pour un seul (char *)...
Répondre à kilian

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le dimanche 19 juin 2005 à 17:10:22
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.
Répondre à lami20j

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le dimanche 19 juin 2005 à 17:33:26
Mais dans les docs je trouve que pour allouer un bloc mémoire

nombre_entrée * sizeof( char *)
Répondre à lami20j

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le dimanche 19 juin 2005 à 17:44:20
Bon...
De toutes façon là je commence à avoir mal à la tête :-)

Mais alors dans l'absolu, pour un tab multidimensionnel
char chaine[10][10];

Il n'est pas possble d'utiliser un pointeur directement vers "chaine"...
Parce que du coup dans mon programme j'ai une avalanche de boucles qui pourraient se résumer en une simple fonction si je pouvais pointer vers chaine.....
Répondre à kilian

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le dimanche 19 juin 2005 à 17:56:53
Je ne pense pas.

Récapitulons,

Un pointeur est une variable qui possède une adresse. Elle peut donct être pointée par une autre variable pointeur. Cette seconde variable est un pointeur de pointeur.

Un tableau est un pointeur. Un tableau de chaînes contient des pointeurs de caractères.
Un tableau de chaînes est donc un pointeur de pointeurs de caractères.

Concernant ton avalanche de boucles, fait attention et insère des commentaires et n'oublie pas l'indentation. Je te dis ça mais je crois que tu as déjà pris les précautions nécessaires.
Répondre à lami20j

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le dimanche 19 juin 2005 à 18:03:07
Un tableau de chaînes est donc un pointeur de pointeurs de caractères.
C'est pour ça que je ne comprend pas pourquoi je ne pas faire pointer un pointeur vers un tableau de chaines....

Sinon pour l'avalanche de boucles, pas de soucis pour l'indentation, par contre les commentaires.... je vais m'y mettre ^^

Mais bon je sens que c'est pas très propre comme façon de procéder...

Merci encore.
Répondre à kilian

15


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le dimanche 19 juin 2005 à 20:04:07
Re,

sinon regarde ça
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{
 int i;
 char *p_our_char;
 char our_char[2][20];

 strcpy(our_char[0],"CHAINE0");
 strcpy(our_char[1],"CHAINE1");


 for(i=0;i<2;i++)
 {
  p_our_char=our_char[i];
  printf("%s\n",p_our_char);
 }
}
Répondre à lami20j

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le dimanche 19 juin 2005 à 20:12:51
En fait cette methode ne m'arrange pas parce je veux utiliser ce pointeur pour plusieurs tableaux multi, et aussi parce que je dois passer ce pointeur vers tableau multi en paramètre d'une fonction.
Répondre à kilian

17


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le dimanche 19 juin 2005 à 20:22:53
Pour ce soir j'arrête. Si jamais je trouve quelque chose je te dirai.

Bonne soirée.
Répondre à lami20j

18


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le dimanche 19 juin 2005 à 20:24:38
Bonne soirée :-)

Et encore merci....
Répondre à kilian

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
tafiscobar, le dimanche 19 juin 2005 à 12:31:34
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. tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
Répondre à tafiscobar

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le dimanche 19 juin 2005 à 15:19:07
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...
Répondre à kilian

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Latifah, le dimanche 19 juin 2005 à 14:17:59
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.
"tek ci briik". jamais trop tard pour apprendre.
Répondre à Latifah

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le dimanche 19 juin 2005 à 17:38:23
Salut,

Tu trouves ici ce que tu cherches

http://www.developpez.com/
Répondre à lami20j

19


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
mamiemando, le dimanche 19 juin 2005 à 23:45:48
A) RAPPELS : ALLOCATION MEMOIRE

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 se prend pas la tête pour allouer / vider la mémoire
Inconvénient : c'est statique donc on alloue souvent un truc disproportionné.

Rq 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.
Rq : 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)
...
//faire mumuse sur machaine
...
free(machaine);

Interêt : allocation idéale de la mémoire
Inconvénient : faut la gérér ;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éee que sais je..;))

Bonne chance
Répondre à mamiemando

20


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 kilian, le lundi 20 juin 2005 à 10:44:30
Ok merci pour l'info :-)
Répondre à kilian
Logiciels pertinents trouvés dans les téléchargements
Télécharger Delphi 6 Edition personnelle 6.0Delphi 6 Edition personnelle - La société Borland (Inprise) a mis à disposition gratuitement, pour un usage non-commercial, la version 6 de son...Catégorie: Delphi
Licence: Freeware/gratuit
Télécharger FastStone Capture 5.9FastStone Capture - Ce logiciel de capture est léger, efficace et simple à utiliser. Vous pouvez capturer l'écran complet, une fenêtre, une...Catégorie: Capture
Licence: Shareware
Télécharger BitDefender 10BitDefender - BitDefender est la version gratuite de l'antivirus de l'éditeur Softwin. Il possède des fonctionnalités équivalentes à...Catégorie: Antivirus
Licence: Freeware/gratuit
Télécharger eChanblard 15.0eChanblard - Ce logiciel est une modification de eMule. Il permet d'obtenir des taux de transfert plus importants qu'avec eMule et il est...Catégorie: Internet
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « [C] Pointeur vers tableau Multidimensionnel »