Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

etudiant--> help

22 réponses
Avatar
elekis
bonjour, voila, dans un bete progrmme dont j'essaie de tester les
classes, je cle avec la fonction delete
ce prog creer une bete liste, affice les valeurs, detruit le denier
element, pis raffiche mais je sais pas pourquoi il ne veux pas me
supprimer le dernier element

#include <iostream>
using namespace std;

class elem
{
public:
elem* next;
int info;
elem(int);
};
elem::elem(int a)
{
info = a;
next = NULL;
}
main()
{
elem* tete= new elem(2);//element bidon
elem * p=tete;
for (int i= 1026; i<1093; i = i+12)
{
p->next = new elem(i);
p=p->next;
}
for(p = tete->next;p!=NULL;p=p->next)
cout<<p->info<<" ";
cout <<endl;

for(p = tete;p->next!=NULL;p=p->next)
;//atteint le dernier element

//est sencé le supprimer, mais sais pas pouruqoi, il ne veux pas.
delete p;

cout <<p->info<<endl;

for(p = tete->next;p!=NULL;p=p->next)
cout<<p->info<<" ";
cout << endl;

}


1026 1038 1050 1062 1074 1086
1086
1026 1038 1050 1062 1074 1086


j'ai deja chercher dans deux trois boucains, ainsi que donas mon cours,
mais je trouve pas

merci

a++

10 réponses

1 2 3
Avatar
Anthony Fleury
Gabriel Dos Reis wrote:

Anthony Fleury writes:

| Au passage, le return 0; est vraiment une habitude à prendre car
| certains compilateurs assez anciens n'ajoutent pas ce return 0;

Je veux des noms.

Ce comportement a toujours fait partie de C++ depuis des lustres.



Bah justement ce visual C++ 5 qui me dit à peu près et en traduit : (je ne
l'ai pas chez moi) :
"pas de return dans la fonction main, int main() changé en void main()."

| mais transforment le
| type de main en void si aucune valeur de retour n'est spécifiée (c'est
| le cas de visual C++ 5

Si Visual C++-5 decide que c'est que comprend son environnement
d'éxécution, alors aourter return 0 ne change rien.



C'est vrai... Et pour l'utilisation qui est faite des valeurs retournées
sous windows à ma connaissance, ce que je dis est un peu inutile en effet
[mais bon poster sur les news ca occupe :-)]

| qui je l'accorde est sorti avant la norme, donc c'est
| normal).

???


Au passage, vu que je n'ai que The C++ Programming Langage et non la norme,
tout ce qui se dit dans ce thread est explicitement inscrit dans la norme ?
[type de retour de main surtout]
Je voulais dire que, même si il est écrit explicitement dans C++98 que main
doit retourner un int, VC++5 datant d'avant cette norme peut l'occulter.

Anthony
--
"I should have seen it would be this way
I should have known from the start what she's up to
When you have loved and you've lost someone
You know what it feels like to lose" -- The Rasmus

Avatar
James Kanze
farid bouzemarene writes:

|> pourquoi int main()???

Parce que la norme l'exige.

En fait, tout dépend de ce que tu fais -- si tu as un programme
déjà truffé de MFC et d'autres spécificités MS, « void
main » c'est aussi bon que n'importe quoi d'autre. Mais si tu vises
la portabilité, il faut savoir que 1) la norme exige qu'un
compilateur émet un message d'erreur, et 2) il y a des compilateurs
qui le font réelement.

Une autre raison pour éviter « void main », évidemment,
c'est que ça déclenche beaucoup de réponses sans intérêt
dans les groupes de news. Si tu veux une reseignement réel ici, il
vaut mieux se limiter à « int main », pour éviter un tas de
réponses sur un sujet à côté.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Anthony Fleury writes:

|> Pour précision aussi, la déclaration
|> main()

|> contenait de toute facon une erreur. Si la personne ne veut renvoyer
|> aucune valeure dans main, il faut écrire void main() car le type
|> de retour doit obligatoirement être précisé pour une
|> fonction, dans le cas ou on ne retourne rien c'est void, et il n'y a
|> pas de type int implicite en C++ comme il y a pu y avoir en C, ou
|> cette définition était équivalente à int main().

