通过引用传递的 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&lt;float&gt; Column1(start,end); 更改为Column1.assign(start, end); 不需要手动关闭inp,它会在超出范围时自动关闭。您也不需要向ifstream 提供ios::in 标志。 我将 std::vector Column1(start,end) 更改为 std::vector Column1.assign(start,end) 并且它不会编译。我必须将它写为 std::vector Column1,然后在下一行 Column1.assign(start,end)。但是即使它编译了,它仍然没有将数组传递给主程序。 你根本不需要写std::vector&lt;float&gt;,因为你不想创建一个新的向量变量,而是使用现有的。 RADAR 没有说要在类定义中使其成为公共变量。这个问题与public和private无关。 【参考方案1】:

你在函数内部声明了一个局部变量std::vector&lt;float&gt; 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 的问题

通过引用返回通过引用传递的向量的实用程序

将本地 std::vector 分配给 C++ 中的引用

将临时右值绑定到 std::vector 构造函数中的引用左值

std::thread 通过引用传递向量元素

将向量作为对递归函数的引用传递