0

ヘッダー ファイルはあまり得意ではありませんが、ヘッダー ファイルを使用してファイルからデータを読み取り、そのデータをメインの cpp ファイルのベクターとして返したいと考えています。

ここに私のreadposcar.hファイルがあります:

#include <fstream>
#include <sstream>
#include <vector>

using namespace std;

int add(void) {

    double a1x, a1y, a1z, a2x, a2y, a2z, a3x, a3y, a3z; // I want all this stuff in vector form
    int i;
    double scale;
    string line; stringstream dum;

    ifstream poscar ("POSCAR");
    for (i=1; i<=5; i++) {
        getline(poscar,line);
        if (i==2) {stringstream dum(line); dum >> scale;}
        if (i==3) {stringstream dum(line); dum >> a1x >> a1y >> a1z;}
        if (i==4) {stringstream dum(line); dum >> a2x >> a2y >> a2z;}
        if (i==5) {stringstream dum(line); dum >> a3x >> a3y >> a3z;}
    }

    vector<double> myvec(3);
    myvec[0] = a1x;
    myvec[1] = a1y;
    myvec[2] = a1z;
    return myvec;
}

ここに私の.cppファイルがあります:

#include <iostream>
#include <fstream>

#include "readposcar.h"

using namespace std;

int main(void) {
    int nbasis = 2;
    int nkpts = 10;
    vector<double> myvec2(3);
    myvec2 = add();
    cout << "No. of k-points: " << nkpts << endl;
    return 0;
}

これは明らかに機能しません。誰かが何が悪いのか、それを機能させるために何をする必要があるのか​​ 教えてもらえますか? 配列全体ではなく、.h ファイルで myvec[2] と言う場合にのみ動作させることができます。

ベクトルが機能しない場合は、配列として使用してもかまいません。ヘッダー ファイル内の配列を一種のグローバル配列として初期化し、それを .cpp ファイル内で呼び出すことはおそらく可能でしょうか?

ここに私が得るエラーがあります:

main.cpp:4:0 からインクルードされたファイル:

readposcar.h: In function ‘int add()’:
readposcar.h:27:9: error: cannot convert ‘std::vector<double>’ to ‘int’ in return
main.cpp: In function ‘int main()’:
main.cpp:12:15: error: no match for ‘operator=’ in ‘myvec2 = add()’
4

3 に答える 3

2

の戻り値の型をaddからintに変更する必要がありますvector<double>

于 2013-06-29T12:21:07.240 に答える
1

正しい型を返していません。試す:

vector<double> add() {
   ...
   return myvec;
}

vectorただし、呼び出し元のスコープ内で参照を個人的に渡し、ブール値の成功を返します (オプション):

bool add(vector<double> &myvec) {
   ...
   return true;
}

C++コンパイラがRVOを使用してコピー操作を最適化できない場合を除き、コストがかかる可能性のあるコピーを回避するためvector、その場合は前のメソッドセマンティクスを使用できます。

(この最後の指摘を指摘してくれた@aryjczykと@AlexBに感謝します)。

于 2013-06-29T12:20:59.790 に答える
0
  1. getline() を呼び出した後に行を解析します。
  2. 解析された各値を double に変換します。
  3. vector で push_back を呼び出して double を追加します。

また、ベクトルへの参照を渡すことを検討してください。

そのため、関数のシグネチャは次のように変更されます。

int add( std::vector<double> & values )

そうすれば、関数から戻るときに不要なコピーを避けることができます。

于 2013-06-29T12:23:58.413 に答える