| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2212 人关注过本帖
标题:二维数组,传递指针,类型不兼容
只看楼主 加入收藏
gleerat
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2009-12-23
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
二维数组,传递指针,类型不兼容

程序代码:
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  *编程练习10-8,初始化一个3 * 5的二位数组,并利用一个基于变长数组的函数把
  *该数组复制到另一个一个二位数组;还要编写一个基于变长数组的函数来显示两个
  *数组的内容(该函数应该能够处理任意的N * M数组)
  **/
#include <stdio.h>

void copy(int m, int n, const double array[m][n], double target[m][n]);
void show(int m, int n, const double *array[]);

int main(void)
{
    int m=3, n=5;
    double array[3][5] = {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15}
    };

    double target[m][n];

    copy(m, n, array, target);
    show(m, n, target);

    return 0;
}

void copy(int n, int m, const double array[m][n], double target[m][n])
{
    int i, j;

    for(i=0; i<m; i++)
        for(j=0; j<n; j++)
            target[m][n] = array[m][n];
}

void show(int m, int n, const double *array[])
{
    int i, j;

    for(i=0; i<m; i++){
        for(j=0; j<n; j++)
            printf("%f  ", array[m][n]);
        putchar('\n');
    }
    printf("显示完毕。\n");
}
10-8.c: 在函数‘main’中:
10-8.c:21:5: 警告: 传递‘copy’的第 3 个参数时在不兼容的指针类型间转换 [默认启用]
10-8.c:8:6: 附注: 需要类型‘const double (*)[(sizetype)(n)]’,但实参的类型为‘double (*)[5]’
10-8.c:22:5: 警告: 传递‘show’的第 3 个参数时在不兼容的指针类型间转换 [默认启用]
10-8.c:9:6: 附注: 需要类型‘const double **’,但实参的类型为‘double (*)[(sizetype)(n)]’
搜索更多相关主题的帖子: 编程 
2012-12-27 11:24
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
嘿嘿,竟然是中文的提示信息,真够蛋疼的
首先,将 array[i][j] 等写成了 array[m][n] 真够粗心的
其次,show函数的第二个参数应当是 double (*array)[n],或者写成 double array[][n] 更好,但写成 double *array[n] 则说明你对数组的理解还有大问题。
2012-12-27 12:29
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
学习了。
2012-12-27 12:33
gleerat
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2009-12-23
收藏
得分:0 
回复 2楼 rjsp
这是《C Primer Plus》中的实例10.18的代码。
程序代码:
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  *编程10-18,C99标准,变长数组。
  **/

#include <stdio.h>

#define ROWS 3
#define COLS 4

int sum2d(int rows, int cols, int array[rows][cols]);

int main(void)
{
    int i, j, rs=3, cs=10;
    int junk[ROWS][COLS] = {
        {2, 4, 6, 8},
        {3, 5, 7, 9},
        {12, 10, 8, 6}
    };
    int morejunk[ROWS-1][COLS+2] = {
        {20, 30, 40, 50, 60, 70},
        {5, 6, 7, 8, 9, 10}
    };
    int var[rs][cs];    //变长数组

    for(i=0; i<rs; i++)
        for(j=0; j<cs; j++)
            var[i][j] = i*j +j;
    printf("3 * 5的数组:\n所有元素之和为:%d。\n",
        sum2d(ROWS, COLS, junk));    //变长数组
    printf("2 * 6的数组:\n所有元素之和为:%d。\n",
        sum2d(ROWS-1, COLS+1, junk));
    printf("3 * 10的数组:\n所有元素之和为:%d。\n",
        sum2d(rs, cs, var));

    return 0;
}

int sum2d(int rows, int cols, int array[rows][cols])
{
    int total=0, i, j;

    for(i=0; i<rows; i++)
        for(j=0; j<cols; j++)
            total += array[i][j];

    return total;
}
主题贴中程序是课后关于变长数组的习题,我是仿这里面写的。
还是看不懂你所说的第二点。请说得再通俗一点吧,谢谢。

明察、慎思、笃行
2012-12-27 15:03
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
以下是引用gleerat在2012-12-27 11:24:25的发言:


/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  *编程练习10-8,初始化一个3 * 5的二位数组,并利用一个基于变长数组的函数把
  *该数组复制到另一个一个二位数组;还要编写一个基于变长数组的函数来显示两个
  *数组的内容(该函数应该能够处理任意的N * M数组)
  **/
#include <stdio.h>

void copy(int m, int n, const double array[m][n], double target[m][n]);//这两个自定义函数应该写在int main的主体中
void show(int m, int n, const double *array[]);

