Title: В чём ошибка? Post by: dmd on February 21, 2015, 04:53:11 PM В MSVC Express 2012 пытаюсь собрать riecoin (https://github.com/riecoin/riecoin/archive/0.10.2.zip).
При компиляции файла addrman.cpp получаю синтаксическую ошибку в файле addrman.h Code: Построение начато 21.02.2015 21:27:11. Тут что-то непонятное со скобками в следующем куске кода 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. Не понятно, почему так? Ошибка в коде или среда MSVC не справляется с таким вариантом набора скобок? Исходники riecoin явно валидные, в Линуксе они собираются. Title: Re: В чём ошибка? Post by: ish on March 01, 2015, 08:52:10 AM В 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 почему ты у нас спрашиваешь, спроси у автора - багу ему создай в багтрекере, пусть он ответит Title: Re: В чём ошибка? Post by: dmd on March 12, 2015, 01:26:41 PM Если погуглить по обоим кодам варнинга и ошибки C4002 C1075, то находится статья (http://rsdn.ru/forum/cpp/2904863.1) про чудесатые макросы и запятую, которую нельзя использовать в таких макросах вне круглых скобок.
Т.е. причина была в этой строчке: Code: std::map<int, int> mapUnkIds; В итоге я эту строчку заменил на Code: MapUnkIds mapUnkIds; и перед макросом IMPLEMENT_SERIALIZE описал тип Code: typedef std::map<int, int> MapUnkIds; Стало собираться без ошибок. Впрочем мне это не помогло, т.к. при запуске riecoind вываливается в ошибку. Куда теперь копать не знаю, охота было научиться собирать riecoin в MSVC. Title: Re: В чём ошибка? Post by: dmd on March 13, 2015, 11:33:31 AM Как поправить следующую ошибку?:
Code: 1>------ Сборка начата: проект: riecoin-qt, Конфигурация: Release x64 ------ Эта ошибка возникает в строчке Code: CScript s(scriptStr, scriptStr+details.outputs(i).script().size()); Code: QList<std::pair<CScript,qint64> > PaymentRequestPlus::getPayTo() const Title: Re: В чём ошибка? Post by: CodeIN on March 15, 2015, 01:18:39 PM А в какой среде компилируешь?
Title: Re: В чём ошибка? Post by: dmd on March 15, 2015, 06:07:36 PM MSVC 2013
|