2013-06-29 3 views
0

헤더 파일은별로 좋지 않지만 헤더 파일을 사용하여 파일의 데이터를 읽고 기본 cpp 파일의 벡터로 데이터를 반환하려고합니다.C++ 헤더 파일에서 배열을 초기화하고 반환하는 방법은 무엇입니까?

#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; 
} 

이 분명히 작동하지 않습니다

#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 파일입니다 :

여기 내 readposcar.h 파일입니다. 누군가가 잘못된 것이 무엇인지와 내가 제대로 작동하도록하기 위해해야 ​​할 일에 대해 조언 해 줄 수 있습니까? 나는 내가 .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()’ 
+0

이것은 나를 위해 일했습니다. 빠른 답장을 보내 주셔서 감사합니다!. std :: vector add (void) { ... return myvec; } –

+0

당신은 "using namespace std;"를 쓰는 것을 후회할 것입니다. 헤더 – doctorlove

답변

1

는 여기에 내가 얻을 오류입니다. (선택 사항) 부울 성공을

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

그러나 나는 개인적으로 발신자의 범위 내에서 vector에 대한 참조를 전달할 것이다 반환 : 시도

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

을 즉 vector하는 복사 방지로 C++ 컴파일러가 RVO을 사용하여 복사 작업을 최적화 할 수없는 경우 비용이 많이 드는 경우가 있습니다.이 경우 이전 메서드 의미를 사용할 수 있습니다.

(감사합니다. @aryjczyk 및 @AlexB가이 마지막 지점을 지적했습니다.)

+1

컴파일러에서 복사본을 삭제합니다. RVO라고합니다.출력 인수를 전달하는 것은 추악합니다. 가능한 경우 수행하지 마십시오. – aryjczyk

+1

아니요, 아니요, 아니요, 아니요. 10 년이 넘지 않은 컴파일러를 사용하고 있다면 절대적으로 가치가 있어야합니다. RVO 또는 이동 생성자 중 하나입니다. –

+0

감사합니다; 나는 RVO의 사용법을 언급하기 위해 나의 대답을 편집했다. – trojanfoe

2

당신은의 getline을 호출 한 후 행을 구문 분석 vector<double>

0
  1. int에서 add의 반환 형식을 변경해야합니다().
  2. 각 구문 분석 된 값을 double로 변환합니다.
  3. 벡터에 push_back을 호출하여 double을 추가합니다.

또한 벡터에 대한 참조를 전달하는 것을 고려하십시오.

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

함수에서 반환 할 때 불필요한 복사를 방지 할 그런 식 :

때문에, 함수의 서명을 변경합니다.

+0

Nope. 가치에 따라 돌아가십시오. – aschepler

+0

@aschelper, 좋든 싫든, 값으로 벡터를 반환하는 것보다 참조를 사용하는 것이 더 효율적입니다. 컴파일러가 RVO를 수행하는지 100 % 확신 할 수는 없습니다. 참고로 어떤 일이 일어날 지 의심의 여지가 없습니다. – user1764961

+0

C++ 11을 사용하면 복사 생성자를 호출하지 않을 것입니다. – aschepler

관련 문제