Bitcoin Forum
May 06, 2024, 02:43:37 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: В чём ошибка?  (Read 5695 times)
dmd (OP)
Member
**
Offline Offline

Activity: 77
Merit: 10


View Profile
February 21, 2015, 04:53:11 PM
 #1

В MSVC Express 2012 пытаюсь собрать riecoin.

При компиляции файла addrman.cpp получаю синтаксическую ошибку в файле addrman.h
Code:
Построение начато 21.02.2015 21:27:11.
     1>Проект "D:\Soft\CoinTest\bitcoinqtmsvc2012-rie\MSVC\libcommon\libcommon.vcxproj" в узле 2 (целевые объекты ClCompile).
     1>ClCompile:
         C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\CL.exe /c /I..\include /I..\..\..\deps /I"..\..\..\deps\openssl-1.0.2\include" /I..\..\src\leveldb\helpers\memenv /I..\..\src\leveldb\helpers /I..\..\src\leveldb\include /I..\..\src\secp256k1\include /I"..\..\..\deps\db-6.1.19\build_windows" /I..\..\..\deps\boost_1_57_0 /I..\..\..\deps\boost_1_57_0\boost /I.\GeneratedFiles /I.\GeneratedFiles\Release /I.\ /Zi /nologo /W1 /WX- /MP /O2 /Oi /D STATICLIB /D USE_UPNP /D _CRT_SECURE_NO_WARNINGS /D UNICODE /D WIN32 /D _SCL_SECURE_NO_WARNINGS /D _WIN32_WINNT=0x0501 /D HAVE_WORKING_BOOST_SLEEP_FOR /D MINIUPNP_STATICLIB /D NOMINMAX /D BOOST_SPIRIT_THREADSAFE /D __STDC_FORMAT_MACROS /D _UNICODE /D UNICODE /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t- /Zc:forScope /Fo"x64\Release\\" /Fd"x64\Release\vc110.pdb" /Gd /TP /errorReport:prompt ..\..\src\addrman.cpp
         addrman.cpp
     1>d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381): error C2143: синтаксическая ошибка: отсутствие ")" перед "{"
     1>d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381): error C2059: синтаксическая ошибка: )
     1>d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
     1>Построение проекта "D:\Soft\CoinTest\bitcoinqtmsvc2012-rie\MSVC\libcommon\libcommon.vcxproj" завершено (целевые объекты ClCompile) с ошибкой.

Сбой построения.

Затраченное время: 00:00:03.42