int main(void)
{
    int m=3, n=5;
    double array[3][5] = {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15}
    };

    double target[m][n];

    copy(m, n, array, target);
    show(m, n, target);//你在上面的对自定义函数的声明的时候,就已经告诉编译器*array[]这是一维指针数组,而target这是一个二维数组啊

    return 0;
}

void copy(int n, int m, const double array[m][n], double target[m][n])
{
    int i, j;

    for(i=0; i<m; i++)
        for(j=0; j<n; j++)
            target[m][n] = array[m][n];
}

void show(int m, int n, const double *array[])
{
    int i, j;

    for(i=0; i<m; i++){
        for(j=0; j<n; j++)
            printf("%f  ", array[m][n]);
        putchar('\n');
    }
    printf("显示完毕。\n");
}10-8.c: 在函数‘main’中:
10-8.c:21:5: 警告: 传递‘copy’的第 3 个参数时在不兼容的指针类型间转换 [默认启用]
10-8.c:8:6: 附注: 需要类型‘const double (*)[(sizetype)(n)]’,但实参的类型为‘double (*)[5]’
10-8.c:22:5: 警告: 传递‘show’的第 3 个参数时在不兼容的指针类型间转换 [默认启用]
10-8.c:9:6: 附注: 需要类型‘const double **’,但实参的类型为‘double (*)[(sizetype)(n)]’

楼主在以上加颜色的部分出错了,我修改了,带不知道你想要的结果是什么,你能截图把想要的结果发上来看看吗

思考赐予新生,时间在于定义
2012-12-27 15:59
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:20 
以下是引用gleerat在2012-12-27 15:03:29的发言:

还是看不懂你所说的第二点。请说得再通俗一点吧,谢谢。
二维数组 是 一维数组的数组,而非 指向一维数组的指针的数组
比如
a[2][3] = { 0, 1, 2, 3, 4, 5 }
的内存布局是
0 1 2
3 4 5
而非
point0 -> {0 1 2}
point1 -> {3 4 5}
-------------------------------------------
int a[2][3] = { 0, 1, 2, 3, 4, 5 };
int (*p)[3] = a; // 这是对的
int *p[2] = a; // 这是错的
2012-12-27 16:13
gleerat
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2009-12-23
收藏
得分:0 
回复 6楼 rjsp
这是《C Primer Plus》的课后练习10-8。
题目要求:初始化一个3 * 5的二位数组,并利用一个基于变长数组的函数把该数组复制到另一个一个二位数组;还要编写一个基于变长数组的函数来显示两个数组的内容(该函数应该能够处理任意的N * M数组)。

将函数改为:
void copy(int m, int n, const double array[m][n], double target[m][n]);
void show(int m, int n, const double array[m][n]);
编译依然提示类型不兼容的警告,但是程序(至少是看起来)结果是正确的,编译也没有错误,只是想知道编译过程中的警告是怎么回事并且想消除警告。

是函数定义错误,还是使用错误?谢谢。


[ 本帖最后由 gleerat 于 2012-12-30 11:24 编辑 ]

明察、慎思、笃行
2012-12-30 11:05
gleerat
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2009-12-23
收藏
得分:0 
回复 5楼 love云彩
这是《C Primer Plus》的课后练习10-8。
题目要求:初始化一个3 * 5的二位数组,并利用一个基于变长数组的函数把该数组复制到另一个一个二位数组;还要编写一个基于变长数组的函数来显示两个数组的内容(该函数应该能够处理任意的N * M数组)。

将函数改为:
void copy(int m, int n, const double array[m][n], double target[m][n]);
void show(int m, int n, const double array[m][n]);
编译依然提示类型不兼容的警告,但是程序(至少是看起来)结果是正确的,编译也没有错误,只是想知道编译过程中的警告是怎么回事并且想消除警告。

1、为什么要把函数放到主函数内部?
2、修改函数前后,copy和show函数,都出现同样的警告,是为什么?是函数定义错误,还是使用错误?谢谢。

PS:不好意思,几天不登录,一登录就强制要求结贴,没有看到你的回复。

明察、慎思、笃行
2012-12-30 11:24
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 7楼 gleerat
我个人认为这是C语法的一个bug
C标准就是这么规定的,虽然这个规定没道理
2012-12-30 12:20
gleerat
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2009-12-23
收藏
得分:0 
回复 9楼 rjsp
谢谢

明察、慎思、笃行
2012-12-31 15:33
快速回复:二维数组,传递指针,类型不兼容
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059073 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved