OVH Cloud OVH Cloud

passage par réference?

21 réponses
Avatar
jmarc
quand j'écris ces lignes qu'est ce qui gene le compilateur,
j'ai indiqué la ligne en erreur,
moi je trouve ca plus facile qu'avec des pointeurs!!
(ce programme calcul la suite de fibonacci jusqu'à 10)
merci

#include <iostream>
using namespace std;

void calculsuite(int *);
void inittab(int *);
void afftab(int *);

void main()

{
int * tab=new int[10];
inittab(tab); /*erreur à la compilation ne peut convertir int [10] en int
&*/
calculsuite(tab);
afftab(tab);
}

void calculsuite(int *t)
{
int a,b,sauv;
a=1;
b=2;
for (int j=1;j<10;j++)
{
cout<<a<<"\n";
t[j]=a;
sauv=b;
b=a+b;
a=sauv;
}
}


void inittab(int * t)
{
for (int j=1;j<10;j++) t[j]=0;
}

void afftab(int * t)
{
for (int j=1;j<10;j++) cout<<t[j]<<"\n";
}

10 réponses

1 2 3
Avatar
Erwann ABALEA
Bonsoir,

On Sat, 20 Nov 2004, Jean-Marc Bourguet wrote:

À part void main à la place de int main, je ne vois pas de
problèmes pouvant indisposer un compilateur avec ce
programme


http://www.gimpel.com/html/bugs/bug815.htm

Non?

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
"Time never started at all. Chaos never died. The Empire was
never founded. We are not now & never have been slaves to the
past or hostages to the future." -Hakim Bey, /T.A.Z./

Avatar
drkm
"jmarc" writes:

pas la peine j'ai trouvé


Peux-tu, stp, ne citer que les passages pertinent du message auquel
tu réponds ? Ainsi que répondre *après* le message cité. Merci.

--drkm

Avatar
drkm
Erwann ABALEA writes:

Bonsoir,

On Sat, 20 Nov 2004, Jean-Marc Bourguet wrote:

À part void main à la place de int main, je ne vois pas de
problèmes pouvant indisposer un compilateur avec ce
programme


http://www.gimpel.com/html/bugs/bug815.htm

Non?


Où ça ?

--drkm


Avatar
Erwann ABALEA
On Sun, 21 Nov 2004, drkm wrote:

Erwann ABALEA writes:

Bonsoir,

On Sat, 20 Nov 2004, Jean-Marc Bourguet wrote:

À part void main à la place de int main, je ne vois pas de
problèmes pouvant indisposer un compilateur avec ce
programme


http://www.gimpel.com/html/bugs/bug815.htm

Non?


Où ça ?


Visiblement, le programme posté par jmarc ne correspond pas à ce qui a été
compilé (il n'y a aucune fonction void inittab(int &t) dans son source).
Je me dis qu'il a compilé le source posté, qu'il a tenté de l'exécuter, et
qu'il a eu une erreur à l'exécution (un SIGSEGV par exemple).

De plus, Jean-Marc Bourguet ne voit pas de problème pouvant indisposer un
compilateur. Je fournis simplement un lien vers une page où une
construction similaire (remplace "new (char *)[10]" par "new int[10]") est
décrite comme une erreur potentielle, avec explications.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
PS> Salut ! J'ai un sujet de philo à vous soumettre : "Suffit-il
PS> d'observer pour connaître" Idées + plan Merçi
Oui, ya qu'a t'observer pour connaître le fait que tu es une feignasse.
-+- FF in: Guide du Neuneu d'Usenet - Neuneu fait de la philo -+-



Avatar
Fabien LE LEZ
On Sun, 21 Nov 2004 01:13:08 +0100, Erwann ABALEA :

http://www.gimpel.com/html/bugs/bug815.htm


"Our attempt to wish everyone a Merry Christmas, though syntactically
correct, has a serious flaw. Can you find it?"

Euh... le "serious flaw" dont ils parlent, c'est que le programme est
écrit n'importe comment ?
Mon dieu mon dieu... S'il existe un programmeur C++ qui ose écrire ça,
pas étonnant qu'il ait besoin de plein de logiciels de débogage...


--
;-)

Avatar
Fabien LE LEZ
On Sun, 21 Nov 2004 11:14:07 +0100, Erwann ABALEA :

Je fournis simplement un lien vers une page où une
construction similaire (remplace "new (char *)[10]" par "new int[10]") est
décrite comme une erreur potentielle, avec explications.


Sauf que dans la page en question, l'erreur vient justement du fait
qu'on alloue un tableau de "char *", type dont le nom est composé de
deux "morceaux".



--
;-)

Avatar
Jean-Marc Bourguet
Erwann ABALEA writes:

On Sun, 21 Nov 2004, drkm wrote:

Erwann ABALEA writes:

Bonsoir,

On Sat, 20 Nov 2004, Jean-Marc Bourguet wrote:

À part void main à la place de int main, je ne vois pas de
problèmes pouvant indisposer un compilateur avec ce
programme


http://www.gimpel.com/html/bugs/bug815.htm

Non?


Où ça ?


Visiblement, le programme posté par jmarc ne correspond
pas à ce qui a été compilé (il n'y a aucune fonction void
inittab(int &t) dans son source). Je me dis qu'il a
compilé le source posté, qu'il a tenté de l'exécuter, et
qu'il a eu une erreur à l'exécution (un SIGSEGV par
exemple).


