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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    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.

  2. #22
    Débutant
    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
    Points : 332
    Points
    332
    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
    Débutant
    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
    Points : 332
    Points
    332
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    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.

  5. #25
    Débutant
    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
    Points : 332
    Points
    332
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 200
    Points : 12 354
    Points
    12 354
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    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.

+ 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, 15h22
  2. Réponses: 2
    Dernier message: 02/11/2015, 15h26
  3. le passage de paramètre échoue dans une application managée
    Par JeanNoel53 dans le forum Visual C++
    Réponses: 1
    Dernier message: 02/11/2015, 15h23
  4. Réponses: 2
    Dernier message: 14/02/2008, 20h31
  5. Passage de paramètres en url qui marche pas
    Par debilemaniac dans le forum Langage
    Réponses: 9
    Dernier message: 30/05/2006, 17h29

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