none
déclarer un buffer de sortie RRS feed

  • Question

  • Bonjour,

    J'ai besoin de protèger une zone mémoire pour travailler dessus.

    J'ai déclaré:

    static wchar_t out[1024];

    mais le compilateur me répond:

    1>..\..\..\..\DBMS\MissionDBManager\src\MissionDatabaseManager.cpp(96): error C2440: '=' : impossible de convertir de 'wchar_t *' en 'wchar_t [1024]'
    1>          Aucune conversion en types tableau, même s'il y a des conversions en références ou en pointeurs de tableau

    Comment déclarer ma zone mémoire?

    J'ai essayé plusieurs solutions sans succès.


    Jean Noël Martin

    lundi 16 décembre 2013 18:57

Réponses

  •  

    "j'ai déclaré la variable static pour pouvoir y accéder après la vie de la fonction qui l'initialise."

    Révisez vos cours, le modifier "static" sur une variable globale ne sert qu'a rendre le "linkage" interne à l'unité de compilation en cours de compilation (le .cpp), en aucun cas à le rendre persistant. Une varaible globale est globale au processus, du début à la fin du processus.

    Le norme C++03 d'ailleur préconise de ne plus utiliser se modifier mais de déclarer ces variables globales cachées du reste du code en utilisant le namespace anonyme.

    "J'ai déclaré la fonction  dynamiquement pour être sur qu'il y ait de la place."

    En déclarant cette variable globale avec un simple "wchar_t g_NomDeVariableToutPourri_out[1024];" aurait déjà alloué la mémoire directement par le chargeur de l'OS.

     

    "pourquoi je l'ai appelée out, car c'est la sortie d'une variable d'entrée in??? quelle est l'importance de cette remarque?"

    in par rapport à quoi ??? out par rapport à quoi ???

    En plus d'être pourris, ces noms sont souvent utilisés dans des MACRO, donc utilisez des nom bien plus explicites.

    "L'allocation dynamique semble suspect; mais comment faire autrement?"

    Inutile, dangereuse, complexe et absolument pas maitriser au vue de vos lacunes sur le C++.

    Une bonne lecture d'un ouvrage de vulgarisation du C++ devrait vous être salutaire.


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 mardi 17 décembre 2013 14:38
    mardi 17 décembre 2013 13:41
    Modérateur

