荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: huhaiming (一生只爱她), 信区: Program
标 题: [合集]不能赋值的问题,哪位帮帮我
发信站: 荔园晨风BBS站 (Thu Jan 1 17:35:56 2004), 站内信件
bigone (命之气) 于Mon Oct 20 16:37:38 2003提到:
现有一函数,将一个分块矩阵H的第(i,j)块矩阵拷贝到SubMatrix
void CopyToSubMatrix(float** H, int i, int j, float** SubMatrix, int
n)
{ /**********************************************
其中,H是这样定义的,目的是想实现动态分配一个二维数组
float** H;
H = (float **)malloc(sizeof(float*)*n);
for(int i=0; i<n; i++)
H[i] = (float *)malloc(sizeof(float)*n);
SubMatrix如法炮制:
float** SubMatrix;
SubMatrix = (float **)malloc(sizeof(float*)*n);
for(int i=0; i<n; i++)
SubMatrix[i] = (float *)malloc(sizeof(float)*n);
H有初始化;
************************************************/
int begin_i,begin_j;
begin_i = n*(i-1);
begin_j = n*(j-1);
SubMatrix[0][0]=H[0][0]+1;
int p,q;
for(p=begin_i; p<n; p++)
for(q=begin_j; q<n; q++){
SubMatrix[p-begin_i][q-begin_j]=H[p][q]; //赋值语句
}
}
//编译运行都没错,可是运行完了之后,H[][]里面的值就是没有拷贝到SubMatrix[][],
//SubMatrix[][]里面的值还跟没有执行赋值语句一样.这是怎么回事??
//难道是用malloc 的错?
Version (Scorpio) 于Mon Oct 20 16:46:54 2003提到:
a b| c d
e f| g h
bigone (命之气) 于Mon Oct 20 17:01:31 2003提到:
我的函数就是要把其中一块取出来,取的过程中,拷贝过程出问题
,赋值不到
Version (Scorpio) 于Mon Oct 20 17:16:23 2003提到:
O
H[][]没错吧。。。
huhaiming (一生只爱她) 于Mon Oct 20 17:19:40 2003提到:
整个程序有多复杂?
我个人觉得好像也是malloc可能会出问题
不长的话可以debug来看看的
Kenniel (笑翻下先^_^) 于Mon Oct 20 17:29:16 2003提到:
在程序外面动态创建赋值就可以了!
尽量不要在子程序内部!
Version (Scorpio) 于Mon Oct 20 17:42:00 2003提到:
偶从来都是在子程序内部,根据需要来创建。
但是没见过哦。
bigone (命之气) 于Mon Oct 20 17:46:54 2003提到:
在函数内部执行完赋值后,直接显示赋值结果,看到的也是没有赋值的
结果
kenniel,你的程序能不能拿出来参考阿
在程序外面动态创建赋值就可以了!
尽量不要在子程序内部!
Kenniel (笑翻下先^_^) 于Mon Oct 20 18:02:40 2003提到:
你是说那个分割函数还是整个程序?
Kenniel (笑翻下先^_^) 于Mon Oct 20 18:03:56 2003提到:
我刚才试过了!看你用的传入的参数把这些!~一维数组
怎样弄怎样行,二维的刚才测试了一下在内部打印可以!
如果是在内部创建外部打印你试试!我的是不行的哦!
Version (Scorpio) 于Mon Oct 20 18:22:11 2003提到:
内部创建外部当然不可以引用啦。
作用域的问题哦。
那时就要返回了。
原来我们的意思不同啊。
我看你们说算了。。
88
bigone (命之气) 于Mon Oct 20 18:30:36 2003提到:
下楼啃掉你的骨
Kenniel (笑翻下先^_^) 于Mon Oct 20 18:34:52 2003提到:
搞定了嘛?
jjksam (eee) 于Mon Oct 20 19:08:50 2003提到:
你的参数分别是什么意思呢?解释一下。
jjksam (eee) 于Mon Oct 20 19:54:48 2003提到:
不能用下面这样的方法传递二维数组
/**************************************************
#define MAX_ROW 100
#define MAX_COL 100
float array[MAX_ROW][MAX_COL]={0};
int foo();
void
func(float ** array, // you can't do like this!
size_t max_row,
size_t max_col)
{
size_t row, col;
for (row = 0; row < max_row; row++)
{
for (col = 0; col < max_col; col++)
{
array[row][col]=foo();
}
}
}
**************************************************/
不能这样做是因为编译器无法单纯从提供给func的信息确定怎样计算其元素的地址。
那么用指针表示行不行呢?
void
func(float **array,
size_t max_row,
size_t max_col)
{
size_t row, col;
for (row = 0; row < max_row; row++)
{
for (col = 0; col < max_col; col++)
{
**(array+row*col+col)=foo();
}
}
}
实际上也是不行的。
要这样
void
func(float array[][MAX_COL],
size_t max_row,
size_t max_col)
{
}
但是这种方法只对静态数组有效。
jjksam (eee) 于Mon Oct 20 20:27:02 2003提到:
~~~~~~~~~~~~~~~~~~~~上面两句有问题。for循环根本不会执行。
例如i=0,j=0,n=2;
那么 begin_i=-2;
begin_j=-2;
jjksam (eee) 于Mon Oct 20 21:44:56 2003提到:
float *a;
应该用sizeof (*a);
而不是用sizeof(float*);
在这个代码中无需强制转换malloc就行了,事实上这样做可以伪装<stdlib.h>的偶然遗漏。
SubMatrix = malloc(n * sizeof (*SubMatrix) );
//应该判断malloc是否成功。
if(SubMatrix != NULL)
{
-: SubMatrix[i] = (float *)malloc(sizeof(float)*n);
+ SubMatrix[i] = malloc(n * sizeof (*SubMatrix[i]));
}
bigone (命之气) 于Mon Oct 20 21:54:34 2003提到:
参数意思是,H是一个二维数组的指针,SubMatrix也是一个二维数组的指针
H 在函数外面已经存储了一个矩阵,将这个矩阵分块,每个子块的位置用(i,j)
表示. 例如(1,1)表示第一个子块.
n表示每个分块矩阵的维数
bigone (命之气) 于Mon Oct 20 22:07:38 2003提到:
这个方法知道,传递静态数组的化,还可以这样:
void func(int (*array)[n]) // n是维数
bigone (命之气) 于Mon Oct 20 22:16:13 2003提到:
~~~~~~~~~~~这个事实上就是float*
jjksam (eee) 于Mon Oct 20 23:25:13 2003提到:
writing secure code不推荐你的写法。
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店