0

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

    #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() 中。但是 rots 给出了顺序的垃圾值(e^-42)。请在这里帮助我。

4

1 回答 1

3

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

您不能从函数返回多个值。

return rots, trans;

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

(rots, trans) = readctrls();

同样,这trans仅分配给,rots将未初始化。

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

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. 不要使用原始数组。std::vector<T>通常T *在 C++ 中是首选。

  2. 仅仅为了计算行数而读取整个文件,然后再次读取它以实际解析其内容,这是非常浪费的。如果您使用std::vector<double>,您可以vector.push_back(some_double);按照原样进行,因此您不必遍历文件两次(您知道,I/O 很昂贵,尤其是在文件很大的情况下)。

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

于 2013-05-11T05:08:33.173 回答