我在理解和使用指针方面相当薄弱。所以,请在这里帮助我。
我的目标是将数组指针的地址传递给函数,(即)指针指向的地址,并使用函数中的'*'运算符直接在地址中更新值,以避免任何返回值。而且,该数组的长度必须在传递函数中动态改变。这是我的尝试。如果有更好的方法来更新变量的值,而不是从函数返回,请提及帮助我。
但是我得到错误,因为我知道我做错了,但仍然想尝试我所知道的,因为我认为最好的学习方法是做尽可能多的错误。请帮帮我
这是主要功能
int main()
{
double *trans;
int *rots;
readctrls(rots,trans);
for(int i=0;i<trans.size();i++)
{
cout<<trans[i]<<endl<<rots[i];
}
}
这里,我试图将指针数组的地址传递给函数readctrls。然后,打印它的值。我没有提到尺寸,因为它将在后面的功能中确定。
该功能只是逐行读取文本文件中的数字,并将这些数字存储在这两个数组中。 readctrls函数如下。
void readctrls(int*& rots,double*& trans)
{
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];
trans = new double[nol];
rots = new int[nol];
for(int i = 0; i<nol ; i++)
{
getline(inputs,lines[i]);
temp = lines[i];
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);
trans[j] = ::atof(subtemptrans.c_str());
rots[j] = atoi(subtemprots.c_str());
}
}
}
inputs.close();
}
非常感谢你的帮助。我能够理解一点并更改了代码,并且能够立即编译而不会出错。但是,我从文件中读取并加载到数组中的值似乎没有反映在主数据中。我在函数中打印数组时从文件中获取正确的值,但是当我在main()中打印时,我得到零。请帮帮我。
这些是文件的内容
0.2 0
0.2 0
0.2 0
0.2 0
0.2 0
打印'trans',它在函数中获取每一行的第一个数字,得到正确的值。但是在主要功能中打印时
0
0
0
0.2.
我在传递给函数时将指针更改为指针引用。请检查功能代码中的编辑。提前谢谢。
答案 0 :(得分:1)
声明
void readctrls(int &rots,double &trans)
告诉编译器每个rots
和trans
引用到单个值。它们是不是指针。
更糟糕的是,在调用此函数时,您实际上是在尝试将指针指针作为参数传递。
您应该将声明更改为实际指针:
void readctrls(int* rots, double* trans)
然后将您的调用更改为不使用address-of运算符(因为它们已经是指针):
readctrls(rots, trans);
答案 1 :(得分:1)
您的代码有几处错误。以下是其中一些:
double *trans = new double[];
int *rots = new int[]; //^^You need to give the size
for(int i=0;i<trans.size();i++)
{
cout<<*trans[i]<<endl<<*rots[i];
}
trans
和rots
只是double和integer的数组,您只需使用trans[i]
来打印第i个元素。动态数组应与静态数组类似。请查看此pointer and arrays以获得一些基本的了解。同时,请查看dynamic memory in C++以了解这一点。
void readctrls(int &rots,double &trans);
//^^expects reference to int and double while you are not passing int and double from main
答案 2 :(得分:1)
可以类似地考虑数组和指针作为引用存储器中的范围的方式。如果你想通过指针引用一系列内存,那么只需将指针传递给函数,即
double pd* = new double[10];
fun(pd);
...
void fun(double* pd, int numDoubles)
{
do {
double d = magicDoubleGenerator();
*pd = d; // read as "the value that pd points to" or "contents of pd"
} while (++pd < pd + numDoubles);
}
指针很难,直到有一天你意识到“啊!他们只是指向的东西!”
答案 3 :(得分:1)
有很多错误......
inputs.open("input_coods.txt"); // second argument is missing
检查此fstream open
void readctrls(int &rots,double &trans)
更改为
void readctrls(int* rots, double* trans) // this creates pointer rots trans
*trans = new double[nol]; // remove *
*rots = new int[nol]; // remove *
double *trans = new double[]; // not specified the size
int *rots = new int[]; // not specified the size
readctrls(&rots,&trans); // this means you passing address of pointer
trans.size() ; // this is c++ double is not a class
我建议您从这个网站C++ Tutorial
学习c ++