Il est impossible dans le C++ standard à ne revoyer aucune valeur de
main. Il est en fait impossible de terminer un programme normalement
sans renvoyer un int, que ce soit en retournant de main, ou en appelant
exit().

Que ça a un sens ou non pour ton programme:-).

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Anthony Fleury writes:

|> Au passage, le return 0; est vraiment une habitude à prendre car
|> certains compilateurs assez anciens n'ajoutent pas ce return 0; mais
|> transforment le type de main en void si aucune valeur de retour
|> n'est spécifiée (c'est le cas de visual C++ 5 qui je l'accorde
|> est sorti avant la norme, donc c'est normal).

Indépendamment de l'état des compilateurs, si tu veux renvoyer 0,
c'est bien mieux de le dire, plutôt que de compter sur un hack dans
la norme. En revanche, je connais plus d'un programme où on n'arrive
jamais à la fin de main -- ou bien, on appelle exit() (pas une bonne
idée à mon avis, encore que dans certains cas des GUI,
peut-être...), ou bien, simplement, le programme ne termine jamais
(le cas de la plupart des serveurs, par exemple). Dans ces cas-là, je
ne vois pas pourquoi j'écrirais « return 0 ; » à la fin de
main.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
farid bouzemarene writes:

|> moi j'utilisais toujours main() sans type de retour et ça a
|> toujours marché....

|> mais bon je viens de comprendre que c'est normal en c90

Mais pas en C++ ni en C99. (Encore que j'imagine que la plupart des
compilateurs se contenteraient d'un warning, pour ne pas casser des
programmes existants.)

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Gabriel Dos Reis writes:

|> Anthony Fleury writes:

|> | Au passage, le return 0; est vraiment une habitude à prendre
|> | car certains compilateurs assez anciens n'ajoutent pas ce return
|> | 0;

|> Je veux des noms.

|> Ce comportement a toujours fait partie de C++ depuis des lustres.

Là, tu m'apprends quelque chose. Mais peut-être ça dépend de
ce qu'on considère « des lustres ». De toute façon, je
n'arrive pas à trouver ce comportement dans l'ARM, et d'après mes
souvenirs, ce n'était pas implémenté dans CFront 3.1, ni
même Sun CC 4.2, ni apparamment (mais je ne suis pas au travail pour
vérifier à 100%) dans VC++ 5.0.

Mais c'est une modification assez anodine, qui ne doit pas jouer sur
d'autres choses. Je m'attendrais donc bien que tout compilateur
sortie depuis son adoptation l'implémente. (Il n'y a pas de
problème de compatibilité avec du code existant pour freiner.)

|> | mais transforment le type de main en void si aucune valeur de
|> | retour n'est spécifiée (c'est le cas de visual C++ 5

|> Si Visual C++-5 decide que c'est que comprend son environnement
|> d'éxécution, alors aourter return 0 ne change rien.

Je crois que le comportement de VC++ 5.0, c'est ce que c'était le
comportement de tous les compilateurs il y a un certain temps : si main
est déclaré à renvoyer int, et on arrive à la fin de la
fonction sans instruction de return, c'est un comportement indéfini,
mais dans les fait, on renvoie une valeur aléatoire (ce qu'il y avait
par hazard dans le régistre EAX à ce moment, en fait).

VC++ permet aussi void main(). Je ne sais pas pourquoi ; je crois que
l'intention était qu'on devait s'en servir quand on n'arrive jamais
à la fin de main, parce qu'on aurait toujours appelé exit()
quelque part avant. Ce qui est certain, c'est qu'au moins dans un
fenêtre DOS ou dans un fichier .bat, la valeur de retour de main sous
Windows fonctionne de la même façon, exactement, que sous Unix.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Gabriel Dos Reis
James Kanze writes:

