420

Ah... J'avais mal compris cette différence entre membre static de la classe et variable globale, merci bien. smile

ps -> j'essaye de comprendre le principe et de refaire derrière, donc pas de recopier bêtement, spour ça. Et en revenant sur ton post, j'ai pas vu là où je m'étais trompé, à cause de cette confusion justement. Merci bien, maintenant j'ai compris. happy

421

je comprends bien, ya pas de problème ^^
ça m'empechera pas de refaire la remarque trinon
avatar

422

squalyl (./360) :
Nil : les références java, perso je vois ça comme des HANDLE de nos TIs ^^

D'ailleurs, .Net appelle ça des handles. Ça ne se voit pas dans la documentation des fonctions (où c'est surtout appelé "référence"), mais dès qu'on programme en C++/CLI, c'est "handle on the GC heap". Il y a aussi la classe valeur System.Runtime.InteropServices.GCHandle, utilisée dans certaines interactions avec le code non-managé...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

423

Marrant. Ca veut dire que la mémoire peut être réorganisée de façon transparente? Comment ça se passe avec le code unsafe à ce moment? Si tout ton code est unsafe et que tu gardes un pointeur global je me demande comment il s'en sort... smile
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

424

si c'est une référence elle change avec tlm, si c'est un pointeur réel suffit d'un refcounter et d'empêcher les objets "unsafe" de se balader.

425

Yay Zephyr tes exceptions dans les méthodes/constructeurs ça déchire tout !
Ca clarifie énormément le code, vu que tu passes plus 4 lignes sur 5 à vérifier que ce que tu viens de faire a marché. top
    try
    {
        Date Date(29, 2, 2001);
        Date.printDate();
    }
    catch (DateException & e)
    {
        std::cout << e.getErrorString();
    }

• Folco tout content d'avoir appris ça, merci Zeph pour sa patience et sa pédagogie grin

426

Au fait, bug report: la longueur du mois de février n'est pas (Year%4 ? 28 : 29) mais ((Year%4) || (!(Year%100) && (Year%400)) ? 28 : 29).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

427

Pas terrible ton DateException&, ça veut dire que tu dois faire throw (*new DateException), donc qu'il faut la libérer en bas, ou alors que tu lances une exception que tu as déclaré statiquement... (là ok, mais tu ne peux pas mettre de texte)
N'oublie pas que si tu fais throw DateException(...) tu vas créer un objet sur la pile, et qu'il sera détruit à la fin de la fonction appelante (donc au passage dans le catch).
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

428

Brunni (./423) :
Marrant. Ca veut dire que la mémoire peut être réorganisée de façon transparente? Comment ça se passe avec le code unsafe à ce moment? Si tout ton code est unsafe et que tu gardes un pointeur global je me demande comment il s'en sort... smile

On voit mieux les détails en C++/CLI, qui utilise des pin_ptr<> pour empêcher un objet managé de bouger lors de la réorganisation (et je crois que c'est un wrapper de GCHandle::Alloc(GCHandleType::Pinned)).

En fait, le GC de Java et .Net a deux fonctions, libération automatique et réorganisation, tandis que le système d'une TI68k n'a que la seconde.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

429

Brunni (./427) :
Pas terrible ton DateException&, ça veut dire que tu dois faire throw (*new DateException), donc qu'il faut la libérer en bas, ou alors que tu lances une exception que tu as déclaré statiquement... (là ok, mais tu ne peux pas mettre de texte)
N'oublie pas que si tu fais throw DateException(...) tu vas créer un objet sur la pile, et qu'il sera détruit à la fin de la fonction appelante (donc au passage dans le catch).

J'ai du mal à comprendre ce que tu veux dire, ici. Une exception, même attrapée par référence, n'est détruite qu'à la fin du passage dans le catch() (plus d'infos sur demande). Par contre, je serais du genre à l'attraper par référence const, personnellement.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

430

./428> Heu j'avoue que je comprends pas. Par défaut les objets n'ont pas besoin d'être "pinned" non? C'est quand on les référence avec un pointeur qu'ils doivent le devenir confus
./429> J'avais souvenir qu'on avait appris à l'école que les objets lancés n'étaient pas supprimés dans le catch, et ça me semblait logique étant donné que le langage est emmerdé pour libérer dans des cas comme ça:
try {
    // Fonction qui lève une exception d'un certain type "par valeur"
    fonction();
}
catch (...) {
    // Comment savoir quoi libérer? Et même combien d'octets restaurer sur la pile?
    // Même problème si on attrape ici un objet superclasse du type en question et que le destructeur n'est pas virtuel
}
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

431

