locked
une compilation qui se passe mal RRS feed

  • Question

  • bonjour

    j'ai un drôle de message:

    1>..\..\..\..\..\..\WordNet\2.1\src\lib\morph.cpp(511): error C2039: 'strcpy_s' : n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Int32'
    pourquoi le compilateur veut il que strcpy_s soit un Int32?

     je vous met le code:

    	if( lastwd = morphword(last + 1, NOUN))
    	{
    		len = strlen( rest);
    		len++.
    	        strcpy_s( end, len, rest);
    	        end[last-rest+1] = '\0';
    	        len += strlen( lastwd);
    	        strcat_s( end, len, lastwd);
    	}


    Jean Noël Martin


    • Type modifié JeanNoel53 mercredi 21 octobre 2015 12:48
    • Modifié JeanNoel53 mercredi 21 octobre 2015 16:52
    mercredi 21 octobre 2015 12:38

Réponses

  • Bonjour Jean-Noël,

    Je pense qu'Il faut rajouter le namepace.

    using namespace System ;

    De plus il y a des erreurs dans votre code.

    len++.
        error
    |= sprintf_s( retval, len, "%s%s", exc_word, rest);

    Il faut mettre ; a la place de . après len++

    Cordialement

    Joël


    lundi 26 octobre 2015 08:43

