OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3252|回复: 14

C语言不会用了,求助,急

[复制链接]

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-12-20 11:08:58 | 显示全部楼层 |阅读模式
1金钱
想找个矩阵运算的函数,在网上搜了个 矩阵转置函数,参数是二重指针,没这么玩过,想求教我写函数时应该怎么写输入参数?比如定义一个二维数据test1[3][3]  = {{1,1,1},{2,2,2},{3,3,3}};
想通过下面的函数转到test2[3][3]中,怎么写?怎么试都在报错。一重的指的话就直接matrix_t(test1,test2,3,3);但是二重。。。。不会了

  • void matrix_t(double **a_matrix, const double **b_matrix, int krow, int kline)  
  • ////////////////////////////////////////////////////////////////////////////  
  • //  a_matrix:转置后的矩阵  
  • //  b_matrix:转置前的矩阵  
  • //  krow    :行数  
  • //  kline   :列数  
  • ////////////////////////////////////////////////////////////////////////////  
  • {  
  •     int k, k2;     
  •   
  •     for (k = 0; k < krow; k++)  
  •     {  
  •         for(k2 = 0; k2 < kline; k2++)  
  •         {  
  •             a_matrix[k2][k] = b_matrix[k][k2];  
  •         }  
  •     }  
  • }  


最佳答案

查看完整内容[请看2#楼]

多谢各位,大概明白了,下午试试。昨天晚上试着在调用函数时还是写matrix_t(test1,test2,3,3),理论上讲这样写是对的,担心是编译器的问题,就强制类型转换成了matrix_t((double**)test1,(double**)test2,3,3),竟然就可以用了,说明真有可能是编译器不识别这种写法。但是使用时会导致程序死机,原因还没找到。
自在随心
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-20 11:08:59 | 显示全部楼层
多谢各位,大概明白了,下午试试。昨天晚上试着在调用函数时还是写matrix_t(test1,test2,3,3),理论上讲这样写是对的,担心是编译器的问题,就强制类型转换成了matrix_t((double**)test1,(double**)test2,3,3),竟然就可以用了,说明真有可能是编译器不识别这种写法。但是使用时会导致程序死机,原因还没找到。
自在随心
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11539
金钱
11539
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-12-20 11:10:48 | 显示全部楼层

好复杂,帮顶

回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-20 11:14:41 | 显示全部楼层

不复杂,就是没玩过,不清楚写函数时应该是个什么格式。。。
自在随心
回复

使用道具 举报

7

主题

56

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-11-16
在线时间
23 小时
发表于 2016-12-20 12:01:02 | 显示全部楼层
告诉你一个方法,你把初始化的形式也写成矩阵的形式,这样或许你就知道该怎么做了。现在的写法有些抽象
回复

使用道具 举报

7

主题

56

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-11-16
在线时间
23 小时
发表于 2016-12-20 12:01:21 | 显示全部楼层
告诉你一个方法,你把初始化的形式也写成矩阵的形式,这样或许你就知道该怎么做了。现在的写法有些抽象
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-12-20 12:57:56 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-12-20 13:01 编辑

二维数组和二维指针是不一样的,别乱用
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-12-20 13:02:04 | 显示全部楼层
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11986
金钱
11986
注册时间
2013-3-8
在线时间
1277 小时
发表于 2016-12-20 14:31:22 | 显示全部楼层
一样的啊!要么matrix_t(&test1[0],&test2[0],3,3)
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-20 16:32:58 | 显示全部楼层
augustedward 发表于 2016-12-20 14:31
一样的啊!要么matrix_t(&test1[0],&test2[0],3,3)

main.c(30): error:  #167: argument of type "double *" is incompatible with parameter of type "double **"
不行的,报上面的错,我刚开始就是这么搞的,然后各种试也没试出来应该什么格式写。
自在随心
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-20 16:46:03 | 显示全部楼层
http://blog.csdn.net/linaijunix/article/details/50358617
那,搜C语言矩阵运算,百度的第一个,有兴趣的可以玩玩看。。。玩会了麻烦告诉我一下。几个月几年以后都行,我再试试不会玩就用一维数组了。
自在随心
回复

使用道具 举报

2

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
509
金钱
509
注册时间
2016-11-16
在线时间
111 小时
发表于 2016-12-20 16:59:16 | 显示全部楼层
诶  似乎这个函数的形参类型错了吧。。double **a_matrix  这个是一个指向double类型的指针的指针  和二维数组的指针不一样的吧。。把函数的形参修改一下
double (*a_matrix)【3】   试试
回复

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-2-23
在线时间
23 小时
发表于 2016-12-20 17:50:41 | 显示全部楼层
如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,
数组的行数没有太大关系,可以指定也可以不指定
所以声明应该改成这样
void matrix_t(double (*a_matrix)[3], const double (*b_matrix)[3], int krow, int kline);
或者这样void matrix_t(double (*a_matrix)[3][3], const double (*b_matrix)[3][3], int krow, int kline);
调用就matrix_t(&test2[0],&test1[0],3,3);应该就没问题了
回复

使用道具 举报

8

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2015-9-1
在线时间
161 小时
发表于 2016-12-21 09:27:57 | 显示全部楼层
yuzeyuan1 发表于 2016-12-21 08:37
多谢各位,大概明白了,下午试试。昨天晚上试着在调用函数时还是写matrix_t(test1,test2,3,3),理论上 ...

建议在vs上测试一下在放在keil上运行
回复

使用道具 举报

1

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2016-10-17
在线时间
98 小时
发表于 2016-12-26 14:31:06 | 显示全部楼层
[mw_shl_code=c,true]void matrix_t(uint8_t (*a_matrix)[3], const uint8_t (*b_matrix)[3], int krow, int kline)  
{  
    int k, k2;     
  
    for (k = 0; k < krow; k++)  
    {  
        for(k2 = 0; k2 < kline; k2++)  
        {  
            a_matrix[k2][k] = b_matrix[k][k2];  
        }  
    }  
}
[/mw_shl_code]
[mw_shl_code=c,true]                uint8_t                MatrixA[3][3] = { 11, 12, 13,
                                                                                                                          21, 22, 23,
                                                                                                                          31, 32, 33 };
                uint8_t                MatrixB[3][3] = { 0 };

matrix_t(MatrixB, MatrixA, 3, 3);[/mw_shl_code]
用数组指针作形参,这种写法可以
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 04:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表