Bitcoin Forum
October 19, 2018, 07:06:05 PM *
News: Make sure you are not using versions of Bitcoin Core other than 0.17.0 [Torrent], 0.16.3, 0.15.2, or 0.14.3. More info.
 
   Home   Help Search Donate Login Register  
Pages: [1]
  Print  
Author Topic: В чём ошибка?  (Read 5622 times)
dmd
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 явно валидные, в Линуксе они собираются.

No Gods or Kings. Only Bitcoin
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
1539975965
Hero Member
*
Offline Offline

Posts: 1539975965

View Profile Personal Message (Offline)

Ignore
1539975965
Reply with quote  #2

1539975965
Report to moderator
1539975965
Hero Member
*
Offline Offline

Posts: 1539975965

View Profile Personal Message (Offline)

Ignore
1539975965
Reply with quote  #2

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

Activity: 180
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
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
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: 22
Merit: 0


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

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

Activity: 77
Merit: 10


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!