Toutes les réponses

  • J'ai corrigé en mettant tous le temps  error |=

    j'ai déclaré:

        char *rest, *exc_word, *lastwd = NULL, *last;
        int i, offset, len, cnt;
        System::Int32 error = 0;
        char word[WORDBUF], end[WORDBUF];
        static char retval[WORDBUF];
        /* Assume that the verb is the first word in the phrase.  Strip it
           off, check for validity, then try various morphs with the
           rest of the phrase tacked on, trying to find a match. */
        rest = strchr(s, '_');
        last = strrchr(s, '_');
        if (rest != last)
        {        /* more than 2 words */
            if( lastwd = morphword(last + 1, NOUN))
            {
                len = strlen( rest);
                len++.
                error |= strcpy_s( end, len, rest);

    et j'ai comme réponse:

    1>..\..\..\..\..\..\WordNet\2.1\src\lib\morph.cpp(512): error C2039: 'error' : n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Int32'
    1>..\..\..\..\..\..\WordNet\2.1\src\lib\morph.cpp(553): error C2039: 'error' : n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Int32'
    1>..\..\..\..\..\..\WordNet\2.1\src\lib\morph.cpp(578): error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'sprintf_s'


    Jean Noël Martin



    • Modifié JeanNoel53 mercredi 21 octobre 2015 16:53
    mercredi 21 octobre 2015 14:29
  • Bonsoir,

    Normalement en C++, la fonction strcpy_s n'a que deux paramètres

    errno_t strcpy_s(
       char (&strDestination)[size],
       const char *strSource
    ); // C++ only

    Exemple d'utilisation:

    char str[100];
    strcpy_s( str, "Hello world" );

    mercredi 21 octobre 2015 18:13
  • ce n'est pas le typage recommandé par Microsoft

    De plus mon problème tient a la reconnaissance de la déclaration de error.  D'ailleurs le message d'erreur a changé et est plus explicite:

    1>..\..\..\..\..\..\WordNet\2.1\src\lib\morph.cpp(514): error C2039: 'error' : n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Int32'
    1>..\..\..\..\..\..\WordNet\2.1\src\lib\morph.cpp(522): error C2039: 'error' : n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Int32'
    1>..\..\..\..\..\..\WordNet\2.1\src\lib\morph.cpp(556): error C2039: 'error' : n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Int32'

    A noter que les autres instances de Systen::Int32 error = 0; se passent bien sauf une. J'ai essayé de déplacer les primitives, mais ça n'a rien changé

    Dans les primitives en cause j'ai des strcpy_s et des fprintf_s

    En plus il y a, au delà des messages d'erreur d'autres constructions avec des fprintf_s


    Jean Noël Martin







    mercredi 21 octobre 2015 20:35
  • puis je espérer une réponse?

    Jean Noël Martin

    vendredi 23 octobre 2015 12:31
  • J'ai essayé de mettre la primitive qui générait des erreurs dans un nouveau fichier. je vous met le code et le diagnostique de compilation, puis mon commentaire

    /*
      
      morph2.cpp - WordNet search code morphology functions
      
    */
    
    #include "stdafx.h"
    #include "wn.h"
    
    #ifdef _WINDOWS
    #include <windows.h>
    #include <windowsx.h>
    #define EXCFILE	"%s\\%s.exc"
    #else
    #define EXCFILE	"%s/%s.exc"
    #endif
    
    static char *Id = "$Id: morph.c,v 1.66 2005/03/18 18:14:24 wn Exp $";
    
    extern int offsets[NUMPARTS] = { 0, 0, 8, 16 };
    extern FILE *exc_fps[NUMPARTS + 1];
    extern int cnts[NUMPARTS] = { 0, 8, 8, 4 };
    extern char* wordbase( char*, int);
    extern char* exc_lookup( char*, int);
    static char *morphprep( char*);
    
    
    
    static char *morphprep(char *s)
    {
    	char* rest;
    	char* exc_word;
    	char* lastwd = NULL;
    	char* last;
    	int i;
    	int offset;
    	int len;
    	int cnt;
    	System::Int32 error = 0;
        char word[WORDBUF];;
    	char end[WORDBUF];
        static char retval[WORDBUF];
        /* Assume that the verb is the first word in the phrase.  Strip it
           off, check for validity, then try various morphs with the
           rest of the phrase tacked on, trying to find a match. */
        rest = strchr(s, '_');
        last = strrchr(s, '_');
        if (rest != last)
    	{		/* more than 2 words */
    		if( lastwd = morphword(last + 1, NOUN))
    		{
    			len = strlen( rest);
    			len++.
    			error |= strcpy_s( end, len, rest);
    			end[last-rest+1] = '\0';
    			len += strlen( lastwd);
    			error |= strcat_s( end, len, lastwd);
    		}
    	}
    	len = strlen( s);
    	len++.
        error |= strcpy_s( word, len, s);
        word[rest - s] = '\0';
        for (i = 0, cnt = strlen(word); i < cnt; i++)
    	if (!isalnum((unsigned char)(word[i])))
    		return( "");
        offset = offsets[VERB];
        cnt = cnts[VERB];
        /* First try to find the verb in the exception list */
        if ((exc_word = exc_lookup(word, VERB)) && strcmp(exc_word, word))
    	{
    		int len;
    		len = strlen( exc_word);
    		len += strlen( rest);
    		len++;
    		sprintf_s( retval, len, "%s%s", exc_word, rest);
    		if(is_defined(retval, VERB))
    			return(retval);
    		else if( lastwd)
    		{
    			len = strlen( exc_word);
    			len += strlen( end);
    			len++;
    			sprintf_s(retval, len, "%s%s", exc_word, end);
    			if(is_defined(retval, VERB))
    				return(retval);
    		}
        }
        for( i = 0; i < cnt; i++)
    	{
    		if ((exc_word = wordbase(word, (i + offset))) && strcmp(word, exc_word))
    		{ /* ending is different */
    			len = strlen( exc_word);
    			len += strlen( rest);
    			len++.
    		    error |= sprintf_s( retval, len, "%s%s", exc_word, rest);
    		    if(is_defined(retval, VERB))
    				return(retval);
    			else if( lastwd)
    			{
    				len = strlen( exc_word);
    				len += strlen( end);
    				len++;
    				error |= sprintf_s( retval, len, "%s%s", exc_word, end);
    				if( is_defined( retval, VERB))
    					return( retval);
    		    }
    		}
        }
    	len = strlen( word);
    	len += strlen( rest);
    	len++;
        error |= sprintf_s( retval, len, "%s%s", word, rest);
        if (strcmp(s, retval))
    		return(retval);
        if (lastwd)
    	{
    		len = strlen( word);
    		len += strlen( end);
    		len++;
    		error |= sprintf_s(retval, len, "%s%s", word, end);
    		if (strcmp(s, retval))
    			return(retval);
        }
        return( "");
    }

    le diagnostique de compilation:

    1>morph2.cpp(53): error C2039: 'error' : n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Int32'
    1>morph2.cpp(61): error C2039: 'error' : n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Int32'
    1>morph2.cpp(95): error C2039: 'error' : n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Int32'
    1

    et mon commentaire est que toutes les instance d'error ne sortent pas en erreur


    Jean Noël Martin

    vendredi 23 octobre 2015 16:21
  • Bonjour Jean-Noël,

    Je pense qu'Il faut rajouter le namepace.

    using namespace System ;

    De plus il y a des erreurs dans votre code.

    len++.
        error
    |= sprintf_s( retval, len, "%s%s", exc_word, rest);

    Il faut mettre ; a la place de . après len++

    Cordialement

    Joël


    lundi 26 octobre 2015 08:43
  • Je suis d'accord avec toutes vos remarques

    Elle n'ont rien changées

    Mais je suis passé par des variables intermédiaires qui ont résolu le problème

    ci-après le code qui compile:

    /*
      
      morph2.cpp - WordNet search code morphology functions
      
    */
    
    #include "stdafx.h"
    #include "wn.h"
    
    #ifdef _WINDOWS
    #include <windows.h>
    #include <windowsx.h>
    #define EXCFILE	"%s\\%s.exc"
    #else
    #define EXCFILE	"%s/%s.exc"
    #endif
    
    static char *Id = "$Id: morph.c,v 1.66 2005/03/18 18:14:24 wn Exp $";
    
    extern int offsets[NUMPARTS] = { 0, 0, 8, 16 };
    extern FILE *exc_fps[NUMPARTS + 1];
    extern int cnts[NUMPARTS] = { 0, 8, 8, 4 };
    extern char* wordbase( char*, int);
    extern char* exc_lookup( char*, int);
    static char *morphprep( char*);
    
    using namespace System;
    
    static char *morphprep(char *s)
    {
    	char* rest;
    	char* exc_word;
    	char* lastwd = NULL;
    	char* last;
    	int i;
    	int offset;
    	int len;
    	int cnt;
    	System::Int32 error = 0;
        char word[WORDBUF];;
    	char end[WORDBUF];
        static char retval[WORDBUF];
        /* Assume that the verb is the first word in the phrase.  Strip it
           off, check for validity, then try various morphs with the
           rest of the phrase tacked on, trying to find a match. */
        rest = strchr(s, '_');
        last = strrchr(s, '_');
        if (rest != last)
    	{		/* more than 2 words */
    		if( lastwd = morphword(last + 1, NOUN))
    		{
    			len = strlen( rest);
    			len++;
    			System::Int32 error1 = 0;
    			error1 = strcpy_s( end, len, rest);
    			end[last-rest+1] = '\0';
    			len += strlen( lastwd);
    			error1 |= strcat_s( end, len, lastwd);
    			error  |= error1;
    		}
    	}
    	len = strlen( s);
    	len++;
        System::Int32 error1 = 0;
    	error1 = strcpy_s( word, len, s);
    	error |= error1;
        word[rest - s] = '\0';
        for (i = 0, cnt = strlen(word); i < cnt; i++)
    	if (!isalnum((unsigned char)(word[i])))
    		return( "");
        offset = offsets[VERB];
        cnt = cnts[VERB];
        /* First try to find the verb in the exception list */
        if ((exc_word = exc_lookup(word, VERB)) && strcmp(exc_word, word))
    	{
    		int len;
    		len = strlen( exc_word);
    		len += strlen( rest);
    		len++;
    		sprintf_s( retval, len, "%s%s", exc_word, rest);
    		if(is_defined(retval, VERB))
    			return(retval);
    		else if( lastwd)
    		{
    			len = strlen( exc_word);
    			len += strlen( end);
    			len++;
    			sprintf_s(retval, len, "%s%s", exc_word, end);
    			if(is_defined(retval, VERB))
    				return(retval);
    		}
        }
        for( i = 0; i < cnt; i++)
    	{
    		if ((exc_word = wordbase(word, (i + offset))) && strcmp(word, exc_word))
    		{ /* ending is different */
    			len = strlen( exc_word);
    			len += strlen( rest);
    			len++;
    			System::Int32 error1 = 0;
    		    error1 |= sprintf_s( retval, len, "%s%s", exc_word, rest);
    			error |= error1;
    		    if(is_defined(retval, VERB))
    				return(retval);
    			else if( lastwd)
    			{
    				len = strlen( exc_word);
    				len += strlen( end);
    				len++;
    				error |= sprintf_s( retval, len, "%s%s", exc_word, end);
    				if( is_defined( retval, VERB))
    					return( retval);
    		    }
    		}
        }
    	len = strlen( word);
    	len += strlen( rest);
    	len++;
        error |= sprintf_s( retval, len, "%s%s", word, rest);
        if (strcmp(s, retval))
    		return(retval);
        if (lastwd)
    	{
    		len = strlen( word);
    		len += strlen( end);
    		len++;
    		error |= sprintf_s(retval, len, "%s%s", word, end);
    		if (strcmp(s, retval))
    			return(retval);
        }
        return( "");
    }


    Jean Noël Martin

    mardi 27 octobre 2015 19:25
  • Cela a changé quelque chose

    Il fallait bien rajouté la ligne.

    using namespace System;

    Si vous enlevez la ligne ça ne devrait plus compiler.

    mercredi 28 octobre 2015 07:26