C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Probleme de compilation avec un constructeur
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Jude
Guest





PostPosted: Sat Apr 02, 2005 8:06 pm    Post subject: Probleme de compilation avec un constructeur Reply with quote



Bonjour

Pour une classe bigint (exo de td d'info scolaire)
je voudrais realiser un constructeur comme celui ci
Un bigint possede un entier taille et un vecteur Nt

BigInt::BigInt(string chaine) {

taille=chaine.size();

Nt=vector<int>(taille-1);

for(int i=taille-1;i<0;i--) {
Nt[taille-i]=chaine[taille-i+1]-'0';
}
}

Le but serait de rentrer les differents caracteres de chaine dans Nt

Le probleme est :

bigint.cc:23: error: le C++ ISO interdit la définition de types à
l'intérieur
de return type
bigint.cc:23: error: return type specification for constructor invalid

Voilà si vous voyez l'erreur, ou s'il vous faut plus de renseignements,
je vous remercie dejà pour votre reponse.

--
Jude
Pas très bon, mais debutant
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Apr 02, 2005 9:06 pm    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote



On Sat, 02 Apr 2005 22:06:58 +0200, Jude <jude (AT) crans (DOT) org>:

Quote:
bigint.cc:23: error: le C++ ISO interdit la définition de types à
l'intérieur
de return type
bigint.cc:23: error: return type specification for constructor invalid

T'es sûr que t'as déclaré le constructeur dans la classe ?

En tout cas, le code ci-dessous compile :

#include <string>
#include <vector>

using std::vector;
using std::string;

class BigInt
{
public:
BigInt(string chaine);

private:
int taille;
vector<int> Nt;
};

BigInt::BigInt(string chaine) {

taille=chaine.size();

Nt=vector<int>(taille-1);
// J'ai de gros doutes sur le "-1"

for(int i=taille-1;i<0;i--) {
Nt[taille-i]=chaine[taille-i+1]-'0';
}
}


Le même code, mais en un petit peu plus propre :

#include #include <vector>

class BigInt
{
public:
BigInt (std::string const& chaine);
int Taille() const { return chiffres.size(); }

private:
std::vector<int> chiffres;
};

using std::vector; // Si tu y tiens
using std::string; // (ça peut permettre d'alléger un peu)

BigInt::BigInt (string const& chaine)
{
for (int i=0; i {
chiffres.push_back (chaine[i]-'0');
// le coup du " -'0' " me paraît discutable, mais bon...
}
}


ou, mieux :

BigInt::BigInt (string const& chaine)
{
for (string::const_iterator i= chaine.begin();
i != chaine.end(); ++i)
{
chiffres.push_back (*i - '0');
// même remarque sur " -'0' ".
}
}


--
;-)

Back to top
Cyrille
Guest





PostPosted: Sat Apr 02, 2005 9:06 pm    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote



Jude a écrit :
Quote:
Bonjour

Le but serait de rentrer les differents caracteres de chaine dans Nt

Le probleme est :

bigint.cc:23: error: le C++ ISO interdit la définition de types à
l'intérieur
de return type
bigint.cc:23: error: return type specification for constructor invalid

Voilà si vous voyez l'erreur, ou s'il vous faut plus de renseignements,
je vous remercie dejà pour votre reponse.

A lui tout seul, ce code ne comporte pas de faute particulière, l'erreur
est avant. Vu le message d'erreur, je pencherais pour un point-virgule
manquant juste avant, genre à la fin du bloc de définition de la classe.

par exemple:
class BigInt
{
// ...
}; // ne pas oublier le point-virgule ici.

BigInt::BigInt(string){} *

si le point-virgule a été omis, le compilateur croit que le bloc
précédent est le type de retour du constructeur, et il couine avec les
messages d'erreurs que vous donnez:
- Il ne peut y avoir une définition de type à l'intérieur d'un return type.
- Un constructeur ne peut pas avoir de return type.

--
win the yes need the no to win against the no!

Back to top
Matthieu Moy
Guest





PostPosted: Sat Apr 02, 2005 9:31 pm    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

Jude <jude (AT) crans (DOT) org> writes:

Quote:
Bonjour

Bonsoir,

Quote:
bigint.cc:23: error: le C++ ISO interdit la définition de types à
l'intérieur
de return type
bigint.cc:23: error: return type specification for constructor invalid

Quelle est la ligne 23 dans le programme ?

--
Matthieu

Back to top
Jude
Guest





PostPosted: Sun Apr 03, 2005 7:48 am    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

Cyrille a écrit :

Quote:
class BigInt
{
// ...
}; // ne pas oublier le point-virgule ici.

BigInt::BigInt(string){} *

si le point-virgule a été omis, le compilateur croit que le bloc
précédent est le type de retour du constructeur, et il couine avec les
messages d'erreurs que vous donnez:
- Il ne peut y avoir une définition de type à l'intérieur d'un return type.
- Un constructeur ne peut pas avoir de return type.


Merci c'etait ça

--
Jude

Back to top
Jude
Guest





PostPosted: Sun Apr 03, 2005 12:04 pm    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

Fabien LE LEZ a écrit :

Quote:
BigInt::BigInt (string const& chaine)
{
for (int i=0; i {
chiffres.push_back (chaine[i]-'0');
// le coup du " -'0' " me paraît discutable, mais bon...
}
}


ou, mieux :

BigInt::BigInt (string const& chaine)
{
for (string::const_iterator i= chaine.begin();
i != chaine.end(); ++i)
{
chiffres.push_back (*i - '0');
// même remarque sur " -'0' ".
}
}

Oui vous avez raison de vouloir discuter sur le -'0' car cela ne marche
pas (une indication de notre prof d'info).
Je cherche en fait juste a vouloir convertir en un entier le caractere
contenue dans ma chaine.
Il y a t'il une commande speciale?
Merci

--
Jude

Back to top
Miguel
Guest





PostPosted: Sun Apr 03, 2005 2:21 pm    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote


Quote:
Oui vous avez raison de vouloir discuter sur le -'0' car cela ne marche
pas (une indication de notre prof d'info).

Pourquoi ca marche pas??? (à lire avec un air d'enfant de 5-6 ans)



Back to top
Cyrille
Guest





PostPosted: Sun Apr 03, 2005 5:57 pm    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

Jude a écrit :
Quote:
Fabien LE LEZ a écrit :

BigInt::BigInt (string const& chaine) {
for (string::const_iterator i= chaine.begin(); i !=
chaine.end(); ++i)
{
chiffres.push_back (*i - '0'); // même remarque sur "
-'0' ".
}
}


Oui vous avez raison de vouloir discuter sur le -'0' car cela ne marche
pas (une indication de notre prof d'info).
Je cherche en fait juste a vouloir convertir en un entier le caractere
contenue dans ma chaine.
Il y a t'il une commande speciale?

Si votre prof vous a dit que ça ne marchait pas sans vous en dire plus,
c'est sans doute qu'il s'attend à ce que vous fassiez ça en exercice.
Aussi, réfléchissez-y, ça n'a rien de difficile, de faire une fonction
qui prend un char en paramètre et qui renvoye l'entier int correspondant.

--
win the yes need the no to win against the no!

Back to top
James Kanze
Guest





PostPosted: Sun Apr 03, 2005 8:29 pm    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

Jude wrote:
Quote:
Fabien LE LEZ a écrit :

BigInt::BigInt (string const& chaine) {
for (int i=0; i {
chiffres.push_back (chaine[i]-'0'); // le coup du " -'0'
" me paraît discutable, mais bon...
}
}

ou, mieux :

BigInt::BigInt (string const& chaine) {
for (string::const_iterator i= chaine.begin(); i !=
chaine.end(); ++i)
{
chiffres.push_back (*i - '0'); // même remarque sur "
-'0' ".
}
}

Oui vous avez raison de vouloir discuter sur le -'0' car cela
ne marche pas (une indication de notre prof d'info).

Ça dépend bien du contenu de la chaîne, non ? Si on a vérifié
d'avance que la chaîne ne contient que des chiffres (isdigit()
renvoie vrai), je ne vois pas le problème. (Ce n'est pas comme
ça que je ferais, parce que j'aimerais bien que le même code
fonctionne aussi pour des chiffres hexadécimaux. Mais pour les
chiffres décimaux, c'est garanti par la norme.)

Quote:
Je cherche en fait juste a vouloir convertir en un entier le
caractere contenue dans ma chaine.

S'il s'agit uniquement de convertir un seul chiffre, de '0' à
'9', et qu'on sait que isdigit renvoie true, ch - '0' est la
façon la plus simple à en avoir la valeur du chiffre dans un
entier.

Quote:
Il y a t'il une commande speciale?

Ça dépend ce que tu veux faire. Pour convertir une chaîne en
entier, il existe plusieurs possibilités. Pour convertir un seul
chiffre, sans en faire une chaîne, il n'y a rien de prévu, à
part la soustraction de '0'.

--
James Kanze mailto: [email]james.kanze (AT) free (DOT) fr[/email]
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

Back to top
Loïc Joly
Guest





PostPosted: Sun Apr 03, 2005 9:16 pm    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

James Kanze a écrit :
Quote:
Jude wrote:

Oui vous avez raison de vouloir discuter sur le -'0' car cela
ne marche pas (une indication de notre prof d'info).

Ça dépend bien du contenu de la chaîne, non ? Si on a vérifié
d'avance que la chaîne ne contient que des chiffres (isdigit()
renvoie vrai), je ne vois pas le problème. (Ce n'est pas comme
ça que je ferais, parce que j'aimerais bien que le même code
fonctionne aussi pour des chiffres hexadécimaux. Mais pour les
chiffres décimaux, c'est garanti par la norme.)

Pourrais-tu citer une référence ? J'ai jetté un oeil et n'ai rien trouvé.

--
Loïc

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Mon Apr 04, 2005 7:37 am    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

Loïc Joly wrote:
Quote:
James Kanze a écrit :
Jude wrote:

Oui vous avez raison de vouloir discuter sur le -'0' car
cela ne marche pas (une indication de notre prof d'info).

Ça dépend bien du contenu de la chaîne, non ? Si on a
vérifié d'avance que la chaîne ne contient que des chiffres
(isdigit() renvoie vrai), je ne vois pas le problème. (Ce
n'est pas comme ça que je ferais, parce que j'aimerais bien
que le même code fonctionne aussi pour des chiffres
hexadécimaux. Mais pour les chiffres décimaux, c'est garanti
par la norme.)

Pourrais-tu citer une référence ? J'ai jetté un oeil et n'ai
rien trouvé.

Je ne sais pas où le chercher dans la norme C++ non plus.

Dans la norme C, §5.2.1/3, on a « In both the source and
execution basic character sets, the value of each character
after 0 in the above list of decimal digits shall be one greater
than the value of the previous. » Je ne trouve pas où on le dit
dans la norme C++, mais je ne crois pas que l'intention était
d'être différent de C ici. (Au moins, cette différence
n'apparaît pas dans l'appendice C.1.)

Est-ce qu'il faut poser la question dans comp.std.c++ ?

--
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


Back to top
Samuel Krempp
Guest





PostPosted: Mon Apr 04, 2005 8:33 am    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

le Monday 04 April 2005 09:37, [email]kanze (AT) gabi-soft (DOT) fr[/email] écrivit :
Quote:
Pourrais-tu citer une référence ? J'ai jetté un oeil et n'ai
rien trouvé.

Je ne sais pas où le chercher dans la norme C++ non plus.

Dans la norme C, §5.2.1/3, on a « In both the source and
execution basic character sets, the value of each character
after 0 in the above list of decimal digits shall be one greater
than the value of the previous. » Je ne trouve pas où on le dit
dans la norme C++, mais je ne crois pas que l'intention était
d'être différent de C ici. (Au moins, cette différence
n'apparaît pas dans l'appendice C.1.)

qd j'ai eu besoin de cette garantie, j'ai écrit dans mes notes :
22.2.1.1.2/13
In addition, for any digit character c, the expression
(do_narrow(c,dfault)?-0?) evaluates to the digit value of the character.

--
Sam

Back to top
Samuel Krempp
Guest





PostPosted: Mon Apr 04, 2005 8:44 am    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

le Sunday 03 April 2005 19:57, [email]cyrille (AT) frsf (DOT) inva[/email]lid écrivit :

Quote:
Jude a écrit :
Fabien LE LEZ a écrit :

BigInt::BigInt (string const& chaine) {
for (string::const_iterator i= chaine.begin(); i !=
chaine.end(); ++i)
{
chiffres.push_back (*i - '0'); // même remarque sur "
-'0' ".
}
}


Oui vous avez raison de vouloir discuter sur le -'0' car cela ne marche
pas (une indication de notre prof d'info).
Je cherche en fait juste a vouloir convertir en un entier le caractere
contenue dans ma chaine.
Il y a t'il une commande speciale?

Si votre prof vous a dit que ça ne marchait pas sans vous en dire plus,
c'est sans doute qu'il s'attend à ce que vous fassiez ça en exercice.
Aussi, réfléchissez-y, ça n'a rien de difficile, de faire une fonction
qui prend un char en paramètre et qui renvoye l'entier int correspondant.

ben.. il n'y a pas d'autre moyen. bon, on peut ajouter un narrow sur *i,
pour reconnaître comme chiffre d'éventuels caractères locaux en plus de
'0'-'9', mais c'est un détail - et ce n'est pas forcément désirable.
dans le fond il n'y a pas d'autre moyen que c-'0'.

Peut-être le prof pensait que c'était une bidouille, et qu'il attend plutôt
une utilisation de stringstream pour convertir la chaine en entier. Mais de
toute façon c'est justement ce que fera l'extraction vers entier du
stringstream..

--
Sam

Back to top
Samuel Krempp
Guest





PostPosted: Mon Apr 04, 2005 8:45 am    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

le Saturday 02 April 2005 23:06, [email]gramster (AT) gramster (DOT) com[/email] écrivit :

Quote:
Nt=vector<int>(taille-1);
// J'ai de gros doutes sur le "-1"

for(int i=taille-1;i<0;i--) {

et aussi de gros doutes sur le 'i<0' :)

--
Sam

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Mon Apr 04, 2005 1:21 pm    Post subject: Re: Probleme de compilation avec un constructeur Reply with quote

Samuel Krempp wrote:
Quote:
le Monday 04 April 2005 09:37, [email]kanze (AT) gabi-soft (DOT) fr[/email] écrivit :
Pourrais-tu citer une référence ? J'ai jetté un oeil et
n'ai rien trouvé.

Je ne sais pas où le chercher dans la norme C++ non plus.

Dans la norme C, §5.2.1/3, on a « In both the source and
execution basic character sets, the value of each character
after 0 in the above list of decimal digits shall be one
greater than the value of the previous. » Je ne trouve pas
où on le dit dans la norme C++, mais je ne crois pas que
l'intention était d'être différent de C ici. (Au moins,
cette différence n'apparaît pas dans l'appendice C.1.)

qd j'ai eu besoin de cette garantie, j'ai écrit dans mes notes :
22.2.1.1.2/13
In addition, for any digit character c, the expression
(do_narrow(c,dfault)?-0?) evaluates to the digit value of the
character.

Intéressant. J'avoue que ce n'est vraiement pas dans §22 que je
serais allé chercher une information sur des contraintes de
l'implémentation du compilateur:-). Mais au moins, l'auteur de
ces lignes croyait que la garantie explicite de la norme C
valait pour C++ aussi.

--
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


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.