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 

etudiant--> help
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
elekis
Guest





PostPosted: Sat Mar 06, 2004 1:55 pm    Post subject: etudiant--> help Reply with quote



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< cout <
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 <
for(p = tete->next;p!=NULL;p=p->next)
cout< 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++
Back to top
Anthony Fleury
Guest





PostPosted: Sat Mar 06, 2004 3:25 pm    Post subject: Re: etudiant--> help Reply with quote



elekis wrote:

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

main()
int main() plutot


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

Et le "supprime"...

Quote:

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

}

Le comportement que obtenu est des plus normal.
Tu es d'accord que ta dernière boucle va se faire jusqu'à ce qu'elle
rencontre un pointeur NULL, c'est à dire que ta chaine soit arrivé à la
fin. Or, ce NULL n'est rencontré qu'après affichage de ton dernier élement
que tu viens de supprimer. Par chance, tu as fait un delete et l'affichage
juste après donc la mémoire n'a pas bougé, mais en clair là tu lis dans une
zone mémoire qui ne t'appartient plus. En clair, dans ce cas c'est comme si
ta liste chainée n'avait pas d'élement final et donc tu vas lire en mémoire
jusqu'à un avoir de la chance comme ici ou te prendre un SIGSEGV.

lorsque tu supprimes ton pointeur p, il te faut donc replacer la fin de ta
liste. En clair, ton avant dernier élement ne doit plus pointer sur le
dernier qui sera supprimé mais sur NULL.

pour que ce soit plus facile à faire, faut lire ta liste avec un coup
d'avance, pour te trouver sur le bon pointeur (l'avant dernier) et
supprimer le suivant d'où tu te trouves :

p = tete;

if(!p) {
// pas de liste...
}

else if(!p->next) { // un seul élement
delete p;
p = NULL;
}

else {
for(p = tete;p->next->next !=NULL ;p=p->next);
// atteint l'avant dernier élement...
delete p->next;
p->next = NULL;
}

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

Back to top
M. B.
Guest





PostPosted: Sat Mar 06, 2004 3:33 pm    Post subject: Re: etudiant--> help Reply with quote



D'abord 'delete' n'est pas une fonction mais un
operateur du langage.

Ca n'efface pas la memoire, ca la libere. Apres un 'delete',
elle est concideree comme libre par le systeme d'exploitation
pour une allocation ulterieure.

Ton dernier element me semble bien desalloue (et pas effacer !).

Comme tu lis juste derriere le contenu de la memoire liberee, son
contenu n'a pas change et tu continues a lire la valeur de l'element
supprime.

Plus grave : ton avant-dernier element pointe a present vers un element
qui n'existe plus, meme si au moment ou tu lis, les valeurs sont
toujours en memoire.

Lorsque tu detruis un element de la liste, il faut mettre a 'NULL'
le champ 'next' de l'element précédent.

MB

"elekis" <jjabon (AT) hotmail (DOT) com> a écrit dans le message de news:
4049d827$0$324$ba620e4c (AT) news (DOT) skynet.be...
Quote:
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< cout <
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 <
for(p = tete->next;p!=NULL;p=p->next)
cout< 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++



Back to top
Manuel
Guest





PostPosted: Sat Mar 06, 2004 3:41 pm    Post subject: Re: etudiant--> help Reply with quote

"elekis" <jjabon (AT) hotmail (DOT) com> a écrit :
Quote:
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:

"private: " serait bien mieux ici

Quote:
elem* next;
int info;
public:
elem(int);
};

C'est mieux d'encapsuler les données en général.

Quote:
elem::elem(int a)
{
info = a;
next = NULL;
}
main()

int main() // on le dira jamais assez ;-)

Quote:
{
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< cout <
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 <

Il est bel et bien supprimé et tenter d'accéder à sa mémoire
est une erreur (undefined behavior). De plus, le pointeur
"next" de l'élément précédent pointe sur cette mémoire.
Cette classe est encore incomplète... et dangereuse.
Pourquoi ne pas utiliser std::list<> ?

Quote:
for(p = tete->next;p!=NULL;p=p->next)
cout< cout << endl;

}


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


