OVH Cloud OVH Cloud

tableau 2d statique

4 réponses
Avatar
Christophe Bondoin
Bonjour,

j'aimerais utiliser un tableau statique de chaines de caratère.
J'ai essayé :

class Truc {
public:
static const char** tab;
};

dans le .h, et :

const char** Truc::tab = { "a", "b" };

dans le .cpp, mais ça ne compile pas :
error: initializer for scalar variable requires one element

J'ai essayé de déclaré comme ça :
const char* tab[2];

ça ne marche pas, et d'initialiser comme ça :
const char* Truc::tab[0] = "a";

ça ne marche pas non plus. Tout ce que je veux c'est un tableau statique,
accessible depuis l'extérieur et initialisé dès le début de l'appli.

Merci si vous avez des solutions

4 réponses

Avatar
Falk Tannhäuser
Christophe Bondoin wrote:
class Truc {
public:
static const char** tab;
};

dans le .h, et :

const char** Truc::tab = { "a", "b" };

dans le .cpp, mais ça ne compile pas :
error: initializer for scalar variable requires one element


Normal - on ne peut pas initialiser un pointeur avec deux valeurs...

J'ai essayé de déclaré comme ça :
const char* tab[2];

ça ne marche pas, et d'initialiser comme ça :
const char* Truc::tab[0] = "a";


C'est curieux ! Ceci doit fonctionner (tableau d'une dimension
comportant des pointeurs constants sur des chaînes constantes) :

// dans le .h
class Truc
{
public:
static char const* const tab[2];
};

// dans le .cpp
char const* const Truc::tab[] = { "a", "b" };

Voici une autre façon de faire, avec un tableau de 2 dimensions :

class Truc
{
public:
static char const tab[2][N];
};

char const Truc::tab[2][N] = { "a", "b" };

ou 'N' est la taille maximale de tes chaînes de caractères (comprenant
le '' à la fin).

Falk

Avatar
Sylvain
Falk Tannhäuser wrote on 10/10/2006 19:40:

J'ai essayé de déclaré comme ça :
const char* tab[2];



sans le 'static' et hors de la classe 'Truc' ??

ça ne marche pas, et d'initialiser comme ça :
const char* Truc::tab[0] = "a";


C'est curieux ! Ceci doit fonctionner [...]


si une des 2 erreurs ci-avant est présente, cela explique pourquoi;
sinon c'est très "curieux" (voire une erreur du compilo).

Sylvain.


Avatar
Christophe Bondoin
Hum, ça marche avec :

static const char* tab[2];

dans le .h, et :

const char* Truc::tab[] = { "A", "B" };

dans le .cpp ...

ou je suis bete (c'est tout à fait possible), ou c'est la seule combinaison
que je n'ai pas testé ...

En tout cas merci.
Avatar
kanze
Falk Tannhäuser wrote:
Christophe Bondoin wrote:
class Truc {
public:
static const char** tab;
};

dans le .h, et :

const char** Truc::tab = { "a", "b" };

dans le .cpp, mais ça ne compile pas :
error: initializer for scalar variable requires one element


Normal - on ne peut pas initialiser un pointeur avec deux valeurs...

J'ai essayé de déclaré comme ça :
const char* tab[2];

ça ne marche pas, et d'initialiser comme ça :
const char* Truc::tab[0] = "a";


C'est curieux ! Ceci doit fonctionner (tableau d'une dimension
comportant des pointeurs constants sur des chaînes
constantes) :


Il y a au moins deux erreurs : on ne peut pas déclarer un
tableau statique de taille zéro -- il faut au moins un élément,
et un tableau est un aggloméré, dont l'initialisateur exige des
{...}.

const char* /* const ? */ Truc::tab[] = { "A", "B" } ;

doit marcher.

Je sais que le posteur original ne l'avait pas, mais s'il veut
un tableau const, il lui faut aussi le deuxième const, que j'ai
mis en commentaires. (Et s'il ne veut pas que le tableau soit
const, je conseillerais vivement un tableau de std::string,
plutôt que des pointeurs.)

// dans le .h
class Truc
{
public:
static char const* const tab[2];
};

// dans le .cpp
char const* const Truc::tab[] = { "a", "b" };

Voici une autre façon de faire, avec un tableau de 2 dimensions :

class Truc
{
public:
static char const tab[2][N];
};

char const Truc::tab[2][N] = { "a", "b" };

ou 'N' est la taille maximale de tes chaînes de caractères
(comprenant le '' à la fin).


C'est un véritable tableau à deux dimensions, et non un tableau
de pointeurs. Mais je ne sais pas si c'est un si bonne idée si
ce qu'il veut réelement est un tableau de chaînes.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34