Тут что-то непонятное со скобками в следующем куске кода
Quote
    IMPLEMENT_SERIALIZE
    (({
        // serialized format:
        // * version byte (currently 0)
        // * nKey
        // * nNew
        // * nTried
        // * number of "new" buckets
        // * all nNew addrinfos in vvNew
        // * all nTried addrinfos in vvTried
        // * for each bucket:
        //   * number of elements
        //   * for each element: index
        //
        // Notice that vvTried, mapAddr and vVector are never encoded explicitly;
        // they are instead reconstructed from the other information.
        //
        // vvNew is serialized, but only used if ADDRMAN_UNKOWN_BUCKET_COUNT didn't change,
        // otherwise it is reconstructed as well.
        //
        // This format is more complex, but significantly smaller (at most 1.5 MiB), and supports
        // changes to the ADDRMAN_ parameters without breaking the on-disk structure.
        {
            LOCK(cs);
            unsigned char nVersion = 0;
            READWRITE(nVersion);
            READWRITE(nKey);
            READWRITE(nNew);
            READWRITE(nTried);

            CAddrMan *am = const_cast<CAddrMan*>(this);
            if (fWrite)
            {
                int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT;
                READWRITE(nUBuckets);
                std::map<int, int> mapUnkIds;
                int nIds = 0;
                for (std::map<int, CAddrInfo>::iterator it = am->mapInfo.begin(); it != am->mapInfo.end(); it++)
                {
                    if (nIds == nNew) break; // this means nNew was wrong, oh ow
                    mapUnkIds[(*it).first] = nIds;
                    CAddrInfo &info = (*it).second;
                    if (info.nRefCount)
                    {
                        READWRITE(info);
                        nIds++;
                    }
                }
                nIds = 0;
                for (std::map<int, CAddrInfo>::iterator it = am->mapInfo.begin(); it != am->mapInfo.end(); it++)
                {
                    if (nIds == nTried) break; // this means nTried was wrong, oh ow
                    CAddrInfo &info = (*it).second;
                    if (info.fInTried)
                    {
                        READWRITE(info);
                        nIds++;
                    }
                }
                for (std::vector<std::set<int> >::iterator it = am->vvNew.begin(); it != am->vvNew.end(); it++)
                {
                    const std::set<int> &vNew = (*it);
                    int nSize = vNew.size();
                    READWRITE(nSize);
                    for (std::set<int>::iterator it2 = vNew.begin(); it2 != vNew.end(); it2++)
                    {
                        int nIndex = mapUnkIds[*it2];
                        READWRITE(nIndex);
                    }
                }
            } else {
                int nUBuckets = 0;
                READWRITE(nUBuckets);
                am->nIdCount = 0;
                am->mapInfo.clear();
                am->mapAddr.clear();
                am->vRandom.clear();
                am->vvTried = std::vector<std::vector<int> >(ADDRMAN_TRIED_BUCKET_COUNT, std::vector<int>(0));
                am->vvNew = std::vector<std::set<int> >(ADDRMAN_NEW_BUCKET_COUNT, std::set<int>());
                for (int n = 0; n < am->nNew; n++)
                {
                    CAddrInfo &info = am->mapInfo[n];
                    READWRITE(info);
                    am->mapAddr[info] = n;
                    info.nRandomPos = vRandom.size();
                    am->vRandom.push_back(n);
                    if (nUBuckets != ADDRMAN_NEW_BUCKET_COUNT)
                    {
                        am->vvNew[info.GetNewBucket(am->nKey)].insert(n);
                        info.nRefCount++;
                    }
                }
                am->nIdCount = am->nNew;
                int nLost = 0;
                for (int n = 0; n < am->nTried; n++)
                {
                    CAddrInfo info;
                    READWRITE(info);
                    std::vector<int> &vTried = am->vvTried[info.GetTriedBucket(am->nKey)];
                    if (vTried.size() < ADDRMAN_TRIED_BUCKET_SIZE)
                    {
                        info.nRandomPos = vRandom.size();
                        info.fInTried = true;
                        am->vRandom.push_back(am->nIdCount);
                        am->mapInfo[am->nIdCount] = info;
                        am->mapAddr[info] = am->nIdCount;
                        vTried.push_back(am->nIdCount);
                        am->nIdCount++;
                    } else {
                        nLost++;
                    }
                }
                am->nTried -= nLost;
                for (int b = 0; b < nUBuckets; b++)
                {
                    std::set<int> &vNew = am->vvNew;
                    int nSize = 0;
                    READWRITE(nSize);
                    for (int n = 0; n < nSize; n++)
                    {
                        int nIndex = 0;
                        READWRITE(nIndex);
                        CAddrInfo &info = am->mapInfo[nIndex];
                        if (nUBuckets == ADDRMAN_NEW_BUCKET_COUNT && info.nRefCount < ADDRMAN_NEW_BUCKETS_PER_ADDRESS)
                        {
                            info.nRefCount++;
                            vNew.insert(nIndex);
                        }
                    }
                }
            }
        }
    });
)


На первый взгляд как-бы лишние скобки и точка-с-запятой, показал красным. Если убираю их, то получаю
Code:
Построение начато 21.02.2015 21:47:48.
     1>Проект "D:\Soft\CoinTest\bitcoinqtmsvc2012-rie\MSVC\libcommon\libcommon.vcxproj" в узле 2 (целевые объекты ClCompile).
     1>ClCompile:
         C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\CL.exe /c /I..\include /I..\..\..\deps /I"..\..\..\deps\openssl-1.0.2\include" /I..\..\src\leveldb\helpers\memenv /I..\..\src\leveldb\helpers /I..\..\src\leveldb\include /I..\..\src\secp256k1\include /I"..\..\..\deps\db-6.1.19\build_windows" /I..\..\..\deps\boost_1_57_0 /I..\..\..\deps\boost_1_57_0\boost /I.\GeneratedFiles /I.\GeneratedFiles\Release /I.\ /Zi /nologo /W1 /WX- /MP /O2 /Oi /D STATICLIB /D USE_UPNP /D _CRT_SECURE_NO_WARNINGS /D UNICODE /D WIN32 /D _SCL_SECURE_NO_WARNINGS /D _WIN32_WINNT=0x0501 /D HAVE_WORKING_BOOST_SLEEP_FOR /D MINIUPNP_STATICLIB /D NOMINMAX /D BOOST_SPIRIT_THREADSAFE /D __STDC_FORMAT_MACROS /D _UNICODE /D UNICODE /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t- /Zc:forScope /Fo"x64\Release\\" /Fd"x64\Release\vc110.pdb" /Gd /TP /errorReport:prompt ..\..\src\addrman.cpp
         addrman.cpp
     1>d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381): warning C4002: слишком много фактических параметров для макроопределения "IMPLEMENT_SERIALIZE"
     1>..\..\src\addrman.cpp(528): fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка "{" в "d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381)"
     1>Построение проекта "D:\Soft\CoinTest\bitcoinqtmsvc2012-rie\MSVC\libcommon\libcommon.vcxproj" завершено (целевые объекты ClCompile) с ошибкой.

