none
tester si un objet est initialisé RRS feed

  • Question

  • bonjour

    J'ai besoin de tester si un objet est déjà initialisé

    J'ai essayé deux expressions

    if( objOldWord == NULL)

    if(objOldWord Is Nothing)

    les deux sont refusée.

    Qui connaitrait la bonne syntaxe?


    Jean Noël Martin

    lundi 9 décembre 2013 15:24

Réponses

Toutes les réponses

  • if( objOldWord == NULL), cela ne fonctionne que si objOldWord est un pointeur.

    if(objOldWord Is Nothing), c'est du VB.NET pas du C++/CLI

    Un objet, sauf utilisation de Design Pattern de création particulier (Builder, Factory Method,...), est automatiquement initialisé.

    Pourquoi avez-vous des doutes sur le caractère initialisé de l'objet objOldWord ?


    Paul Bacelar, Ex - MVP VC++

    lundi 9 décembre 2013 15:51
    Modérateur
  • je suis sur la consolidation du test des titres:

    J'ai observé que sur deux mots consécutif, le premier pouvait un être un texte normal et le deuxième un mot de titre. Pourquoi, mystère. mais j'ai donc besoin d'un objOldWord pour savoir ou j'en suis dans ce processus, et j'ai besoin au départ de savoir si il pointe nulle part ou si il pointe sur quelque chose d'existant


    Jean Noël Martin

    lundi 9 décembre 2013 17:44
  • Bonjour,

    J'ai observé que sur deux mots consécutif, le premier pouvait un être un texte normal et le deuxième un mot de titre.
    Qu'elle est le rapport à votre question ?

    Pourquoi, mystère. mais j'ai donc besoin d'un objOldWord pour savoir ou j'en suis dans ce processus, et j'ai besoin au départ de savoir si il pointe nulle part ou si il pointe sur quelque chose d'existant
    Si vous avez des doutes sur ce que fait votre code, cela indique que vous ne maitrisez pas votre code.........

    Lorsque vous détruisez un objet (via un pointeur comme vous l'a fait remarqué M. BACELAR), il suffit de mettre les pointeurs qui référencie cet objet à NULL. Ainsi vous pouvez plustard savoir si l'objet pointé existe ou alors il a été détruit...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    lundi 9 décembre 2013 23:44
    Modérateur
  • Je vous met le code si dessous, c'est une séquence assez simple:

                                            iSize = ulTotalNbWords;
    					iSize += 1;
    					iTitle = 0;
    					j = iSize;
    					while( j < iSize + 2)
    					{
    						objWord = (Word::Range^)objWords[j];
    321						if( objOldWord == NULL)
    							objOldWord = objWord;
    						if( objWord->Case == Word::WdCharacterCase::wdTitleSentence /*&& objOldWord->Case != Word::WdCharacterCase::wdNextParagraph*/)
    							iTitle += 10;
    						else
    							iTitle -= 2;
    						if(objWord->Font->Size < 13)
    							iTitle -= 10;
    						else
    							iTitle += 2;
    						j++;
    						objOldWord = objWord;
    					}
    					if( iTitle > 0)
    						bTitle = true;
    					else
    						bTitle = false;


    Jean Noël Martin

    mardi 10 décembre 2013 02:49
  • en temporaire pour  pouvoir tester( mais ce n'est pas satisfaisant j'ai codé:

                                                    try
    						{
    							if( objOldWord->Case ==  Word::WdCharacterCase::wdNextCase)
    								bMin = true;
    						}
    						catch( ...)
    						{
    							objOldWord = objWord;
    						}


    Jean Noël Martin

    mardi 10 décembre 2013 07:48
  • Oulà, vous êtes un adepte de la pensé magique ?

    J'ai jamais vu autant de "magic number" dans un code aussi court.

    Des +1 des +2 des +10 des <13 ...

    Utilisez des constantes avec des noms explicitent.

    C'est difficile pour vous et complètement imbitable pour nous et pour vous dans 6 mois.

    Donc laissez ces pensés magiques de objOldWord et autres balivernes, faites un code simple et directe et si ça plante, le débuggeur vous indiquera le type d'exception et le motif de l'erreur et on pourra vous aidez si nécessaire.


    Paul Bacelar, Ex - MVP VC++

    mardi 10 décembre 2013 09:14
    Modérateur
  • J'ai quand même besoin de la réponse à la simple question: y a t-il un  moyen similaire a la solution de Basic de tester si un pointeur est initialisé et de prendre un décision en conséquence. Je sais que ma solution provisoire n'est pas pérenne.

    Jean Noël Martin

    mardi 10 décembre 2013 15:19
  • Comme je l'ai déjà dis, sauf utilisation de Design Pattern de création avancé, un objet est toujours "initialisé".

    Si vous utilisez des pointeurs à la place de référence à des objets, la réponse de Gilles indique la marche à suivre pour que le test "if (pWord==NULL){...".

    Attention, votre code ne manipule pas des pointeurs mais des références/pointeurs vers des objets managées (Word::Range^), il faut utilisé nullptr et non NULL dans ce cas de figure. "if (objWord == nullptr) {...".

    L'utilisation d'un cast à la C préhistorique est extrêmement suspecte. Ce n'est pas faut mais c'est un syntaxical sugar pour un safe_cast<Word::Range^>, il faut savoir que c'est un "nullptr" qui est renvoyé si le type dynamique de l'objet n'est pas compatible avec Word::Range^.

    Votre tableau objWords a donc un problème de typage, ou vous n'avez pas compris son utilisation.

    S'il ne peut contenir que des Word::Range^d, alors le cast devrait être inutile, sinon, vous faites n'importe quoi avec des objets qui ne sont pas des Word::Range^.

    Pour l'utilisation de Design Pattern avancé, ce type d'objet a des méthodes ou des attributs de type IsValid ou IsInitalized et lance des exceptions explicites en cas d'utilisation trop anticipée.


    Paul Bacelar, Ex - MVP VC++

    mardi 10 décembre 2013 16:16
    Modérateur
  • Merci: C'était la réponse que j'attendais. j'ai donc codé if( objOldWord == nulptr) et c'est accepté.

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 mercredi 11 décembre 2013 01:17
    mercredi 11 décembre 2013 01:17