2017-06-15 34 views
0

私は、Linuxからのウィンドウにこの機能ポートにしようとしています:C++: '定数に評価されない'

template<class TDescriptor, class F> 
bool TemplatedVocabulary<TDescriptor,F>::loadFromBinaryFile(const std::string &filename) { 
    fstream f; 
    f.open(filename.c_str(), ios_base::in|ios::binary); 
    unsigned int nb_nodes, size_node; 
    f.read((char*)&nb_nodes, sizeof(nb_nodes)); 
    f.read((char*)&size_node, sizeof(size_node)); 
    f.read((char*)&m_k, sizeof(m_k)); 
    f.read((char*)&m_L, sizeof(m_L)); 
    f.read((char*)&m_scoring, sizeof(m_scoring)); 
    f.read((char*)&m_weighting, sizeof(m_weighting)); 
    createScoringObject(); 

    m_words.clear(); 
    m_words.reserve(pow((double)m_k, (double)m_L + 1)); 
    m_nodes.clear(); 
    m_nodes.resize(nb_nodes+1); 
    m_nodes[0].id = 0; 
    char buf[size_node];// fails 

    int nid = 1; 
    while (!f.eof()) { 
    f.read(buf, size_node); 
    m_nodes[nid].id = nid; 
    // FIXME 
    const int* ptr=(int*)buf; 
    m_nodes[nid].parent = *ptr; 
    //m_nodes[nid].parent = *(const int*)buf; 
    m_nodes[m_nodes[nid].parent].children.push_back(nid); 
    m_nodes[nid].descriptor = cv::Mat(1, F::L, CV_8U); 
    memcpy(m_nodes[nid].descriptor.data, buf+4, F::L); 
    m_nodes[nid].weight = *(float*)(buf+4+F::L); 
    if (buf[8+F::L]) { // is leaf 
     int wid = m_words.size(); 
     m_words.resize(wid+1); 
     m_nodes[nid].word_id = wid; 
     m_words[wid] = &m_nodes[nid]; 
    } 
    else 
     m_nodes[nid].children.reserve(m_k); 
    nid+=1; 
    } 
    f.close(); 
    return true; 
} 

この行は:

char buf[size_node];

はしませんコンパイルし、エラーを返します。

expression did not evaluate to a constant。私が使って試してみました

std::vector<char> buf(size_node)

と:

char buf[size_node] = new char[];

が、私は同じエラーを参照してください。

Tuple std::get() Not Working for Variable-Defined Constant

しかし、私はこのような場合には、それを回避する方法がわからないです。これは、コンパイル時定数対一定の実行時間に関係しているようですここでの回答で述べたように、そうです。ありがとうございました。

+6

GCCとなるべき標準C++にはないが、(あなたが持っているものである)拡張機能として可変長配列をサポートしています。このため、 '-pedantic'で常にビルドする必要があります。どのように 'vector'を試したのか分かりませんが、うまくいくはずです。 – StoryTeller

+4

C++には[可変長配列](https://en.wikipedia.org/wiki/Variable-length_array)はありません。いくつかのコンパイラは、言語の*拡張子*としてそれを追加します。代わりに['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)を使用してください。 –

+4

他にもいくつかあります:配列インデックスはゼロベースです*。 'size_node'要素の配列(またはベクトル)は' 0'から 'size_node_1'(両端を含む)までのインデックスを持ちます。次に、[なぜループ状態の中のiostream :: eofが間違っていると考えられますか?](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) –

答えて

4

それは

char *buf = new char[size_node]; 

は、使用後にメモリを削除することを忘れないでくださいする必要があります。

または、ちょうどstd::vectorを使用してください。はるかに安全です。

std::vector<char> buf(size_node); 

その後、あなたはどのように使われるかbuf変更する必要があると思います。たとえば:

f.read(buf, size_node); 

f.read(buf.data(), size_node); //Only C++11 
+2

自分のメモリ割り当てをクリーンアップして何らかの理由でvectorを使いたくない人は、 'auto buf = std :: make_unique (size_node);'のようなことをすることができます。普通の配列のように扱うことはできません。 – Rook

+0

ありがとうございました!完璧。 – anti

+0

@anti:この回答が正しい場合は、正しいと記入してください。 – nakiya

関連する問題