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

时间:2013-05-11 05:05:29

标签: c++ pointers function-pointers

我试图从函数中获取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;
        }                                                      
}                       

Trans的值在内存中写得很好,并且完全保留在main()中。但腐烂正在给出订单的垃圾值(e ^ -42)。请帮帮我。

1 个答案:

答案 0 :(得分:3)

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

您无法从函数返回多个值。

return rots, trans;

这是逗号运算符 - 计算其操作数并产生最后一个(最右边的)操作数。

(rots, trans) = readctrls();

同样,这仅指定给transrots将被取消初始化。

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

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

Foo readctrls()
{
    // ...

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

或:

void readctrls(double *&r, double *&t)
{
    // ...

    r = rots;
    t = trans;
}

其他评论:

  1. 不要使用原始数组。 {C}内std::vector<T>通常优先于T *

  2. 超级浪费读取整个文件只是为了计算行数,然后再次读取它以实际解析其内容。如果你使用了std::vector<double>,那么你可以只是vector.push_back(some_double);,所以你不必两次浏览文件(你知道,I / O很贵,特别是如果文件很大)。

  3. 您永远不会delete使用new分配的指针 - 此处您的程序会泄漏内存。