IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

un passage de param�tre qui �choue


Sujet :

Visual C++

  1. #21
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Oh mon dieu, ce code est une horreur de "C compil� en C++", avec un m�lange de char* et de new/delete et nombre de ces derniers devraient en fait �tre delete[] vu que c'est de l'effacement de tableaux.
    Et en plus, il y a des variables globales (comme OldBuffer).

    Mais au moins, j'ai pu confirmer que du moins pour StartStateTagger(), le premier param�tre est un tableau de numSen cha�nes de caract�res; la fonction ne modifie pas les cha�nes point�es, mais modifie les pointeurs en les rempl�ant par des pointeurs de buffers allou�s devant �tre d�sallou�s avec delete[] (ou peut-�tre free(), d�pendant du contenu de la fonction perl_split()).

    Quant � la fonction FinalStateTagger(), elle est carr�ment � jeter, car elle retourne un pointeur vers une variable locale!

    Mais l� aussi, buf est cens� �tre un tableau de numSen cha�nes de caract�res, et cette fonction-l� ne modifie jamais ni les cha�nes point�es ni les pointeurs (le param�tre devrait donc �tre d�clar� comme char const * const *buf, surtout si le code est compil� en C++ ou compil� sous Visual Studio).


    ...Mais franchement, � ta place je n'utiliserais pas ce code, il est horrible, buggu�, peu comment� et sa gestion de la m�moire est indigne du langage C++. N'importe qui "connaissant" vraiment le C++ s'en serait rendu compte au premier coup d'�il. Mon conseil: Balance ce code � la corbeille, vide-l�, apprends C# (qui pardonne mieux les erreurs que C ou C++) et cherche sur le web un Brill Tagger en C#, �a marchera beaucoup mieux.

    ...Ou un Brill Tagger en vrai C, ou en vrai C++. N'importe quoi sauf cet hybride impie.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  2. #22
    Membre extr�mement actif
    Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    1 022
    D�tails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 1 022
    Par d�faut bonjour
    Les new et delete sont de moi, de m�me les fonctions _s ainsi que la fin du FinalStateTagger
    je ne suis pas pr�t � reprendre ce code qui a march� sur la pr�c�dente version. mon probl�me est de faire marcher BTaggerc en conformit� avec les types de Brill
    plus pr�cis�ment c'est la s�quence suivante qui est � faire marcher
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    		buffe = new char*();
    		*buffe = (char*)"";
    		len2 = strlen( buffer);
    		strcpy_s( (char*)*buffe, len2 + 1, buffer);
    A noter que apr�s le *buffe = (char*)""; les valeurs de pointeurs sont les suivantes
    buffe = 0x0DE3AF38( dans la pile)
    *buffe = 0x01311476( dans le tas)
    **buffe = 0
    et le message d'erreur sur le strcpy_s est :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    Exception de première chance à 0x740948e2 (msvcr100.dll) dans SpecificationLoader.exe*: 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x01311476.
    Une exception de première chance de type 'System.AccessViolationException' s'est produite dans SpecificationLoader.exe
     
    Informations supplémentaires*: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    puis j'ai chang� le code pour mettre la taille du buffer :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    		buffe = (char**)new char[BUF_SIZE]();
    		*buffe = (char*)"";
    		len2 = strlen( buffer);
    		strcpy_s( (char*)*buffe, len2 + 1, buffer);
    et j'ai toujours le m�me status :
    buffe = 0XODCBAC70 ( dans la pile)
    *buffe = 0x00DD1476 ( dans le tas)
    **buffe = 0
    et le plantage :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    Exception de première chance à 0x740948e2 (msvcr100.dll) dans SpecificationLoader.exe*: 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x00dd1476.
    Une exception de première chance de type 'System.AccessViolationException' s'est produite dans SpecificationLoader.exe
     
    Informations supplémentaires*: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    J'ai donc fait une m�thode strncpy pour voir ce qui se passait :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     char* strncpy( char* out, int len, char* in)
     {
    	 int i = 0;
    	 while( in[i] != 0 && i < len)
    	 {
    		 out[i] = in[i++];
    	 }
    	 return( out);
     }
    il y a une contradiction entre l'instruction :
    et le message d'erreur �mis par le system sur l'instruction :
    qui �crit au m�me endroit :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    Une exception de première chance de type 'System.AccessViolationException' s'est produite dans SpecificationLoader.exe
     
    Informations supplémentaires*: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    avec out = 0x01221276

  3. #23
    Membre extr�mement actif
    Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    1 022
    D�tails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 1 022
    Par d�faut ce qui marche
    D'abord, la primitive FinalStateTagger n'est pas � jeter car le bufsortie est allou� au dessus et donc le pointeur est valide
    ensuite le code qui marche est le suivant:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    		buffe = (char**)new char[BUF_SIZE];
    		*buffe = (char*)buffer;
    		FinalStateTagger( buffe, 1, seenTagging_hash, lexicon_hash, cRuleArray, bufsortie);
    il faut le new pour mettre la structure en place, mais comme la gestion de la m�moire est contradictoire J'ai choisi de faire pointer *buffe sur un buffer static; et �a marche.

  4. #24
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Ne me dis pas que tu "comprends le C++" quand tu programmes comme �a.
    Ce n'est pas du C++, c'est un hybride minable de C et C++. Et m�me en C, ce serait faux, archifaux.

    Franchement, si apr�s "deux ans" de C++ tu "programmes" toujours comme �a, change de m�tier.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #25
    Membre extr�mement actif
    Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    1 022
    D�tails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 1 022
    Par d�faut bonjour
    je crois que tu fait une erreur, j'ai r�solu le probl�me. J'ai mis la solution au b�n�fice des lecteurs. Je crois que c'est bien

  6. #26
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    je crois que tu fait une erreur, j'ai r�solu le probl�me. J'ai mis la solution au b�n�fice des lecteurs. Je crois que c'est bien
    Vous n'avez vraiment r�solu le probl�me.
    Vous ne savez pas vraiment ce que vous faites.
    Mais �a fait pr�s de 2 ans que vous trainez ces m�mes lacunes (au moins).
    Si vous pensiez � ouvrir un livre MODERNE sur le C++ et un autre sur .NET, �a vous ferait �norm�ment progresser.

  7. #27
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Tu codes sans comprendre, et tu castes jusqu'� ce que �a rentre (voir � ce sujet ma signature).
    Tu fais pr�cis�ment le genre d'erreur d�peinte dans cet article; � savoir d�s que tu vois un pointeur, tu paniques et tu fais n'importe quoi.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 2 sur 2 Premi�rePremi�re 12

Discussions similaires

  1. [D�butant] Passage de param�tre qui ne fonctionne pas
    Par Stef999 dans le forum C#
    R�ponses: 1
    Dernier message: 09/11/2015, 14h22
  2. R�ponses: 2
    Dernier message: 02/11/2015, 14h26
  3. R�ponses: 1
    Dernier message: 02/11/2015, 14h23
  4. R�ponses: 2
    Dernier message: 14/02/2008, 19h31
  5. Passage de param�tres en url qui marche pas
    Par debilemaniac dans le forum Langage
    R�ponses: 9
    Dernier message: 30/05/2006, 16h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo