Bitcoin Forum
November 23, 2017, 11:59:47 AM *
News: Latest stable version of Bitcoin Core: 0.15.1  [Torrent].
 
   Home   Help Search Donate Login Register  
Pages: [1]
  Print  
Author Topic: В чём ошибка?  (Read 5603 times)
dmd
Member
**
Offline Offline

Activity: 77


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 явно валидные, в Линуксе они собираются.

1511438387
Hero Member
*
Offline Offline

Posts: 1511438387

View Profile Personal Message (Offline)

Ignore
1511438387
Reply with quote  #2

1511438387
Report to moderator
1511438387
Hero Member
*
Offline Offline

Posts: 1511438387

View Profile Personal Message (Offline)

Ignore
1511438387
Reply with quote  #2

1511438387
Report to moderator
1511438387
Hero Member
*
Offline Offline

Posts: 1511438387

View Profile Personal Message (Offline)

Ignore
1511438387
Reply with quote  #2

1511438387
Report to moderator
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
1511438387
Hero Member
*
Offline Offline

Posts: 1511438387

View Profile Personal Message (Offline)

Ignore
1511438387
Reply with quote  #2

1511438387
Report to moderator
1511438387
Hero Member
*
Offline Offline

Posts: 1511438387

View Profile Personal Message (Offline)

Ignore
1511438387
Reply with quote  #2

1511438387
Report to moderator
ish
Full Member
***
Offline Offline

Activity: 201


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
Member
**
Offline Offline

Activity: 77


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
Member
**
Offline Offline

Activity: 77


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: 22


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

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

Activity: 77


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

MSVC 2013
Pages: [1]
  Print  
 
Jump to:  

Sponsored by , a Bitcoin-accepting VPN.
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!