OVH Cloud OVH Cloud

déclaration de tableau de pointeur

34 réponses
Avatar
Laurent B
Bonjour ,
je souhaite déclarer un tableau de pointeur sur Contact .
Contact etant une classe

on m'a proposé 2 choses ( qui sont sencé etre equivelente ) :

**contact
*contact[]

Techiniquement c du chinoix pour moi

J'ai une erreur lors de la compilation :

c:\proget c++\listecontact.h(21) : error C2059: syntax error : '*'
C:\proget c++\test.cpp(9) : error C2059: syntax error : ']'
C:\proget c++\test.cpp(14) : error C2065: 'tab' : undeclared identifier
Error executing cl.exe.

10 réponses

1 2 3 4
Avatar
Marc Boyer
Falk Tannhäuser wrote:
Jean-Marc Bourguet wrote:
(contrairement aux listes de paramètres dans les déclarations
de fonctions, où
void foo(Contact* contact[]);
et
void foo(Contact** contact);
sont équivalents, ce qui constitue AMA une incohérence assez
énorme dans la définition du langage - c'est pour cela que
j'évite cette première écriture).


C'est à dire que tu privilégies toujours
void foo(int *i)
à
void foo(int i[])

Moi, j'avoue que j'utilise l'un quand le code attend un tableau,
et *i quand c'est une unique variable (enfin, en C, car en C++,
c'est plus souvent deux itérateurs pour une séquence).

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
Jean-Marc Bourguet
Falk Tannhäuser writes:

Jean-Marc Bourguet wrote:
Contact ** contact;
Contact * contact[];
Le premier declare un pointeur vers un pointeur vers Contact. On peut
eventuellement faire pointer ce pointeur vers un tableau de pointeurs
vers Contact mais autant utiliser std::vector<Contact*>.
La seconde ecriture n'est valable que dans les declarations et
definitions de fonctions, auquel cas elle est effectivement
equivalente a la premiere. Pour declarer une variable (et non un
parametre), il faut mettre la taille.


La seconde écriture sert aussi pour déclarer (sans le définir)
un tableau dont on ne connaît pas la taille :

extern Contact* contact[];


J'avais oublie en effet ce cas.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Alain Naigeon
"Laurent B" a écrit dans le message news:
41f79b0d$0$9750$
Bonjour ,
je souhaite déclarer un tableau de pointeur sur Contact .
Contact etant une classe

on m'a proposé 2 choses ( qui sont sencé etre equivelente ) :

**contact
*contact[]

Techiniquement c du chinoix pour moi


Euh... on peut évoquer le Chinois sans parler Chinois ;-)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Horst Kraemer
fabrizio wrote:

char **a; //a est un pointeur sur un pointeur de 'char'
char *a[]; //ceci est équivalent à la précédente
Ah?



Mea culpa si ce n'est pas le cas.
Il me semblait qu'en C au moins ces deux syntaxes étaient équivalentes.


C'est équivalent en C et en C++ seulement comme déclaration de
*paramètre* d'une fonction.

Le paramètre 'a' dans

void f( char a[]) /*1a*/
void f( char a[42]) /*1b*/
void f( char *a[]) /*2a*/
void f( char *a[42]) /*2b*/

est interprété comme s'il était déclaré

void f( char *a) /*1*/
void f( char **a) /*2*/

c.a.d. un paremètre déclaré "tableau de toto" est interprété comme
"pointeur de toto".

--
Horst

--
Lâche pas la patate!



Avatar
James Kanze
Laurent B wrote:

je souhaite déclarer un tableau de pointeur sur Contact .
Contact etant une classe


on m'a proposé 2 choses ( qui sont sencé etre equivelente ) :


**contact


C'est un pointeur à un pointeur.

*contact[]


C'est un tableau à un pointeur.

Ce sont deux choses bien différentes. Je ne sais pas où tu as
l'idée qu'elles soient équivalentes. (Aussi, je dois ajouter
qu'un C++, le deuxième est plutôt rare. En général, on préfère
quelque chose comme :

std::vector< Contact* > contact ;

quand on veut un tableau.)

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Avatar
James Kanze
fabrizio wrote:

[...]
classeA a; //a est de type classeA
classeA *a; //(*a) est de type classeA
//donc a est de type 'pointeur sur classeA


Je connais l'argument, mais je ne sais pas si c'est un bon
chemin à prendre. Ajoute un peu de const, et un typedef ou deux,
et l'explication ne tient plus.

char **a; //a est un pointeur sur un pointeur de 'char'
char *a[]; //ceci est équivalent à la précédente


Ce sont deux choses complétement différentes, tu veux dire. Le
premier est un pointeur à un pointeur, le deuxième un tableau de
pointeurs.

Sans le vrai code, il est impossible de comprendre où est
l'erreur de compilation.


En effet.

Je m'excuse de corriger tes fautes d'orthographe/grammaire.
Tout le monde à ses limites...


Tout à fait.

Il faut dire que bien programmer exige une forte attention aux
détails. Comme l'orthographe ou la grammaire. Celui qui ne
maîtrise pas l'un ne maîtrisera probablement pas l'autre.

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Avatar
James Kanze
Jean-Marc Bourguet wrote:
fabrizio writes:


char **a; //a est un pointeur sur un pointeur de 'char'
char *a[]; //ceci est équivalent à la précédente



Ah?


Tiens, on prend des leçons de Gaby ?

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
James Kanze
fabrizio wrote:
char **a; //a est un pointeur sur un pointeur de 'char'
char *a[]; //ceci est équivalent à la précédente




Ah?



Mea culpa si ce n'est pas le cas.
Il me semblait qu'en C au moins ces deux syntaxes étaient
équivalentes.


Jamais. En B, ils auraient été équivalent. S'il y avait eu des
declarations pour les pointeurs en B.

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34



Avatar
James Kanze
Jean-Marc Bourguet wrote:
"Laurent B" writes:


je souhaite déclarer un tableau de pointeur sur Contact .
Contact etant une classe



std::vector<Contact*> le_nom_du_tableau;


Contact* le_nom_du_tableau[la_taille_du_tableau];


on m'a proposé 2 choses ( qui sont sencé etre equivelente ) :>
**contact
*contact[]



Faudrait donner le nom du type. Donc


Contact ** contact;
Contact * contact[];


Le premier declare un pointeur vers un pointeur vers Contact.
On peut eventuellement faire pointer ce pointeur vers un
tableau de pointeurs vers Contact mais autant utiliser
std::vector<Contact*>.


La seconde ecriture n'est valable que dans les declarations et
definitions de fonctions, auquel cas elle est effectivement
equivalente a la premiere. Pour declarer une variable (et non
un parametre), il faut mettre la taille.


Pas du tout :

- extern Contact* contact[] ;
- Contact* contact[] = { ... } ;

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
James Kanze
Jean-Marc Bourguet wrote:
korchkidu writes:


Laurent B wrote:



je souhaite déclarer un tableau de pointeur sur Contact .
Contact etant une classe on m'a proposé 2 choses ( qui sont
sencé etre equivelente ) :
**contact
*contact[]
Techiniquement c du chinoix pour moi




Leu milleu dent ceux ca c du tylisez lait std::vector..;)



Une traduction en francais peut-etre?


Je crois qu'il s'est contenté de repondre dans la même langue
que la poste initiale. Histoire de montrer à quel point ça rend
ridicule et nuit à la compréhension.

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34



1 2 3 4