荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店