| Gabriel Dos Reis writes:
|
| |> Anthony Fleury writes:
|
| |> | Au passage, le return 0; est vraiment une habitude à prendre
| |> | car certains compilateurs assez anciens n'ajoutent pas ce return
| |> | 0;
|
| |> Je veux des noms.
|
| |> Ce comportement a toujours fait partie de C++ depuis des lustres.
|
| Là, tu m'apprends quelque chose. Mais peut-être ça dépend de
| ce qu'on considère « des lustres ». De toute façon, je
| n'arrive pas à trouver ce comportement dans l'ARM, et d'après mes
| souvenirs, ce n'était pas implémenté dans CFront 3.1, ni
| même Sun CC 4.2, ni apparamment (mais je ne suis pas au travail pour
| vérifier à 100%) dans VC++ 5.0.

Je me souviens distinctement que Sun CC 4.0 le supportait.

Je n'ai pas mon ARM à la maison alors j'ai regardé dans le D&E
où je suis arrivé à trouver des examples qui remontent au moins à
1991. J'ai donc demandé à l'auteur qui m'a répondu qu'il avait bien un
code spécial dans CFront qui tenait compte de ce cas. La raison pour
laquelle il a fait cela est qu'il y avait beaucoup de programmes C
existants qui ne faisaient pas le return à la fin de main (parce que
nombre de compilateurs C ne vérifiaient pas l'absence de return).

| Mais c'est une modification assez anodine, qui ne doit pas jouer sur
| d'autres choses. Je m'attendrais donc bien que tout compilateur
| sortie depuis son adoptation l'implémente. (Il n'y a pas de
| problème de compatibilité avec du code existant pour freiner.)

Mais le comportement remonte quand même aux années de CFront.

| |> | mais transforment le type de main en void si aucune valeur de
| |> | retour n'est spécifiée (c'est le cas de visual C++ 5
|
| |> Si Visual C++-5 decide que c'est que comprend son environnement
| |> d'éxécution, alors aourter return 0 ne change rien.
|
| Je crois que le comportement de VC++ 5.0, c'est ce que c'était le
| comportement de tous les compilateurs il y a un certain temps : si main

Dans le cas spécifique sous la main, VC++ 5.0 faisait ce que le
système d'éxécution faisait : il s'en foutait. Je ne sais pas si cela
a changé récemment.

| VC++ permet aussi void main(). Je ne sais pas pourquoi ; je crois que

Ce n'est pas interdit ; et si cela est conforme à l'environnement
d'éxécution pourquoi ne devrait-il pas le permettre ?

-- Gaby
Avatar
Gabriel Dos Reis
Anthony Fleury writes:

| Au passage, vu que je n'ai que The C++ Programming Langage et non la norme,
| tout ce qui se dit dans ce thread est explicitement inscrit dans la norme ?

Oui.

-- Gaby
Avatar
Gabriel Dos Reis
James Kanze writes:

| Anthony Fleury writes:
|
| |> Pour précision aussi, la déclaration
| |> main()
|
| |> contenait de toute facon une erreur. Si la personne ne veut renvoyer
| |> aucune valeure dans main, il faut écrire void main() car le type
| |> de retour doit obligatoirement être précisé pour une
| |> fonction, dans le cas ou on ne retourne rien c'est void, et il n'y a
| |> pas de type int implicite en C++ comme il y a pu y avoir en C, ou
| |> cette définition était équivalente à int main().
|
| Il est impossible dans le C++ standard à ne revoyer aucune valeur de
| main.

Comment un programme C++ fait pour savoir qu'aucune valeur n'est
renvoyée ? :-)

-- Gaby
Avatar
James Kanze
Gabriel Dos Reis writes:

|> James Kanze writes:

|> | Gabriel Dos Reis writes:

|> | |> Anthony Fleury writes:

|> | |> | Au passage, le return 0; est vraiment une habitude à
|> | |> | prendre car certains compilateurs assez anciens n'ajoutent
|> | |> | pas ce return 0;

|> | |> Je veux des noms.

