Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何初始化并返回c+中的数组+;头文件?_C++_Return Value_Header Files - Fatal编程技术网

C++ 如何初始化并返回c+中的数组+;头文件?

C++ 如何初始化并返回c+中的数组+;头文件?,c++,return-value,header-files,C++,Return Value,Header Files,我不太擅长使用头文件,但我想使用头文件从文件中读取数据,并将数据作为向量返回到主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

我不太擅长使用头文件,但我想使用头文件从文件中读取数据,并将数据作为向量返回到主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;
}
#包括
#包括
#包括
使用名称空间std;
整数加(空){
双重a1x,a1y,a1z,a2x,a2y,a2z,a3x,a3y,a3z;//我想要所有这些向量形式的东西
int i;
双尺度;
弦线;
ifstream poscar(“poscar”);
对于(i=1;i>scale;}
如果(i==3){stringstream dum(line);dum>>a1x>>a1y>>a1z;}
如果(i==4){stringstream dum(line);dum>>a2x>>a2y>>a2z;}
如果(i==5){stringstream dum(line);dum>>a3x>>a3y>>a3z;}
}
载体myvec(3);
myvec[0]=a1x;
myvec[1]=a1y;
myvec[2]=a1z;
返回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;
}
#包括
#包括
#包括“readposcar.h”
使用名称空间std;
内部主(空){
int-nbasis=2;
int-nkpts=10;
载体myvec2(3);
myvec2=add();

无法返回正确的类型。请尝试:

vector<double> add() {
   ...
   return myvec;
}
<>避免拷贝“代码>向量”,这可能是昂贵的,除非C++编译器能够使用优化复制操作,在这种情况下,可以使用前一种方法语义。
(感谢@aryjczyk和@AlexB指出最后一点)。

您没有返回正确的类型。请尝试:

vector<double> add() {
   ...
   return myvec;
}
<>避免拷贝“代码>向量”,这可能是昂贵的,除非C++编译器能够使用优化复制操作,在这种情况下,可以使用前一种方法语义。
(感谢@aryjczyk和@AlexB指出最后一点)。

您应该将
add
的返回类型从
int
更改为
vector

您应该将
add
的返回类型从
int
更改为
vector

  • 在调用getline()后分析该行
  • 将每个解析的值转换为double
  • 调用vector上的push_以添加双精度
  • 也可以考虑将引用传递给向量。

    因此,函数的签名将更改为:

    int add( std::vector<double> & values )
    
    intadd(标准::向量和值)
    
    这样可以避免从函数返回时进行不必要的复制

  • 在调用getline()后分析该行
  • 将每个解析的值转换为double
  • 调用vector上的push_以添加双精度
  • 也可以考虑将引用传递给向量。

    因此,函数的签名将更改为:

    int add( std::vector<double> & values )
    
    intadd(标准::向量和值)
    

    这样可以避免从函数返回时进行不必要的复制。

    这对我很有效。感谢大家的快速回复!.std::vector add(void){…return myvec;}您可能会后悔将“使用命名空间std;”这对我来说很有用。谢谢大家的快速回复!.std::vector add(void){…return myvec;}你可能会后悔放了“using namespace std;”在headercompiler中,它将删除副本,称为RVO。传递输出参数很难看,如果不能,请避免使用。如果您使用的编译器不超过10年,您应该绝对按值返回。它将是RVO或移动构造函数。谢谢各位;我编辑了我的答案,以提及RVO的使用。编译器将elide副本称为RVO。传递输出参数很难看,如果不能,请避免使用。如果您使用的编译器不超过10年,则绝对应该按值返回。它将是RVO或移动构造函数。谢谢各位;我编辑了我的答案,以提及RVO.Nope的使用。继续并按值返回。@aschelper、 不管你喜欢与否,使用引用比按值返回向量更有效。你不能100%肯定编译器会执行RVO。有了引用,毫无疑问会发生什么。有了C++11,你可以100%肯定它不会调用复制构造函数。不。继续,按值返回。@aschelper,不管你喜欢与否,这是正确的使用引用比按值返回向量更有效。您不能100%确定编译器将执行RVO。使用引用毫无疑问会发生什么。使用C++11,您可以100%确定它不会调用复制构造函数。