Toutes les réponses

  • Bonjour,

    Est-il possible de voir le code de MissionDatabaseManager ?

    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

    mardi 17 décembre 2013 00:21
    Modérateur
  • C'est une très grosse classe. Je vais vous donner trois primitives. J'ai ajouté les constructeurs et destructeurs qui ne sont pas vides. J’espère que ça vous suffira:

        static wchar_t* out;

    //PROC CMDBManager()
    //DATA
    //ATAD
    //DO
    //  m_pServer       := [Create the CServer object]
    //  m_pDatabase     := [Create the CDatabase object wit the type MISSION_DATABASE]
    //  m_SourceLanguage:=LANGUAGE_NONE
    //  m_TargetLanguage:=LANGUAGE_NONE
    //  objCInterbaseManager  := NULL
        CMDBManager::CMDBManager()
        {
            m_SourceLanguage = LANGUAGE_NONE;
            m_TypDoc         = STATUS_DOC_NONE;
            out = new wchar_t[1024]();
        }
    //OD
    //--------------------------------------------------------------------------------------------------------------------------------
    //Name          ~CMDBManager
    //Role          Class destructor
    //Interface
    //In            None
    //In/Out        None
    //Result        None
    //Constraints   None
    //Resources     None
    //PreCondition  None
    //--------------------------------------------------------------------------------------------------------------------------------
    //PROC ~CMDBManager()
    //DATA
    //ATAD
    //DO
    //    [Delete the CServer object "m_pServer"]
    //  [Delete the CDatabase object "m_pDatabase"]
    //  m_SourceLanguage :=LANGUAGE_NONE
    //  m_TargetLanguage :=LANGUAGE_NONE
    //  IF (objCInterbaseManager <> NULL) THEN
    //      [Delete the CDBMSManager object "objCInterbaseManager"]
    //  FI
        CMDBManager::~CMDBManager()
        {
            m_SourceLanguage=LANGUAGE_NONE;
            m_TypDoc = STATUS_DOC_NONE;
            delete out;
            if (m_pServer != NULL)
            {
                delete m_pServer;
                m_pServer = NULL;
            }
            if (m_pDatabase != NULL)
            {
                delete m_pDatabase;
                m_pDatabase = NULL;
            }
        }

    //--------------------------------------------------------------------------------------------------------------------------------/ //Name CreateSegmentAndAllItsSubelement //Role Create in the database the segment with its subelement providing of the linguistic and layout analysis. That are : // - List of all Words and all Lemma // - List of all Chunks // - List of all NGrams // - Clues description // - Layout description // - Statistics description (Number of character and number of words in sentence) // - Segment language // AND return the segment identifier. //Interface //In //In/Out pAnalysedSegment Complete description of the analysed segment to create //Result ErrorCode error return code //Constraints //Resources //PreCondition //-------------------------------------------------------------------------------------------------------------------------------- //PROC CreateSegmentAndAllItsSubelement (In/Out: pAnalysedSegment // Out: ErrorCode) static hidDB hidPrevSegment; erc CMDBManager::CreateSegmentAndAllItsSubelement(CAnalysedSegment * pAnalysedSegment) { //DATA // hidPrevSegment Identifier of the previous segment of the segment to create // hidNewSegmentID Identifier of the segment to create // hidNewLayout Identifier of the layout of the segment to create // hidNewClues Identifier of the clues of the segment to create hidDB hidNewSegmentID = 0; hidDB hidNewLayout = 0; hidDB hidNewClues = 0; std::wstringstream wssRequest; std::wstringstream wssPreviousRequest; unsigned long dwNbResultFound = 0; std::list<CAnalysedWord *>::iterator itWord; std::list<CAnalysedChunk *>::iterator itChunk; std::list<CAnalysedChunk *>::iterator itOldChunk; std::list<CElementSemantique *>::iterator itProposition; std::wstring wsText; std::wstring wsPosition; std::wstring wsCarLen; std::wstring wsWordLen; std::wstring wsDocTyp; std::wstring wsIdDoc; std::wstring wsLangage; std::wstring wsId; std::wstring wsIdSeg; CAnalysedWord * pWord; CAnalysedChunk * pChunk; CElementSemantique * pProposition; enStatusDocument enDocumentType = STATUS_DOC_SOURCE; int iSize; int i; //ATAD //DO // ErrorCode := 0 hidDB ErrorCode = 0; // il faut d'abord vérifier que ce segment n'est pas déjà dans la base de donnée // on va publier le segment pour tracabilité wsText = L""; itProposition = pAnalysedSegment->pLinguisticSegment->ListProposition.begin(); while( itProposition != pAnalysedSegment->pLinguisticSegment->ListProposition.end()) { pProposition = *itProposition; itChunk = pProposition->ListChunk.begin(); while( itChunk != pProposition->ListChunk.end()) { pChunk = *itChunk; itWord = pChunk->ListWord.begin(); while( itWord != pChunk->ListWord.end()) { array<wchar_t*, 124> argv; pWord = *itWord++; argv[0] = (wchar_t*)wsText.c_str(); argv[1] = (wchar_t*)pWord->wsWord.c_str(); wsText = wcsxcat( false, 2, argv); wsText += L" "; } itChunk++; } itProposition++; } // [Create the Clues of the segment to create] = // DO // ErrorCode:=[call the method "CreateSegmentClues(pSegmentCluesDescription of pAnalysedSegment, hidNewClues)"] // [Create the Layout of the segment to create] = // DO // ErrorCode:=[call the method "CreateSegmentLayout(pSegmentLayout of pAnalysedSegment, hidNewLayout)"] // Layout // ErrorCode |= CreateSegmentLayout(pAnalysedSegment->pSegmentLayout,hidNewLayout); // [Search the previous segment of the segment to create] = // DO // IF (this is the first segment (ulDocPosition = 1)) THEN // hidPrevSegment := NULL // ELSE // [Select "nuIdSeg" from T_SEGMENT where "iInitPos" = "ulDocPosition - 1" and "siIdLang" = Language] // [Update "hidPrevSegment" with the result of the request] // // FI if (pAnalysedSegment->ulDocPosition == 1) { hidPrevSegment = 0; wssPreviousRequest.str(L""); wssPreviousRequest << NULLVALUE; } else { wssPreviousRequest << hidPrevSegment; wssRequest.str(L""); wssRequest << SELECT << SEG_ID_SEG << FROM << SEG_TABLE << WHERE << SEG_INIT_POS << EQ << (pAnalysedSegment->ulDocPosition-1) << AND << SEG_TYPE_DOC << EQ << enDocumentType << AND << SEG_ID_DOC << EQ << iIdDoc << AND << SEG_ID_LANG << EQ << pAnalysedSegment->Language; dwNbResultFound = 0; ErrorCode |= objInterbaseManager.ExecuteSelectRequest(wssRequest.str(), &dwNbResultFound); if(dwNbResultFound == 0) { ErrorCode |= objStrConv.CreateReturnCode(TYPE_ERROR,MSG_CANT_CREATE_SEGMENT,MODULE_ID_MDB_MANAGER, CMDB_MANAGER,CREATE_SEGMENT_AND_ALL_ITS_SUB_ELEMENT, ERR_CANT_CREATE_SEGMENT ); return( ErrorCode); } ErrorCode |= objInterbaseManager.First(); ErrorCode |= objInterbaseManager.GetHidDB(0, (int64_t&)hidPrevSegment); wssPreviousRequest.str(L""); if( hidPrevSegment != 0) wssPreviousRequest << hidPrevSegment; else wssPreviousRequest << NULLVALUE; ErrorCode |= objInterbaseManager.CommitTransaction(); } // OD // // [Create the new segment] = // DO // [Get the new identifier "hidNewSegmentID"of "nuIdSeg"] ErrorCode |= objInterbaseManager.GetIdentifier(SEG_ID_SEG, hidNewSegmentID); if( ErrorCode == hidNewSegmentID) ErrorCode = INIT_NO_ERROR; // [Insert into the table T_SEGMENT with "nuIdSeg"="hidNewSegmentID", "cAlignStatus"=SEG_AL_ST_NOALIGNED, "iInitPos"="ulDocPosition", // "sSizeInChar"="shSegmentCharLength", "sSizeInWords"="shSegmentWordLength","nuIdPrev"="hidPrevSegment", // "nuIdLayout"="hidNewLayout","nuIdClues"="hidNewClues","siIdLang"="Language"] wsPosition = _itow( pAnalysedSegment->ulDocPosition, (wchar_t*)wsPosition.c_str(), 10); wsCarLen = _itow( pAnalysedSegment->shSegmentCharLength, (wchar_t*)wsCarLen.c_str(), 10); wsWordLen = _itow( pAnalysedSegment->shSegmentWordLength, (wchar_t*)wsWordLen.c_str(), 10); wsDocTyp = _itow( (int)enDocumentType, (wchar_t*)wsDocTyp.c_str(), 10); wsIdDoc = _itow( iIdDoc, (wchar_t*)wsIdDoc.c_str(), 10); wsId = _itow( (int)hidNewLayout, (wchar_t*)wsId.c_str(), 10); wsIdSeg = _itow( hidNewSegmentID, (wchar_t*)wsIdSeg.c_str(), 10); wsLangage = _itow( (int)pAnalysedSegment->Language, (wchar_t*)wsLangage.c_str(), 10); wssRequest.str(L""); wssRequest << INSERT << SEG_TABLE << BLANK << PB << SEG_ID_SEG << CO << SEG_ALIGN_STATUS << CO << SEG_INIT_POS << CO << SEG_SIZE_IN_CHAR << CO << SEG_SIZE_IN_WORDS << CO << SEG_ID_PREV << CO << SEG_ID_LAYOUT << CO << SEG_ID_DOC << CO << SEG_TYPE_DOC << CO << SEG_ID_LANG << PE << VALUES << PB << wsIdSeg << CO << SEG_ST_NOALIGNED << CO << wsPosition << CO << wsCarLen << CO << wsWordLen << CO << wssPreviousRequest.str() << CO << wsId << CO << wsIdDoc << CO << wsDocTyp << CO << wsLangage << PE; ErrorCode |= objInterbaseManager.ExecuteRequest(wssRequest.str()); // [Update "ullSegmentID" of pAnalysedSegment with "hidNewSegmentID"] pAnalysedSegment->ullSegmentID = hidNewSegmentID; // itProposition = pAnalysedSegment->pLinguisticSegment->ListProposition.begin(); while( itProposition != pAnalysedSegment->pLinguisticSegment->ListProposition.end()) { i = 0; pProposition = *itProposition; iSize = pProposition->ListChunk.size(); itChunk = pProposition->ListChunk.begin(); while( itChunk != pProposition->ListChunk.end() && i < iSize) { if( i == 0) { pChunk = *itChunk; wsText = L""; itWord = pChunk->ListWord.begin(); while( itWord != pChunk->ListWord.end()) { array<wchar_t*, 124> argv; pWord = *itWord; argv[0] = (wchar_t*)wsText.c_str(); argv[1] = (wchar_t*)pWord->wsWord.c_str(); wsText = wcsxcat( false, 2, argv); wsText += L" "; itWord++; } // [Create the Lemmas of the segment to create] = // DO // ErrorCode:=[call the method "CreateSegmentLemmas(Language,ListWord of pLinguisticSegment of pAnalysedSegment)"] ErrorCode |= CreateSegmentLemmas(pAnalysedSegment->Language, pChunk->ListWord); // OD // // [Create the Words of the segment to create] = // DO // ErrorCode:=[call the method "CreateSegmentWords(Language,hidNewSegmentID, ListWord of pLinguisticSegment of pAnalysedSegment)"] ErrorCode |= CreateSegmentWords(pAnalysedSegment->Language, hidNewSegmentID, pChunk->ListWord); itOldChunk = itChunk; i++; } if( itChunk != itOldChunk) { pChunk = *itChunk; wsText = L""; itWord = pChunk->ListWord.begin(); while( itWord != pChunk->ListWord.end()) { array<wchar_t*, 124> argv; pWord = *itWord; argv[0] = (wchar_t*)wsText.c_str(); argv[1] = (wchar_t*)pWord->wsWord.c_str(); wsText = wcsxcat( false, 2, argv); wsText += L" "; itWord++; } // [Create the Lemmas of the segment to create] = // DO // ErrorCode:=[call the method "CreateSegmentLemmas(Language,ListWord of pLinguisticSegment of pAnalysedSegment)"] ErrorCode |= CreateSegmentLemmas(pAnalysedSegment->Language, pChunk->ListWord); // OD // // [Create the Words of the segment to create] = // DO // ErrorCode:=[call the method "CreateSegmentWords(Language,hidNewSegmentID, ListWord of pLinguisticSegment of pAnalysedSegment)"] ErrorCode |= CreateSegmentWords(pAnalysedSegment->Language, hidNewSegmentID, pChunk->ListWord); i++; } itOldChunk = itChunk; itChunk++; } // [Create the Chunks of the segment to create] = // DO // ErrorCode:=[call the method "CreateSegmentChunks(Language,hidNewSegmentID, ListChunk of pLinguisticSegment of pAnalysedSegment)"] ErrorCode |= CreateSegmentChunks(pAnalysedSegment->Language,hidNewSegmentID,pProposition->ListChunk); // OD // itProposition++; } // OD // [Create the Propositions of the segment to create] = // DO // ErrorCode:=[call the method "CreateSegmentNGrams(Language,hidNewSegmentID, ListProposition of pLinguisticSegment of pAnalysedSegment)"] ErrorCode |= CreateSegmentProposition(pAnalysedSegment->Language,hidNewSegmentID,pAnalysedSegment->pLinguisticSegment->ListProposition); // OD hidPrevSegment = hidNewSegmentID; // IF (an error occured) THEN // [Return "ErrorCode" with the error occured] // FI // [Return ErrorCode] return( ErrorCode); //OD } //------------------------------------------------------------------------------ //Name GetSegmentsID //Role // Get the segment IDs //Interface //In Language //In/Out ListSegmentID //Result ErrorCode error return code //Constraints //Resources //PreCondition //------------------------------------------------------------------------------ erc CMDBManager::GetSegmentsID(enLanguage Language, std::list<hidDB>* pListSegmentID) { unsigned long dwNbResultFound = 0; bool bEndReached = false; std::wstringstream wssRequest; hidDB hidSegIdSeg; enStatusDocument enDocumentType = STATUS_DOC_SOURCE; hidDB ErrorCode = 0; // [Get Segment ids = select nuIdSeg, nuIdNext, cAlignStatus, nuIdPrev from T_SEGMENT where siIdLang = "Language"] wssRequest.str(L""); wssRequest << SELECT << SEG_ID_SEG << FROM << SEG_TABLE << WHERE << SEG_TYPE_DOC << EQ << enDocumentType << AND << SEG_ID_LANG << EQ << Language << ORDERBY << SEG_ID_SEG; dwNbResultFound = 0; ErrorCode |= objInterbaseManager.ExecuteSelectRequest(wssRequest.str(), &dwNbResultFound); if (&dwNbResultFound==0) return( ErrorCode); // [Update the map key "MapSegmentIdFound" with the field "nuIdSeg" and the map value with the field "nuIdNext" and "cAlignStatus" of each response] ErrorCode |= objInterbaseManager.First(); bEndReached = false; while ((bEndReached != true) && (ErrorCode == INIT_NO_ERROR)) { ErrorCode |= objInterbaseManager.GetHidDB(0,(int64_t&)hidSegIdSeg); pListSegmentID->push_back( hidSegIdSeg); // Go to the next result of the request ErrorCode |= objInterbaseManager.Next(bEndReached); } ErrorCode |= objInterbaseManager.CommitTransaction(); return( ErrorCode); } //--------------------------------------------------------------------------------------------------------------------------------/ //Name CreateSegmentLemmas (Private) //Role Create in the database all Lemmas of the segment //Interface //In Language Language of the lemmas //In/Out ListAnalysedWord List of lemmass and words of the segment //Result ErrorCode error return code //Constraints //Resources //PreCondition //-------------------------------------------------------------------------------------------------------------------------------- //PROC CreateSegmentLemmas (In: Language // In/Out: ListAnalysedWord, // Out: ErrorCode) erc CMDBManager::CreateSegmentLemmas(enLanguage Language,std::list<CAnalysedWord *> &ListAnalysedWord) { //DATA // hidNewLemmaID Identifier of the Lemma hidDB hidNewLemmaID = 0; std::list <CAnalysedWord *>::iterator itListAnalysedWord; CAnalysedWord * pLemma; std::wstringstream wssRequest; std::wstring wsRequest; std::wstring wsLemma; std::wstring wsPos; std::wstring wsGen; std::wstring wsLangage; std::wstring wsId; std::wstring wsIdEx; std::wstring wsDocTyp; std::wstring wsIdDoc; wchar_t* aLemma; bool bIsValid; unsigned long dwNbResultFound = 0; int iSize; int len; enStatusDocument enDocumentType = STATUS_DOC_SOURCE; //ATAD //DO // ErrorCode := 0 hidDB ErrorCode = 0; // WHILE (there is element in the list "ListAnalysedWord") AND (there is no error) // DO itListAnalysedWord = ListAnalysedWord.begin(); while( (itListAnalysedWord != ListAnalysedWord.end()) && (ErrorCode == INIT_NO_ERROR) ) { pLemma = *itListAnalysedWord; aLemma = (wchar_t*)pLemma->wsLemma.c_str(); iSize = findx( aLemma, L"'", 0, bIsValid); while( bIsValid == true) { aLemma = instertx( aLemma, iSize, 2, L"''"); iSize = findx( aLemma, L"'", iSize+2, bIsValid); } wsPos = _itow( (int)pLemma->POS, (wchar_t*)wsPos.c_str(), 10); wsGen = _itow( (int)pLemma->iGender, (wchar_t*)wsGen.c_str(), 10); wsLangage = _itow( (int)Language, (wchar_t*)wsLangage.c_str(), 10); // [Select "nuIdLemma" from T_LEMMA // WHERE ("vcString" = "wsLemma" AND "siIdPOS" = "POS" AND "siIdGender" ="Gender") of current item of "ListAnalysedWord" // AND ("siIdLang" ="Language")] wsRequest = L""; array<wchar_t*, 124> argv; argv[0] = SELECT; argv[1] = LEM_ID_LEMMA; argv[2] = FROM; argv[3] = LEM_TABLE; argv[4] = WHERE; argv[5] = PB; argv[6] = LEM_STRING; argv[7] = EQ; argv[8] = QM; len = wcslen( aLemma); argv[9] = wcsxcpy( len + 1, aLemma); argv[10] = QM; argv[11] = AND; argv[12] = LEM_ID_POS; argv[13] = EQ; argv[14] = (wchar_t*)wsPos.c_str(); argv[15] = AND; argv[16] = LEM_ID_GENDER; argv[17] = EQ; argv[18] = (wchar_t*)wsGen.c_str(); argv[19] = AND; argv[20] = LEM_ID_LANG; argv[21] = EQ; argv[22] = (wchar_t*)wsLangage.c_str(); argv[23] = PE; wsRequest = wcsxcat( false, 24, argv); dwNbResultFound = 0; ErrorCode |= objInterbaseManager.ExecuteSelectRequest( wsRequest, &dwNbResultFound); // IF (there is more than one Lemma) THEN // [Return Error Code ERR_LEMMA_NOT_UNIQUE] // FI if ( dwNbResultFound > 1) { return(ERR_LEMMA_NOT_UNIQUE); } // IF (this Lemma is not found) THEN if (dwNbResultFound == 0) { if( wsLemma != L"'rdb$database\r\n'") { // [Get the new identifier "hidNewLemmaID"of "nuIdLemma"] hidNewLemmaID = 0; ErrorCode |= objInterbaseManager.GetIdentifier(LEM_ID_LEMMA, hidNewLemmaID); if( hidNewLemmaID == 0 && ErrorCode >0) { hidNewLemmaID = ErrorCode; ErrorCode = INIT_NO_ERROR; } else if( hidNewLemmaID == ErrorCode) ErrorCode = INIT_NO_ERROR; // [Insert into the table T_LEMMA with "nuIdLemma"="hidNewLemmaID", // ("vcString" = "wsLemma", "cExcluded" ="bExcluded", "siIdPOS" = "POS", "siIdGender" ="Gender") of current item of "ListAnalysedWord", // "siIdLang"="Language"] wsRequest = L""; wsPos = _itow( (int)pLemma->POS, (wchar_t*)wsPos.c_str(), 10); wsGen = _itow( (int)pLemma->iGender, (wchar_t*)wsGen.c_str(), 10); wsLangage = _itow( (int)Language, (wchar_t*)wsLangage.c_str(), 10); wsId = _itow( (int)hidNewLemmaID, (wchar_t*)wsId.c_str(), 10); wsDocTyp = _itow( (int)DOCTYPE_WORD, (wchar_t*)wsDocTyp.c_str(), 10); wsIdEx = _itow( (int)pLemma->iExcluded, (wchar_t*)wsIdEx.c_str(), 10); wsIdDoc = _itow( (int)iIdDoc, (wchar_t*)wsIdEx.c_str(), 10); array<wchar_t*, 124> argv; argv[0] = INSERT; argv[1] = LEM_TABLE; argv[2] = BLANK; argv[3] = PB; argv[4] = LEM_ID_LEMMA; argv[5] = CO; argv[6] = LEM_STRING; argv[7] = CO; argv[8] = LEM_EXCLUDED; argv[9] = CO; argv[10] = LEM_ID_POS; argv[11] = CO; argv[12] = LEM_ID_GENDER; argv[13] = CO; argv[14] = LEM_ID_TYP_DOC; argv[15] = CO; argv[16] = LEM_ID_DOC; argv[17] = CO; argv[18] = LEM_ID_LANG; argv[19] = PE; argv[20] = VALUES; argv[21] = PB; argv[22] = (wchar_t*)wsId.c_str(); argv[23] = CO; argv[24] = QM; argv[25] = aLemma; argv[26] = QM; argv[27] = CO; argv[28] = FIST_OCCURRENCE; argv[29] = CO; argv[30] = (wchar_t*)wsPos.c_str(); argv[31] = CO; argv[32] = (wchar_t*)wsGen.c_str(); argv[33] = CO; argv[34] = (wchar_t*)wsDocTyp.c_str(); argv[35] = CO; argv[36] = (wchar_t*)wsIdDoc.c_str(); argv[37] = CO; argv[38] = (wchar_t*)wsLangage.c_str(); argv[39] = PE; wsRequest = wcsxcat( false, 40, argv); ErrorCode |= objInterbaseManager.ExecuteRequest( wsRequest); // [Update "ullLemmaID" of the current item of "ListAnalysedWord" with "hidNewLemmaID"] pLemma->ullLemmaID = hidNewLemmaID; } } // ELSE else { // [Update "ullLemmaID" of the current item of "ListAnalysedWord" with the result of the request] pLemma->ullLemmaID = 0; ErrorCode |= objInterbaseManager.First(); ErrorCode |= objInterbaseManager.GetHidDB(0,(int64_t&)pLemma->ullLemmaID); if(ErrorCode == pLemma->ullLemmaID) ErrorCode = INIT_NO_ERROR; else if( pLemma->ullLemmaID == 0 && ErrorCode >0) { pLemma->ullLemmaID = ErrorCode; ErrorCode = INIT_NO_ERROR; } // FI } // [Go to the next item of the list "ListAnalysedWord"] ErrorCode |= objInterbaseManager.CommitTransaction(); itListAnalysedWord++; // OD } // [Return ErrorCode] return( ErrorCode); //OD } //--------------------------------------------------------------------------------------------------------------------------------/ //Name CreateSegmentWords (Private) //Role Create in the database all Words of the segment and all links beetween segment and words // WARNING : the layout of the words is at the moment not used, so we don't manage the T_LAYOUT table // and the attribute "nuIdLayout" of the T_SEG_WORD table. //Interface //In Language Language of the words // hidSegmentID Identifier of the segment //In/Out ListAnalysedWord List of lemmas and words of the segment //Result ErrorCode error return code //Constraints //Resources //PreCondition //-------------------------------------------------------------------------------------------------------------------------------- //PROC CreateSegmentWords (In: Language, hidSegmentID, // In/Out: ListAnalysedWord, // Out: ErrorCode) erc CMDBManager::CreateSegmentWords(enLanguage Language,hidDB hidSegmentID,std::list<CAnalysedWord *> &ListAnalysedWord) { //DATA // hidNewWordID Identifier of the Word // hidNewSegWordID Identifier of the Seg Word link // shWordRank Counter on the word rank (position) hidDB hidNewWordID = 0; hidDB hidNewSegWordID = 0; unsigned short shWordRank = 0; std::list <CAnalysedWord *>::iterator itListAnalysedWord; CAnalysedWord* pWord; std::wstringstream wssRequest; std::wstring wsRequest; std::wstring wsPos; std::wstring wsLangage; std::wstring wsId; std::wstring wsIdLem; std::wstring wsRnk; std::wstring wsLnk; wchar_t* wsWord; bool bExist; bool bIsValid; int iSize; unsigned long dwNbResultFound = 0; //ATAD //DO // ErrorCode := 0 hidDB ErrorCode = 0; // // shWordRank := 0 // WHILE (there is element in the list "ListAnalysedWord") AND (there is no error) // DO bExist = false; itListAnalysedWord = ListAnalysedWord.begin(); while( (itListAnalysedWord != ListAnalysedWord.end()) && (ErrorCode == INIT_NO_ERROR) ) { pWord = *itListAnalysedWord; wsWord = (wchar_t*)pWord->wsWord.c_str(); iSize = findx( wsWord, L"'", 0, bIsValid); while( bIsValid == true) { wsWord = instertx( wsWord, iSize, 2, L"''"); iSize = findx( wsWord, L"'", iSize+2, bIsValid); } wsPos = _itow( (int)pWord->POS, (wchar_t*)wsPos.c_str(), 10); wsLangage = _itow( (int)Language, (wchar_t*)wsLangage.c_str(), 10); // [Management of the T_WORD table] = // DO // [Select "nuIdWord" from T_WORD // WHERE ("vcString" = "wsWord" of current item of "ListAnalysedWord") // AND ("WORD_ID_POS << EQ << pWord->POS // AND ("siIdLang" ="Language")] wsRequest = L""; array<wchar_t*, 124> argv; argv[0] = SELECT; argv[1] = WORD_ID_WORD; argv[2] = FROM; argv[3] = WORD_TABLE; argv[4] = WHERE; argv[5] = PB; argv[6] = WORD_STRING; argv[7] = EQ; argv[8] = QM; argv[9] = wsWord; argv[10] = QM; argv[11] = AND; argv[12] = WORD_ID_POS; argv[13] = EQ; argv[14] = (wchar_t*)wsPos.c_str(); argv[15] = AND; argv[16] = WORD_ID_LANG; argv[17] = EQ; argv[18] = (wchar_t*)wsLangage.c_str(); argv[19] = PE; wsRequest = wcsxcat( false, 20, argv); dwNbResultFound = 0; ErrorCode |= objInterbaseManager.ExecuteSelectRequest( wsRequest, &dwNbResultFound); // IF (there is more than one Word) THEN // [Return Error Code ERR_WORD_NOT_UNIQUE] // FI if ( dwNbResultFound > 1) { return(ERR_WORD_NOT_UNIQUE); } // IF (this Word is not found) THEN if( dwNbResultFound == 0) { // [Get the new identifier "hidNewWordID"of "nuIdWord"] ErrorCode |= objInterbaseManager.GetIdentifier(WORD_ID_WORD, hidNewWordID); if( ErrorCode == hidNewWordID) ErrorCode = INIT_NO_ERROR; // [Insert into the table T_WORD with "nuIdWord"="hidNewWordID", "vcString" = "wsWord" of current item of "ListAnalysedWord", // "siOccurrence" = 1, "siIdLang"="Language", "nuIdLemma" = "ullLemmaID" of current item of "ListAnalysedWord"] pWord->ullWordID = hidNewWordID; wsPos = _itow( (int)pWord->POS, (wchar_t*)wsPos.c_str(), 10); wsLangage = _itow( (int)Language, (wchar_t*)wsLangage.c_str(), 10); wsId = _itow( (int)hidNewWordID, (wchar_t*)wsId.c_str(), 10); wsIdLem = _itow( (int)pWord->ullLemmaID, (wchar_t*)wsIdLem.c_str(), 10); wsRequest = L""; array<wchar_t*, 124> argv; argv[0] = INSERT; argv[1] = WORD_TABLE; argv[2] = BLANK; argv[3] = PB; argv[4] = WORD_ID_WORD; argv[5] = CO; argv[6] = WORD_STRING; argv[7] = CO; argv[8] = WORD_OCCURRENCE; argv[9] = CO; argv[10] = WORD_ID_POS; argv[11] = CO; argv[12] = WORD_ID_LANG; argv[13] = CO; argv[14] = WORD_ID_LEMMA; argv[15] = PE; argv[16] = VALUES; argv[17] = PB; argv[18] = (wchar_t*)wsId.c_str(); argv[19] = CO; argv[20] = QM; argv[21] = wsWord; argv[22] = QM; argv[23] = CO; argv[24] = FIST_OCCURRENCE; argv[25] = CO; argv[26] = (wchar_t*)wsPos.c_str(); argv[27] = CO; argv[28] = (wchar_t*)wsLangage.c_str(); argv[29] = CO; argv[30] = (wchar_t*)wsIdLem.c_str(); argv[31] = PE; wsRequest = wcsxcat( false, 32, argv); ErrorCode |= objInterbaseManager.ExecuteRequest( wsRequest); // [Update "ullWordID" of the current item of "ListAnalysedWord" with "hidNewWordID"] } // ELSE else { // [Update "ullWordID" of the current item of "ListAnalysedWord" with the result of the request] bExist = true; ErrorCode |= objInterbaseManager.First(); ErrorCode |= objInterbaseManager.GetHidDB(0, (int64_t&)pWord->ullWordID); if( ErrorCode != pWord->ullWordID) { pWord->ullWordID = ErrorCode; ErrorCode = INIT_NO_ERROR; } else ErrorCode = INIT_NO_ERROR; // [Update "siOccurrence" = ("siOccurrence"+1) of T_WORD where ("nuIdWord" = "ullWordID")] wsId = _itow( (int)pWord->ullWordID, (wchar_t*)wsId.c_str(), 10); wssRequest.str(L""); wssRequest << UPDATE << WORD_TABLE << SET << WORD_OCCURRENCE << EQ << PB << WORD_OCCURRENCE << INC1 << PE << WHERE << WORD_ID_WORD << EQ << wsId; ErrorCode |= objInterbaseManager.ExecuteRequest(wssRequest.str()); // FI } // OD // [Management of the T_SEG_WORD table] = // DO // [Increment the rank of the word "shWordRank"] shWordRank++; // [Get the new identifier "hidNewSegWordID"of "nuIdSegWord"] if( bExist == false) { ErrorCode |= objInterbaseManager.GetIdentifier(SW_ID_SEG_WORD, hidNewSegWordID); if( ErrorCode != hidNewSegWordID) { hidNewSegWordID = ErrorCode; ErrorCode = INIT_NO_ERROR; } else ErrorCode = INIT_NO_ERROR; // [Insert into the table T_SEG_WORD with "nuIdSegWord"="hidNewSegWordID", "nuIdSeg" = "hidSegmentID", // "nuIdWord" = "ullWordID" of current item of "ListAnalysedWord", "siWordRank"="shWordRank"] wsLnk = _itow( (int)hidNewSegWordID, (wchar_t*)wsLnk.c_str(), 10); wsIdLem = _itow( (int)hidSegmentID, (wchar_t*)wsIdLem.c_str(), 10); wsId = _itow( (int)pWord->ullWordID, (wchar_t*)wsId.c_str(), 10); wsRnk = _itow( (int)shWordRank, (wchar_t*)wsRnk.c_str(), 10); wssRequest.str(L""); wssRequest << INSERT << SW_TABLE << BLANK << PB << SW_ID_SEG_WORD << CO << SW_ID_SEG << CO << SW_ID_WORD << CO << SW_WORD_RANK << PE << VALUES << PB << wsLnk << CO << wsIdLem << CO << wsId << CO << wsRnk << PE; ErrorCode |= objInterbaseManager.ExecuteRequest(wssRequest.str()); } // OD // [Go to the next item of the list "ListAnalysedWord"] ErrorCode |= objInterbaseManager.CommitTransaction(); itListAnalysedWord++; // OD } // [Return ErrorCode] return( ErrorCode); //OD }



    Jean Noël Martin



    mardi 17 décembre 2013 01:51
  • On commence : le 1er pourquoi

    http://fr.wikipedia.org/wiki/Cinq_pourquoi

    Pourquoi une static ??

    Pourquoi une allocation dynamique ??

    Ne pas utiliser de nom de variable aussi floue que "out".

    En plus, c'est le genre de truc qui pose problème avec des MACRO pour les signatures de méthode avec description à la CORBA.

    Sauf implémentation d'un anti-virus, outils d'analyse de code, de détecteur de fuite mémoire, on ne "réserve" jamais de mémoire avec une "protection" spéciales.


    Paul Bacelar, Ex - MVP VC++

    mardi 17 décembre 2013 09:29
    Modérateur
  • j'ai déclaré la variable static pour pouvoir y accéder après la vie de la fonction qui l'initialise.

    J'ai déclarer la fonction  dynamiquement pour être sur qu'il y ait de la place.

    pourquoi je l'ai appelée out, car c'est la sortie d'une variable d'entrée in??? quelle est l'importance de cette remarque?

    L'allocation dynamique semble suspect; mais comment faire autrement?


    Jean Noël Martin

    mardi 17 décembre 2013 10:52
  •  

    "j'ai déclaré la variable static pour pouvoir y accéder après la vie de la fonction qui l'initialise."

    Révisez vos cours, le modifier "static" sur une variable globale ne sert qu'a rendre le "linkage" interne à l'unité de compilation en cours de compilation (le .cpp), en aucun cas à le rendre persistant. Une varaible globale est globale au processus, du début à la fin du processus.

    Le norme C++03 d'ailleur préconise de ne plus utiliser se modifier mais de déclarer ces variables globales cachées du reste du code en utilisant le namespace anonyme.

    "J'ai déclaré la fonction  dynamiquement pour être sur qu'il y ait de la place."

    En déclarant cette variable globale avec un simple "wchar_t g_NomDeVariableToutPourri_out[1024];" aurait déjà alloué la mémoire directement par le chargeur de l'OS.

     

    "pourquoi je l'ai appelée out, car c'est la sortie d'une variable d'entrée in??? quelle est l'importance de cette remarque?"

    in par rapport à quoi ??? out par rapport à quoi ???

    En plus d'être pourris, ces noms sont souvent utilisés dans des MACRO, donc utilisez des nom bien plus explicites.

    "L'allocation dynamique semble suspect; mais comment faire autrement?"

    Inutile, dangereuse, complexe et absolument pas maitriser au vue de vos lacunes sur le C++.

    Une bonne lecture d'un ouvrage de vulgarisation du C++ devrait vous être salutaire.


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 mardi 17 décembre 2013 14:38
    mardi 17 décembre 2013 13:41
    Modérateur