Il semble que la liste ne soit pas modifiée mais c'est une illusion.

Quote:

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

merci

a++


--

- Manuel
to reply, swap the name with the domain.



Back to top
farid bouzemarene
Guest





PostPosted: Sat Mar 06, 2004 8:15 pm    Post subject: Re: etudiant--> help Reply with quote

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Manuel wrote:
Quote:
"elekis" <jjabon (AT) hotmail (DOT) com> a écrit :

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:


"private: " serait bien mieux ici


elem* next;
int info;

public:

elem(int);
};


C'est mieux d'encapsuler les données en général.


elem::elem(int a)
{
info = a;
next = NULL;
}
main()


int main() // on le dira jamais assez ;-)


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


Il est bel et bien supprimé et tenter d'accéder à sa mémoire
est une erreur (undefined behavior). De plus, le pointeur
"next" de l'élément précédent pointe sur cette mémoire.
Cette classe est encore incomplète... et dangereuse.
Pourquoi ne pas utiliser std::list<> ?


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

}


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



Il semble que la liste ne soit pas modifiée mais c'est une illusion.


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

merci

a++



pourquoi int main()???


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iQCVAwUBQEoxfdlroYU295zBAQIqEwP/ZoMGfbOl1wMqlSleY0aO9JaEG/trAbxt
StFfLM12T0IKHEXGQ8osYMMWrFrb3Durw/7tSVY2m52Xiyoq56Lav+wSz286hTlR
BT+C8gDUr/72ZimJDBMnpTy8/y9jZuHYKXJq087pSr5Ml26ITka8At+0ogd8yQdr
foevKyRaIBI=
=iCpS
-----END PGP SIGNATURE-----

Back to top
Anthony Fleury
Guest





PostPosted: Sat Mar 06, 2004 9:49 pm    Post subject: Re: etudiant--> help Reply with quote

farid bouzemarene wrote:


Quote:
pourquoi int main()???

Euh c'était peut etre pas la peine de citer tout le message pour rajouter
une ligne ? :)

Enfin bref, pourquoi int main() ? Peut-être parce que c'est la version
conseillée par la norme ? En effet il y a deux versions de main
acceptables :

int main()
et
int main(int argc, char** argv) ou équivalent pour le char** (notamment
char* []).

Ce qui fait que main recoit les arguments de la ligne de commande ou les
ignore, et renvoie une valeur au système d'exploitation disant comment
l'execution du programme s'est déroulée (cette valeur est utilisée
notamment dans les systèmes unix où le shell permet d'enchainer les
commandes avec des et, des ou ou autre selon la valeur renvoyée par le
programme).

De plus, si aucune valeur n'est spécifiée en retour de main, le système
recoit EXIT_SUCCESS.

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().

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

Back to top
Manuel
Guest





PostPosted: Sat Mar 06, 2004 10:46 pm    Post subject: Re: etudiant--> help Reply with quote

"Anthony Fleury" <fleury_anthony (AT) hotmail_ (DOT) com> a écrit :
[...]
Quote:
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

Non! si on ne veut renvoyer aucune valeur, on écrit :

int main()
{
// bla bla et puis plus rien, pas de return à la fin.
}

En C++ le compilateur "ajoute" implicitement
return 0;

Mais c'est pas une bonne habitude à prendre, AMHA... ;-)

--

- Manuel
to reply, swap the name with the domain.



Back to top
Anthony Fleury
Guest





PostPosted: Sat Mar 06, 2004 11:12 pm    Post subject: Re: etudiant--> help Reply with quote

Manuel wrote:

Quote:
"Anthony Fleury" <fleury_anthony (AT) hotmail_ (DOT) com> a écrit :
[...]
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

Non! si on ne veut renvoyer aucune valeur, on écrit :

int main()
{
// bla bla et puis plus rien, pas de return à la fin.
}

En C++ le compilateur "ajoute" implicitement
return 0;

Mais c'est pas une bonne habitude à prendre, AMHA... ;-)


