C++ 从函数返回指针。一个指针的值未更新

C++ 从函数返回指针。一个指针的值未更新,c++,pointers,function-pointers,C++,Pointers,Function Pointers,我试图从一个函数中获取2个指针,并在main中打印它。含糊不清的是,一个指针似乎恢复了它的值,而另一个指针没有。两个指针在调用函数中都有正确的值,就在返回之前。请告诉我,您是否可以识别任何阻止我获得正确答案的编程错误 #include<iostream> #include<fstream> #include<stdio.h> #include<string.h> #include<stdlib.h>

我试图从一个函数中获取2个指针,并在main中打印它。含糊不清的是,一个指针似乎恢复了它的值,而另一个指针没有。两个指针在调用函数中都有正确的值,就在返回之前。请告诉我,您是否可以识别任何阻止我获得正确答案的编程错误

    #include<iostream>
    #include<fstream>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>

    using namespace std;
    double* readctrls()
    {
         fstream inputs;
         inputs.open("input_coods.txt");
         int nol = 0,i = 0;
         string line,temp,subtemptrans,subtemprots;
         while(getline(inputs,line))
         {
                ++nol;
         }
//      cout<<nol<<endl;
        inputs.close();
        inputs.open("input_coods.txt");
        string *lines = new (nothrow) string[nol];
        double* trans = new double[nol];
        double* rots = new double[nol];
        trans[0] =float(nol);
        for(int i = 0; i<nol ; i++)
        {
                getline(inputs,lines[i]);
        //      cout<<lines[i]<<endl;
                temp = lines[i];
//              cout<<temp<<endl;
                for(int j = 0; j<temp.length() ; j++)
                {
                        if(temp.at(j) == ' ')
                        {
                                subtemptrans = temp.substr(0,j);
                                subtemprots = temp.substr(j+1,temp.length()-j);
        //                      cout<<subtemprots<<endl;
                                *(trans+i+1) = ::atof(subtemptrans.c_str());
                                *(rots+i) = float(atoi(subtemprots.c_str()));
                        //      cout<<rots[i]<<endl;
                        }
                }
        }                       
        inputs.close();         
//      cout<<rots[2]<<endl;    
        return(rots,trans);                                    
}                               

int main()                              
{                               
        double *trans,*rots;                                   
        (rots,trans) = readctrls();                            
//      cout<<sizeof(trans)<<endl;
        for(int i=0;i<trans[0];i++)
        {                                                      
                cout<<*(trans+i)<<endl;
                cout<<*(rots+i)<<endl;
        }                                                      
}                       
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
双*readctrls()
{
流输入;
inputs.open(“input_coods.txt”);
int nol=0,i=0;
字符串行、temp、subtemptrans、subtemprot;
while(getline(输入,行))
{
++nol;
}

//C++既不是Python也不是Lua。

不能从函数返回多个值

return rots, trans;
这是逗号运算符-计算其操作数并生成最后一个(最右边的)操作数

同样,这只分配给
trans
rot
将被取消初始化

解决方案:您可以返回包含两个指针的结构,或者通过引用传递它们,或者其他任何方式

struct Foo {
    double *rots;
    double *trans;
};

Foo readctrls()
{
    // ...

    Foo r;
    r.rots = rots;
    r.trans = trans;
    return r;
}
或:


其他备注:

< > >不要使用原始数组。<代码> STD::vector < /COD>通常优于C++中的<代码> t*<代码>。

  • 仅仅为了数数行而读取整个文件,然后再次读取以实际解析其内容是非常浪费的。如果您使用
    std::vector
    ,您可以只
    vector。沿着行向后推(一些双);
    ,这样您就不必遍历文件两次(您知道,I/O非常昂贵,尤其是当文件很大时)

  • 您从不
    删除
    使用
    new
    分配的指针-在这里,您的程序会泄漏内存


  • C++既不是Python也不是Lua。

    不能从函数返回多个值

    return rots, trans;
    
    这是逗号运算符-计算其操作数并生成最后一个(最右边的)操作数

    同样,这只分配给
    trans
    rot
    将被取消初始化

    解决方案:您可以返回包含两个指针的结构,或者通过引用传递它们,或者其他任何方式

    struct Foo {
        double *rots;
        double *trans;
    };
    
    Foo readctrls()
    {
        // ...
    
        Foo r;
        r.rots = rots;
        r.trans = trans;
        return r;
    }
    
    或:


    其他备注:

    < > >不要使用原始数组。<代码> STD::vector < /COD>通常优于C++中的<代码> t*<代码>。

  • 仅仅为了数数行而读取整个文件,然后再次读取以实际解析其内容是非常浪费的。如果您使用
    std::vector
    ,您可以只
    vector。沿着行向后推(一些双);
    ,这样您就不必遍历文件两次(您知道,I/O非常昂贵,尤其是当文件很大时)

  • 您从不
    删除
    使用
    new
    分配的指针-在这里,您的程序会泄漏内存


  • 我知道你返回
    (rot,trans)
    (实际上是抛出
    rot
    ,只返回
    trans
    )肯定有特定的原因.但就我个人而言,我不明白为什么。我猜内存泄漏是一种额外的好处?但真正的问题是,由于
    std::vector
    完全由您支配,为什么您首先要手动动态分配任何内容?您可能会惊讶于使用流提取和标准库时这些代码中有多少消失了我更感兴趣的是你为什么要做出假设。如果你还不懂语言,那就好了,但是如果你不读RTFM,那就不好了。谢谢你的输入。我知道我的C++知识不如URS好。对不起,我没有你这样擅长。但是我在这里尝试,所以我请求帮助。我道歉。f它让你很恼火,因为c是一个如此愚蠢的东西。@WhozCraig我想要两个值,所以我返回了它,但现在我明白了返回不是那样工作的。从中我学到了一些东西,谢谢。我将研究vector,看看如何根据它的工作原理修改代码。再次感谢你的输入。@H2CO3我不明白你所说的assumpti是什么意思ons。请您详细说明。抱歉问。@H2CO3我理解。在请求帮助之前,我会确保做所有事情并自己解决。谢谢:)。我知道您返回
    (rots,trans)
    (它基本上抛出
    rots
    ,只返回
    trans
    ).但就我个人而言,我不明白为什么。我猜内存泄漏是一种额外的好处?但真正的问题是,由于
    std::vector
    完全由您支配,为什么您首先要手动动态分配任何内容?您可能会惊讶于使用流提取和标准库时这些代码中有多少消失了我更感兴趣的是你为什么要做出假设。如果你还不懂语言,那就好了,但是如果你不读RTFM,那就不好了。谢谢你的输入。我知道我的C++知识不如URS好。对不起,我没有你这样擅长。但是我在这里尝试,所以我请求帮助。我道歉。f它让你很恼火,因为c是一个如此愚蠢的东西。@WhozCraig我想要两个值,所以我返回了它,但现在我明白了返回不是那样工作的。从中我学到了一些东西,谢谢。我将研究vector,看看如何根据它的工作原理修改代码。再次感谢你的输入。@H2CO3我不明白你所说的assumpti是什么意思ons。请您详细说明。抱歉问。@H2CO3我理解。我会确保在请求帮助之前做所有事情并自己解决。谢谢:)。非常感谢您的回答!从中获得了大量信息。也感谢您的耐心。非常感谢您的回答!从中获得了大量信息。感谢您的耐心