Vu qu'il donnait un message d'erreur, qu'il disait qu'il
trouvait ça plus propre, je juge plus probable qu'il a posté
une version compilant et fonctionnant plutot que l'essai
avec les références avec lequel il avait des problèmes mais
qu'il trouvait plus propre.

Le problème du bug815 n'est pas présent dans le code posté
non plus.

De plus, Jean-Marc Bourguet ne voit pas de problème
pouvant indisposer un compilateur. Je fournis simplement
un lien vers une page où une construction similaire
(remplace "new (char *)[10]" par "new int[10]") est
décrite comme une erreur potentielle, avec explications.


v = new int[s];

contient la première apparition de new dans la deuxième
édition the TC++PL (page 31 dans un chapitre intitullé "A
tour of C++"). Un compilateur qui tiquerait sur ça serait
vraissemblablement ignoré systématiquement sur le warning,
trop de faux positifs. Il n'est donc pas étonnant que dkrm
qui connait le C++ ne voit pas le problème que tu imagines.

Ce qui suit new doit être un type, est-ce que

void f((char*)[10]);

te convient comme déclaration de fonction en C? J'espère
que non: (char*)[10] n'est un type ni C ni en C++. Donc

new (char*)[10]

s'il est valable ne peut pas être interprété comme

new type

il l'est donc comme

expr[10]

et c'est le problème du bug815.

Note que l'exemple de Gimple

PtrPtrChar p = (PtrPtrChar) new (char *)[10];

est particulièrement tordu, parce que

1/ il y a un cast, caster le résultat de new est stupide
en C++

2/ il faut le cast, il n'est pas à cause du problème du
const oublié

new (char const*)[10]

a aussi besoin du cast pour faire taire le compilateur

new (char const*) a pour type char const**
new (char const*)[10] a pour type char const*

3/ l'expression plus naturelle

PtrPtrChar p = new PtrChar[10];

(si on écrit des typedef, autant les utiliser, pour
rappel les paramètres de la fonction sont déclarés
avec le typedef) fait ce qu'il faut

4/ l'expression aussi plus naturelle

PtrPtrChar p = new char const*[10];

fait aussi ce qu'il faut.

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
darkman_spam
Erwann ABALEA wrote in message news:...

On Sun, 21 Nov 2004, drkm wrote:

Erwann ABALEA writes:

http://www.gimpel.com/html/bugs/bug815.htm

Non?


Où ça ?


Visiblement, le programme posté par jmarc ne correspond pas à ce qui a été
compilé (il n'y a aucune fonction void inittab(int &t) dans son source).
Je me dis qu'il a compilé le source posté, qu'il a tenté de l'exécuter, et
qu'il a eu une erreur à l'exécution (un SIGSEGV par exemple).

De plus, Jean-Marc Bourguet ne voit pas de problème pouvant indisposer un
compilateur. Je fournis simplement un lien vers une page où une
construction similaire (remplace "new (char *)[10]" par "new int[10]") est
décrite comme une erreur potentielle, avec explications.


Mais si tu remplaces "new ( char * )[ 10 ]" par "new int[ 10 ]",
alors quel rapport avec le lien que tu donnes ?

--drkm



Avatar
Erwann ABALEA
On Sun, 21 Nov 2004, Fabien LE LEZ wrote:

On Sun, 21 Nov 2004 11:14:07 +0100, Erwann ABALEA :

Je fournis simplement un lien vers une page où une
construction similaire (remplace "new (char *)[10]" par "new int[10]") est
décrite comme une erreur potentielle, avec explications.


Sauf que dans la page en question, l'erreur vient justement du fait
qu'on alloue un tableau de "char *", type dont le nom est composé de
deux "morceaux".


OK. Chez nous (i.e. dans ma boîte), j'aurais dit: "ma gueule".
Merci à toi et Jean-Marc pour m'avoir montré qu'il ne faut pas tenter ce
genre d'exercice quand on est fiévreux. Trop facile de se planter.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
Ceci était mon dernier message, quels que soient les messages suivants,
je n'y répondrai pas car ce ne sont que des opinions.
-+-LH in: GNU-Toutes les opinions sont respectables sauf les votres. -+-


Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On Sun, 21 Nov 2004 11:14:07 +0100, Erwann ABALEA :

Je fournis simplement un lien vers une page où une
construction similaire (remplace "new (char *)[10]" par "new int[10]") est
décrite comme une erreur potentielle, avec explications.


Sauf que dans la page en question, l'erreur vient justement du fait
qu'on alloue un tableau de "char *", type dont le nom est composé de
deux "morceaux".


Non, le problème, c'est qu'on a utilisé des parenthèses sur une partie
du type qui comprend la « declaration specifier ». Selon la grammaire,
les parenthèses ne peut entourer que soit le type complet, soit les
parties du declarateur. Vue qu'ici « char » ne fait pas partie du
declarateur, la seule interprêtation possible, c'est que les parenthèses
entourent le type complet, et que ce qui suit ne fait pas partie du
type. Tu aurais le même problème avec « new (int)[ 10 ] ».

--
James Kanze GABI Software http://www.gabi-soft.fr
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


1 2 3