通过引用传递的 std::vector 不是从函数传递到 main()
Posted
技术标签:
【中文标题】通过引用传递的 std::vector 不是从函数传递到 main()【英文标题】:std::vector passed by reference is not passing from a function to main() 【发布时间】:2014-11-09 03:44:33 【问题描述】:此问题与已在此处发布的其他一些问题非常相似,但是,当我实施以前建议的解决方案时,它似乎不起作用。我正在编写一些简单的软件,可用于从函数中的 .txt 文件中读取一列或多列数据,并将其传递给主程序以进行进一步计算。函数调用将文件名传递给函数并读入数据。由于这个版本只读取一列数据,我可以在这个特定示例中使用返回函数,但我计划将其扩展为读取多列数据,这就是我使用 void 函数的原因。测试数据列如下图。
103.816
43.984
2214.5
321.5
615.8
8.186
37.6
函数 Read_File 中的 for 循环从文件中读回数据完美地表明该函数工作正常并正确读取数据。但是,当我尝试在主程序中使用相同的 for 循环显示相同的数据时,我得到一个 EXEC_BAD_ACCESS 错误。需要明确的是,程序编译得很好,但它没有将数据传递给主程序,这表明存在指针问题。我哪里错了?任何帮助将不胜感激。
#include <vector>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <iterator>
class Read_Columnar_File
public:
void Read_File(const std::string& file_name,std::vector<float>& Column1);
;
#include <iostream>
int main(int argc, const char * argv[])
int i;
std::vector<float> Column2;
Read_Columnar_File File1;
char str[20];
std::strcpy(str,"Test.txt");
File1.Read_File(str,Column2);
std::cout << std::endl;
for(i = 0; i < 7; i++) std::cout << Column2[i];
void Read_Columnar_File::Read_File(const std::string& file_name,std::vector<float>& Column1)
int i;
std::ifstream inp(file_name,std::ios::in | std::ios::binary);
if(inp.is_open())
std::istream_iterator<float> start((inp)), end;
std::vector<float> Column1(start,end);
for(i=0; i < 7; i++) std::cout << Column1[i] << std::endl;
else std::cout << "Cannot Open " << file_name << std::endl;
inp.close();
【问题讨论】:
Read_File
实现声明并操作了一个名为 Column1
的局部变量。它从不接触同名的参数。这两个变量是不同且不相关的。将std::vector<float> Column1(start,end);
更改为Column1.assign(start, end);
不需要手动关闭inp
,它会在超出范围时自动关闭。您也不需要向ifstream
提供ios::in
标志。
我将 std::vectorstd::vector<float>
,因为你不想创建一个新的向量变量,而是使用现有的。
RADAR 没有说要在类定义中使其成为公共变量。这个问题与public和private无关。
【参考方案1】:
你在函数内部声明了一个局部变量std::vector<float> Column1(start,end);
局部变量被赋值,所以实际向量没有更新。
【讨论】:
谢谢,这么简单的事情就忘记了public和private的区别。【参考方案2】:这将解决问题。 column1 是本地声明的。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
class Read_Columnar_File
public:
void Read_File(const std::string& file_name, std::vector<float>& Column1);
;
int main(int argc, const char * argv[])
int i;
std::vector<float> Column2;
Read_Columnar_File File1;
char str[20];
std::strcpy(str, "Test.txt");
File1.Read_File(str, Column2);
std::cout << std::endl;
for (i = 0; i < 7; i++) std::cout << Column2[i];
void Read_Columnar_File::Read_File(const std::string& file_name, std::vector<float>& Column1)
int i;
std::ifstream inp(file_name, std::ios::in | std::ios::binary);
if (inp.is_open())
std::istream_iterator<float> start((inp)), end;
Column1.assign(start, end);
for (i = 0; i < 7; i++) std::cout << Column1[i] << std::endl;
else std::cout << "Cannot Open " << file_name << std::endl;
inp.close();
【讨论】:
以上是关于通过引用传递的 std::vector 不是从函数传递到 main()的主要内容,如果未能解决你的问题,请参考以下文章
通过使用 pybind11 的虚函数通过引用传递 std::vector 的问题