Сбой построения.

Затраченное время: 00:00:03.38


Не понятно, почему так? Ошибка в коде или среда MSVC не справляется с таким вариантом набора скобок? Исходники riecoin явно валидные, в Линуксе они собираются.

Remember that Bitcoin is still beta software. Don't put all of your money into BTC!
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
ish
Full Member
***
Offline Offline

Activity: 176
Merit: 106


View Profile
March 01, 2015, 08:52:10 AM
 #2

В MSVC Express 2012

Наверняка что-то новомодное:
http://blogs.msdn.com/b/vcblog/archive/2014/06/11/c-11-14-feature-tables-for-visual-studio-14-ctp1.aspx
http://blogs.msdn.com/b/vcblog/archive/2014/11/17/c-11-14-17-features-in-vs-2015-preview.aspx

почему ты у нас спрашиваешь, спроси у автора - багу ему создай в багтрекере, пусть он ответит
dmd (OP)
Member
**
Offline Offline

Activity: 77
Merit: 10


View Profile
March 12, 2015, 01:26:41 PM
 #3

Если погуглить по обоим кодам варнинга и ошибки C4002 C1075, то находится статья про чудесатые макросы и запятую, которую нельзя использовать в таких макросах вне круглых скобок.

Т.е. причина была в этой строчке:
Code:
std::map<int, int> mapUnkIds;

В итоге я эту строчку заменил на
Code:
MapUnkIds mapUnkIds;

и перед макросом IMPLEMENT_SERIALIZE описал тип
Code:
typedef std::map<int, int> MapUnkIds;


Стало собираться без ошибок. Впрочем мне это не помогло, т.к. при запуске riecoind вываливается в ошибку. Куда теперь копать не знаю, охота было научиться собирать riecoin в MSVC.
dmd (OP)
Member
**
Offline Offline

Activity: 77
Merit: 10


View Profile
March 13, 2015, 11:33:31 AM
 #4

Как поправить следующую ошибку?:

Code:
1>------ Сборка начата: проект: riecoin-qt, Конфигурация: Release x64 ------
1>  paymentrequestplus.cpp
1>..\..\src\qt\paymentrequestplus.cpp(203): error C2664: "CScript::CScript(const std::vector<unsigned char,std::allocator<_Ty>> &)": невозможно преобразовать аргумент 1 из "const unsigned char *" в "std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<unsigned char>>>"
1>          with
1>          [
1>              _Ty=unsigned char
1>          ]
1>          Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========


Эта ошибка возникает в строчке
Code:
        CScript s(scriptStr, scriptStr+details.outputs(i).script().size());
в этом коде
Code:
QList<std::pair<CScript,qint64> > PaymentRequestPlus::getPayTo() const
{
    QList<std::pair<CScript,qint64> > result;
    for (int i = 0; i < details.outputs_size(); i++)
    {
        const unsigned char* scriptStr = (const unsigned char*)details.outputs(i).script().data();
        CScript s(scriptStr, scriptStr+details.outputs(i).script().size());
        result.append(make_pair(s, details.outputs(i).amount()));
    }
    return result;
}
CodeIN
Newbie
*
Offline Offline

Activity: 21
Merit: 0


View Profile
March 15, 2015, 01:18:39 PM
 #5

А в какой среде компилируешь?
dmd (OP)
Member
**
Offline Offline

Activity: 77
Merit: 10


View Profile
March 15, 2015, 06:07:36 PM
 #6

MSVC 2013
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!