|> | |> Ce comportement a toujours fait partie de C++ depuis des
|> | |> lustres.

|> | Là, tu m'apprends quelque chose. Mais peut-être ça
|> | dépend de ce qu'on considère « des lustres ». De toute
|> | façon, je n'arrive pas à trouver ce comportement dans l'ARM,
|> | et d'après mes souvenirs, ce n'était pas implémenté
|> | dans CFront 3.1, ni même Sun CC 4.2, ni apparamment (mais je ne
|> | suis pas au travail pour vérifier à 100%) dans VC++ 5.0.

D'abord, pour en être sûr : on parle du fait que d'arriver à la
fin de la fonction main équivaut un « return 0 » ? Moi, j'ai
des vagues souvenirs d'avoir entendu dans la normalisation, en tant
qu'extension, et proposé assez tardivement en fait. Mais les
souvenirs sont très, très vagues -- c'était à un époque
où je n'étais pas très actif dans la normalisation -- et
peuvent donc être erronés.

|> Je me souviens distinctement que Sun CC 4.0 le supportait.

À vrai dire, si tu le dis...

Dans la mésure où je n'en avais jamais entendu parlé, je ne
l'ai pas essayé. S'il l'avait, c'était comme feature non
documenté.

|> Je n'ai pas mon ARM à la maison alors j'ai regardé dans le
|> D&E où je suis arrivé à trouver des examples qui remontent
|> au moins à 1991.

Je n'ai pas fouilli partout -- mais en cherchant sous « main » et
sous « return » dans l'indice ne m'a donné rien.

|> J'ai donc demandé à l'auteur qui m'a répondu qu'il avait
|> bien un code spécial dans CFront qui tenait compte de ce cas. La
|> raison pour laquelle il a fait cela est qu'il y avait beaucoup de
|> programmes C existants qui ne faisaient pas le return à la fin de
|> main (parce que nombre de compilateurs C ne vérifiaient pas
|> l'absence de return).

Je en comprends bien la raison. C'est pour caché des erreurs de la
part des programmeurs qui ne savent pas programmer :-). C'est simplement
que j'ai les doutes sur la date que c'était introduite.

|> | Mais c'est une modification assez anodine, qui ne doit pas jouer
|> | sur d'autres choses. Je m'attendrais donc bien que tout
|> | compilateur sortie depuis son adoptation l'implémente. (Il n'y
|> | a pas de problème de compatibilité avec du code existant
|> | pour freiner.)

|> Mais le comportement remonte quand même aux années de CFront.

J'attends en voir une documentation. Je ne me rappelle pas de l'avoir
vue dans les documents de l'époque. Mes collègues à l'époque
ne le connaissaient pas non plus.

|> | |> | mais transforment le type de main en void si aucune valeur
|> | |> | de retour n'est spécifiée (c'est le cas de visual C++
|> | |> | 5

|> | |> Si Visual C++-5 decide que c'est que comprend son
|> | |> environnement d'éxécution, alors aourter return 0 ne
|> | |> change rien.

|> | Je crois que le comportement de VC++ 5.0, c'est ce que c'était
|> | le comportement de tous les compilateurs il y a un certain temps :
|> | si main

|> Dans le cas spécifique sous la main, VC++ 5.0 faisait ce que le
|> système d'éxécution faisait : il s'en foutait. Je ne sais
|> pas si cela a changé récemment.

S'en foutre, c'est ce que j'appelle LE comportement type d'un
compilateur en cas d'un comportement indéfini:-).

En fait, je crois qu'on est d'accord ici. Moi, j'ai formulé en termes
de la norme, et toi, tu as exprimé la vérité tout simple:-).

|> | VC++ permet aussi void main(). Je ne sais pas pourquoi ; je crois
|> | que

|> Ce n'est pas interdit ; et si cela est conforme à l'environnement
|> d'éxécution pourquoi ne devrait-il pas le permettre ?

AMHA, ça doit être permis (comme extension). Seulement, la norme
C++ dit clairement qu'il ne l'est pas, et exige un diagnostique.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
1 2 3