Brunni (./427) :
Pas terrible ton DateException&, ça veut dire que tu dois faire throw (*new DateException), donc qu'il faut la libérer en bas, ou alors que tu lances une exception que tu as déclaré statiquement... (là ok, mais tu ne peux pas mettre de texte)N'oublie pas que si tu fais throw DateException(...) tu vas créer un objet sur la pile, et qu'il sera détruit à la fin de la fonction appelante (donc au passage dans le catch).

Non et non ^^

La syntaxe utilisée par Folco lui permet de faire un "throw DateException" sans new, l'exception sera donc recopiée sur la pile et sera catchée par un "catch (DateException& e)" sans qu'il soit besoin de libérer quoi que ce soit explicitement.

En revanche l'ajout du const est une très bonne suggestion smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

432

Pour "pinned": On est d'accord. On commence avec un "handle managé", et on utilise un pin_ptr dès qu'on a besoin d'un pointeur non-managé sur les données.

Pour try/catch, il faut voir le vrai fonctionnement en C++ (sous Visual, du moins) au niveau de la pile. ça marche comme ça:
1. L'objet lancé est créé.
2. L'exception est levée, le pointeur de pile ne remonte pas
3. Les destructeurs de tous les objets créés dans le try (sauf l'exception elle-même) sont appelés, mais le pointeur de pile ne remonte toujours pas.
4. Le catch est exécuté
5. Le pointeur de pile remonte.

Je suppose que l'objet lancé est détruit entre 4 et 5.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

433

Okay merci c'est cohérent hehe donc mes souvenirs étaient faux, sorry.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

434

j'ai vérifié, et ça a l'air d'être ce qui se passe. l'objet est crée sur la pile de la fonction levant une expression, et l'objet n'est détruit que dans le dernier catch ne renvoyant pas l'exception
avatar

435

Merci à tous, et merci pour le const. smile
Je les comprends pas tous encore ces consts, mais j'en mets quand je peux. grin

Link : oué, j'en parlais hier avec Zephyr (mais je me suis mal exprimé).
On pourrait croire que avant d'arriver dans le catch, l'objet automatique créé par l'exception est détruit, comme n'importe quel objet automatique en sortie de scope.
Mais la norme précise que le catch, même lors d'un passage par référence, doit recevoir une copie de l'objet lancé.
Il n'est donc pas libérable entre le try et le catch, mais bien après le catch.
voilà, c'est ce que j'ai à peu près compris de mon bouquin.

Par contre, ça m'amène une question : quel avantage de passer une valeur d'exception par référence si le handler en reçoit de toute façon une copie ?

436

il ne reçoit pas forcément une copie. quand j'ai fait mon test, avec visual studio 2008, la catch a bien reçu l'objet d'origine sans qu'il y ait de copie. En Regardant les adresses on peut voir que l'objet était encore dans la pile de la fonction lançant l'exception
avatar

437

quel avantage de passer une valeur d'exception par référence si le handler en reçoit de toute façon une copie ?

Je dirais éviter les copies partielles (classe fille vers classe mère).

Par ailleurs, dans les compilos où la RTTI est désactivable, soit le switch RTTI-off ment, soit les exceptions ne marchent pas; car l'identification d'exceptions C++ nécessite de la RTTI, on ne peut (à ma connaissance) la faire en statique.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

438

Ben ça semble logique, rien ne lui interdit de dire que la copie de catch est ce que try a libéré... et donc au final ne rien faire, c'est évidemment optimal. 'fin, je vois ça comme ça.
Je pense que vu la tournure de M. Delannoy (mon prof embarrassed), une copie signifie une valeur, et nom une simple référence ou un pointeur.

Mais bon ça change rien, les exceptions, saylebien. (enfin pour le moment, je me suis pas encore pris de retour de baton fear)

439

Disons que je suis contre les exceptions "abusives", c'est-à-dire les exceptions pour les cas non-exceptionnels. Typiquement, en java/.Net, j'aimerais pouvoir tester l'ouverture d'un fichier sans avoir systématiquement une exception. On a bien ça pour les dictionnaires en .Net (choix entre l'opérateur[] qui lance une exception et la méthode TryGetValue() qui n'en lance pas), mais il n'y a jamais d'équivalent pour les fichiers...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

440

Tiens, ma classe DateException, je l'ai déclarée comme ça :
class DateException
{
    public:

    DateException(const std::string & error);
    ~DateException();
    std::string getErrorString();


    private:

    std::string m_ErrorString;
};

C'est bien ou pas ? J'ai pas eu l'impression que c'était dans vos idée de faire les choses...

441

Personnellement j'aurais fait pareil
avatar

442

Kevin Kofler (./426) :
Au fait, bug report: la longueur du mois de février n'est pas (Year%4 ? 28 : 29) mais ((Year%4) || (!(Year%100) && (Year%400)) ? 28 : 29).

Tu veux dire que les années multiples de 100 et de 400 ne sont pas bisextiles ? ya un truc que je comprends pas je crois...

443

Link (./439) :
Disons que je suis contre les exceptions "abusives", c'est-à-dire les exceptions pour les cas non-exceptionnels. Typiquement, en java/.Net, j'aimerais pouvoir tester l'ouverture d'un fichier sans avoir systématiquement une exception. On a bien ça pour les dictionnaires en .Net (choix entre l'opérateur[] qui lance une exception et la méthode TryGetValue() qui n'en lance pas), mais il n'y a jamais d'équivalent pour les fichiers...
Bien sur que si...
L'exception est là pour te dire que t'as fait un truc qu'il fallait pas faire ou qu'il s'est produit un truc qui n'aurait [peut-être] pas du se produire. Si tu voulais vérifier que le fichier existe, en .NET tu as File.Exists ... Si tu demandes d'ouvrir le fichier, le système ne fait que ce que tu lui as demandé de faire: ouvrir le fichier, c'est normal qu'il te balance un truc à la gueule si ça ne se passe pas comme prévu. Soit l'ouverture se passe bien, soit elle se passe mal, et c'est bien au delà d'une simple question de "la clef est présente"/"la clef n'existe pas" dans le cas des dictionnaires.
Les exceptions sont faites pour être utilisées dans des cas exceptionnels, et la BCL a été relativement bien conçue de ce côté. Si ton programme s'appuie sur des cas exceptionnels pour fonctionner, le tort en vient probablement à ton programme. (Y'a les cas [exceptionnels] que tu ne peux pas détecter simplement, comme le lecteur réseau qui ne répond pas, la connexion réseau qui a laché, un programme qui a ouvert le même fichier avant ... Pour le reste ce sont des cas que tu pouvais gérer autrement, c'était à toi de le faire.)

Folco > Tu devrais utiliser des références pour tes string, autrement tu provoques une copie à chaque appel de constructeur ou autre... sad
Typiquement, prend en appel du constructeur un const std::string&, puis copie le dans un std::string à l'intérieur de ta classe, puis retourne un const std::string& sur cet objet pour le getErrorString();
class DateException
{
private:
    std::string m_ErrorString;

public:
    DateException(const std::string& error) : m_ErrorString(error) { }
    ~DateException() { }
    const std::string& getErrorString() const { return m_ErrorString; }
};
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

444

Folco: regarde calendrier grégorien sur wikipedia, les années divisibles par 4 sont bissextiles SAUF les années divisibles par 100 MAIS les années divisibles par 400 sont quand même bissextiles.

Sinon je suis content de faire du java et pas du pasNet ou du C++, c'est quand même sacrément plus clair et bien mieux spécifié, surtout au niveau des exceptions. bref, osef.

445

Merci squalyl, j'avais donc compris à l'envers grin

GoldenCrystal : ok, merci, c'est fait. smile

446

Link (./439) :
Disons que je suis contre les exceptions "abusives", c'est-à-dire les exceptions pour les cas non-exceptionnels. Typiquement, en java/.Net, j'aimerais pouvoir tester l'ouverture d'un fichier sans avoir systématiquement une exception. On a bien ça pour les dictionnaires en .Net (choix entre l'opérateur[] qui lance une exception et la méthode TryGetValue() qui n'en lance pas), mais il n'y a jamais d'équivalent pour les fichiers...

Un truc du genre ça peut aller non?
File f = new File("/tayst");
if (f.canRead()) {
    FileInputStream fis = new FileInputStream(file);
    ...
}
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

447

non c'est le constructeur qui throw l'exception, que tu testes ou pas avant.

pour que ton truc soit utile il faudrait que le constructeur lance une sous classe de RuntimeException au lieu d'une IOException qu'il faut catcher.

448

En fait ce qui me fait suer, c'est que les classes de désérialisation XML ne font pas appel à File.Exists() lorsqu'elles recherchent un assembly de désérialisation tout cuit... Et le debugger de Visual ne connait pas la notion d'"exception interceptée avant d'atteindre du code débogable".

Le développeur se mange quatre FileNotFoundExceptions dans les dents avant de pouvoir passer aux choses sérieuses!
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

449

Ouep il faut le "throws" bien sûr et le rattraper quelque part (de toute façon t'as 1000 trucs qui peuvent lever une IOException happy).
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

450

bon, je m'en sort pas avec les stringstream...

J'ai écrit ça :
std::cout << "Anniversaire : " << m_BirthdayDate.stringDate() << std::endl;
Sachant que stringDate() renvoie une std::stringstream, et que je veux la renvoyer sur std::cout.

Un objet Contact contient plusieurs instances de Date.
Je tiens à ce que ce soit la classe Date qui crée la chaine de caractères voulue, et que ce soit la classe Contact qui l'affiche, sans aller récupérer les éléments de l'objet Date un par un via des accesseurs. Je ne sais pas comment m'y prendre...