m****s 发帖数: 1481 | 1 我需要读取一个数据文件,然后把读出来的数据放到不同的变量里,因为这些变量的长
度不确定,所以都是临时根据长度分配内存,code如下:
... main(){
...
...
int *a,length_a;
double *d,length_d;
char *c,length_c;
FILE *fp;
... 打开文件代码...
...读文件,获取变量a,d,c的长度...
a= new int[length_a];
d= new double[length_d];
c= new char[length_c];
...计算,处理...
delete[] a;
delete[] d;
delete[] c;
}
这种最基本的方法运行没问题。
现在因为我要load的变量很多,所以我想把loading用一个函数来做。如果只有一个变
量,我可以把它的pointer定义在main里面,然后用一个函数读取文件,在函数里
declare一个临时pointer,分配内存,赋值,然后返回这个pointer。
但是如果多个变量的情况怎么做呢?
我先试了把多个变量的指针传递给子函数,在子函数里declare对应的临时pointer,分
配内存,赋值,然后把传进来的pointer指向这些临时pointer,但是不对。code 如下:
main(){
int *a;
double *d;
char *c;
fun_read(a,d,c);
delete[] a;
delete[] d;
delete[] c;
}
void fun_read(int *a, double *d, char *c){
int *at;
double *dt;
char *ct;
...读文件,然后给at,dt,ct分配空间,赋值,处理...
a=at;
d=dt;
c=ct;
}
我又试了在main里先给a,d,c分配空间,然后在子函数里删除,在把他们指向临时pointer,返回,也不对。
然后我又试了定义一个structure,里面包含所有这些pointer,在main里declare一个这样structure的pointer,不分配,然后子函数去读文件,declare一个临时structure pointer存变量,然后返回这个pointer给main。code如下:
structure pack{
int *a;
double *d;
char *c;
};
main(){
pack *p1;
p1=fun_readpack();
...处理...
delete[] p1;
}
pack *fun_readpack(){
pack *tmp;
...读文件,获取变量长度length_a,length_d,length_c...
tmp->a=new int[length_a];
tmp->d=new double[length_d];
tmp->c=new char[length_c];
...赋值...
return tmp;
}
这样可以工作,但是我需要在主程序里delete这个structure的每一个成员pointer么?还是只要delete这个structure的pointer就好了?
总结起来我的问题就是,怎么正确的在main里declare多个各种类型的pointer,用一个
子函数给这些pointer分配内存和赋值(分配多少空间main不知道,子函数决定),然
后返回给main处理,(还要给其他子函数处理),末了在main里删除掉。
不知道说明白乐没有,谢谢先 | D*****r 发帖数: 6791 | 2 我觉得应该用引用,
void func_read(int * &a, double * &d, char * &c){
...
}
这应该是个形参、实参的问题吧?
【在 m****s 的大作中提到】 : 我需要读取一个数据文件,然后把读出来的数据放到不同的变量里,因为这些变量的长 : 度不确定,所以都是临时根据长度分配内存,code如下: : ... main(){ : ... : ... : int *a,length_a; : double *d,length_d; : char *c,length_c; : FILE *fp; : ... 打开文件代码...
| m****s 发帖数: 1481 | 3 谢谢,我刚才搜索了半天,看到stackoverflow有人问类似的问题,确实是应该用引用
。因为c++子函数传进来的变量是copy,所以进来的pointer是主函数那个pointer的
local copy,如果主函数没有初始化,子函数分配的内存并没有赋值给主函数的
pointer,一个解决办法是子函数用int **a,主函数把没有分配内存的pointer的地址
传进去,也就是call的时候用&a。另一个办法就是你说的用int * &a,pass by reference。 | m****s 发帖数: 1481 | 4 还是有点问题,大侠帮忙看下下面的代码,为什么在main里释放内存出错。
用pass by reference:
void fun1(int& *a, double& *b, char& *c){
a=new int[20];
b=new double[20];
c=new char[10];
for (int i=0;i<20;i++){
a[i]=i;
b[i]=sqrt((double)a[i]);
}
c="0123456789";
}
int _tmain(int argc, _TCHAR* argv[])
{
int *a;
double *b;
char *c;
fun1(a,b,c);
cout<<"a & b are:"<
for(int i=0;i<20;i++)
cout<
cout<<"c is: "<
delete[] a;
delete[] b;
delete[] c;
return 0;
}
用pointer to pointer:
void fun1(int **a, double **b, char **c){
*a=new int[20];
*b=new double[20];
*c=new char[10];
for (int i=0;i<20;i++){
(*a)[i]=i;
(*b)[i]=sqrt((double)((*a)[i]));
}
*c="0123456789";
}
int _tmain(int argc, _TCHAR* argv[])
{
int *a;
double *b;
char *c;
fun1(&a,&b,&c);
cout<<"a & b are:"<
for(int i=0;i<20;i++)
cout<
cout<<"c is: "<
delete[] a;
delete[] b;
delete[] c;
return 0;
}
两种方法都能正确赋值和返回main,但是delete[]出错。 | m****s 发帖数: 1481 | 5 搞明白了,问题出在char*被重定向到一个string上去了,惭愧,低级错误啊 | s*w 发帖数: 729 | 6 int & *a 和 int * &a 没区别吗? | t****t 发帖数: 6806 | 7 there is no "int&*a".
【在 s*w 的大作中提到】 : int & *a 和 int * &a 没区别吗?
| H***a 发帖数: 735 | 8 既然在C++里, 还是用vector会省心点吧 :) | c********5 发帖数: 61 | 9 你这个还停留在C语言的思维啊. C++里通常的办法是自己写个class把数据包装在一个
object里, 这样内存分配和释放都很好管理. 如果数组里的数据类型相同的话象楼上说
的用vector之类现成的class就好了. |
|