Hum je me suis mal exprimé surement, je voulais dire qu'une fonction en C++
doit avoir un type de retour quitte à ce que ce soit void.
En clair, f() { } n'est pas valide, il faut écrire void f() { }
Je voulais notifier que la notation main() n'a aucun sens en C++ standard,
une fonction devant avoir un type de retour, [alors que cette notation est
valide en C90]

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

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

Back to top
farid bouzemarene
Guest





PostPosted: Sat Mar 06, 2004 11:37 pm    Post subject: Re: etudiant--> help Reply with quote

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

ok ,
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
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iQCVAwUBQEpgp9lroYU295zBAQKDAgP9ExPUzdgb/BqDFkW1u0bQK2zzw32a1iRV
Xs/WX5Ee+Y7sf7ok1b/QbC0K9gQuc09TDjFk19GCfUBSmkV4uw+wAMOpiXgHzlq2
nkvHD/f2VyziuTiQ8qb+2UYxZ3mti28zHaYDYddSQPyuJ3KqnHZS965wiFN60+zb
HCb2N/nWxhE=
=D4OQ
-----END PGP SIGNATURE-----
Back to top
Manuel
Guest





PostPosted: Sat Mar 06, 2004 11:58 pm    Post subject: Re: etudiant--> help Reply with quote

"Anthony Fleury" <fleury_anthony (AT) hotmail_ (DOT) com> a écrit :

[...]
Quote:
valeure dans main, il faut écrire void main() car le type de retour
doit

Non! si on ne veut renvoyer aucune valeur, on écrit :

int main()
{
// bla bla et puis plus rien, pas de return à la fin.
}

En C++ le compilateur "ajoute" implicitement
return 0;

Mais c'est pas une bonne habitude à prendre, AMHA... ;-)


Hum je me suis mal exprimé surement, je voulais dire qu'une fonction en
C++
doit avoir un type de retour quitte à ce que ce soit void.
En clair, f() { } n'est pas valide, il faut écrire void f() { }

Absolument d'accord.

Quote:
Je voulais notifier que la notation main() n'a aucun sens en C++ standard,
une fonction devant avoir un type de retour, [alors que cette notation est
valide en C90]

....et je voulais juste souligner qu'un type de retour autre que "int" pour
la fonction "main" n'a aucun sens non plus en C++ standard.
Sinon, je suis d'accord avec ce que tu dis.

Quote:
Au passage, le return 0; est vraiment une habitude à prendre car certains

Toujours d'accord... je disais que c'est une mauvaise habitude de *ne pas*
retourner une valeur dans "main" et je trouve dommage que ce soit
facultatif.
J'aurais préféré que ce soit une erreur ou au pire un warning.

--

- Manuel
to reply, swap the name with the domain.



Back to top
Gabriel Dos Reis
Guest





PostPosted: Sun Mar 07, 2004 1:52 am    Post subject: Re: etudiant--> help Reply with quote

Anthony Fleury <fleury_anthony (AT) hotmail_ (DOT) com> writes:

Quote:
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.

Quote:
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.

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

???

-- Gaby

Back to top
Anthony Fleury
Guest





PostPosted: Sun Mar 07, 2004 9:42 am    Post subject: Re: etudiant--> help Reply with quote

Gabriel Dos Reis wrote:

Quote:
Anthony Fleury <fleury_anthony (AT) hotmail_ (DOT) com> 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()."

Quote:
| 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 Smile]

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

Back to top
James Kanze
Guest





PostPosted: Sun Mar 07, 2004 12:34 pm    Post subject: Re: etudiant--> help Reply with quote

farid bouzemarene <fbouzemarene (AT) free (DOT) fr> writes:

Quote:
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:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93

Back to top
James Kanze
Guest





PostPosted: Sun Mar 07, 2004 12:37 pm    Post subject: Re: etudiant--> help Reply with quote

Anthony Fleury <fleury_anthony (AT) hotmail_ (DOT) com> writes:

Quote:
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:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93

Back to top
James Kanze
Guest





PostPosted: Sun Mar 07, 2004 12:40 pm    Post subject: Re: etudiant--> help Reply with quote

Anthony Fleury <fleury_anthony (AT) hotmail_ (DOT) com> writes:

Quote:
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:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93

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.