none
trois constructions qui sont refusées qui sont des constructions qui vont de non managé au managé RRS feed

  • Question

  • bonjour,

    J'ai trois constructions qui sont refusées par le compilateur

    la première touche une fonction:

    void change_the_tag(interior_ptr<char>  theentry,char* thetag, int theposition)
    {
      char^ tempM;
      tempM = gcnew char( *thetag);
      theentry[0][theposition] = mystrdup(tempM);
    }

    la variable the entry ( interiorptr<char>) n'est pas acepté et le message d'erruer me trouble:

    1>..\..\..\..\Linguistic\ParserManager\src\final-state-tagger.cpp(31): error C2109: un indice requiert un type tableau ou pointeur
    

    la deuxième erreur vient d'une démarche relativement classique:

    char^			staart;
    
    
    ...
    
    
    staart = gcnew signed char( "STAART");

    mais elle génère quand même un message d'erreur:

    1>..\..\..\..\Linguistic\ParserManager\src\final-state-tagger.cpp(72): error C2440: 'initialisation' : impossible de convertir de 'const char [7]' en 'signed char'
    1>          Aucun contexte dans lequel cette conversion est possible

    quand à la troisième le message d'erreur me surprend

     char^                    tempM;
     interior_ptr<char>       word_corpus_array;                               
                                    
    ...
    
    
                                    tempM = gcnew char( *tempB);
    				word_corpus_array[count] = tempM;

    l'affectation de word_corpus_array est reffusée:

    1>..\..\..\..\Linguistic\ParserManager\src\final-state-tagger.cpp(689): error C2440: '=' : impossible de convertir de 'System::SByte ^' en 'char'
    1>          Aucun opérateur de conversion défini par l'utilisateur disponible, ou
    1>          Aucun contexte dans lequel cette conversion est possible
    
    ces trois problème résolus le parser de brill sera converti en mode managé.


    Jean Noël Martin

    lundi 3 février 2014 19:27

Réponses

  • pour la première la solution est simple: il faut avoir seulement un indice

    void change_the_tag(interior_ptr<char>  theentry,char* thetag, int theposition)
    {
      char^ tempM;
      tempM = gcnew char( *thetag);
      theentry[theposition] = mystrdup(tempM);
    }
    pour la deuxième la solution est de considérer la constante comme un pointeur:
    staart = gcnew signed char( *"STAART");

    pour la troisième il y a une difficulté à contourner:

                                    nameM = gcnew char( *atempstrptr);
    				nameM = mystrdup( nameM);
    				tempB = (char*)&nameM;
    				nameN = mystrdup( split_ptr[0]);
    				tempA = (char*)&nameN;
    				word_corpus_array[word_corpus_array_index++] = *tempA;
    				tag_corpus_array[tag_corpus_array_index++] = *tempB;
    				++split_ptr;

    atempstrptr est un char * split_ptr[0] est un system::sByte; tag_corpus_array est un type managé, mais contient des char*

    mystrdup traite des System::SByte. il faut donc avoir totes les variables dans les deux formats (char* et System_SByte^)

    c'est l'objet des  5 premières lignes.


    Jean Noël Martin



    • Modifié JeanNoel53 mardi 4 février 2014 10:13
    • Marqué comme réponse JeanNoel53 mardi 4 février 2014 10:13
    mardi 4 février 2014 09:06