打印
[STM32F0]

关于在函数中返回个数组值,请教

[复制链接]
1764|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
viseng|  楼主 | 2017-6-13 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的函数我是想读一段的Flash的值,返回读出的数组,下面的写法,return语句处有告警,请教下这个该怎么写?谢谢
uint16_t *Flash_ReadNHalfword(uint32_t faddr,uint16_t len_halfword)
{
                uint16_t buffer[len_halfword];
                uint16_t i;
          for (i=0;i<len_halfword;i++)
                {
                                buffer[i] = *(uint16_t*)faddr;
                                faddr +=2;
                }
                return buffer;
}
沙发
viseng|  楼主 | 2017-6-13 13:35 | 只看该作者
对于指针的用法,还是有挺多地方吃不透啊~~~~~~

使用特权

评论回复
板凳
viseng|  楼主 | 2017-6-13 13:38 | 只看该作者
之前有朋友给的做法是 void Flash_ReadNHalfword(uint32_t faddr,uint16_t *buffer,uint16_t len_halfword),利用*buffer来返回

使用特权

评论回复
地板
宇容创行| | 2017-6-13 13:40 | 只看该作者
把 buffer 放到函数外
函数中的局部变量,调用完成后就没了,返回指针是没有意义的

使用特权

评论回复
5
msblast| | 2017-6-13 13:56 | 只看该作者
viseng 发表于 2017-6-13 13:38
之前有朋友给的做法是 void Flash_ReadNHalfword(uint32_t faddr,uint16_t *buffer,uint16_t len_halfword) ...

对的

使用特权

评论回复
6
moyanming2013| | 2017-6-13 14:51 | 只看该作者
宇容创行 发表于 2017-6-13 13:40
把 buffer 放到函数外
函数中的局部变量,调用完成后就没了,返回指针是没有意义的 ...

局部的变量修饰为static既静态的也可以起到“全局变量”的作用域。

使用特权

评论回复
7
viseng|  楼主 | 2017-6-13 15:16 | 只看该作者
moyanming2013 发表于 2017-6-13 14:51
局部的变量修饰为static既静态的也可以起到“全局变量”的作用域。

这个还是不行,声明为static,如果多次调用,每次要读取的长度不同就不行了,static只在第一次调用时初始化

使用特权

评论回复
8
viseng|  楼主 | 2017-6-13 15:20 | 只看该作者
回头再看看指针这块的东西,这块看来得吃透才行

使用特权

评论回复
9
moyanming2013| | 2017-6-14 12:27 | 只看该作者
viseng 发表于 2017-6-13 15:16
这个还是不行,声明为static,如果多次调用,每次要读取的长度不同就不行了,static只在第一次调用时初始 ...

我去,你全局的当然也不会返回长度啊。
全局和静态的只是提供了一个返回数组的方式,至于你到底怎么用看自己的需要。
你是既想返回数组又想返回数组的有效数据长度,那么可以通过形参传入指针(数组和长度都需要指针形式);或者把这2个数据封装成一个结构体也行。

使用特权

评论回复
10
烦人的凡人| | 2017-6-14 13:34 | 只看该作者
函数里面定义的非静态局部变量都是放在栈上,返回了就无效了,可以用全局数组或者设为静态局部数组每次读之前清空。

使用特权

评论回复
11
viseng|  楼主 | 2017-6-14 15:31 | 只看该作者
还是通过形参传数组指针好点,至少用起来会灵活很多

使用特权

评论回复
12
戈卫东| | 2017-6-14 20:43 | 只看该作者
有动态存储管理,用malloc获得的buffer才可以这样返回。

使用特权

评论回复
13
kingkits| | 2017-6-15 09:29 | 只看该作者
有2种比较常见的方法:
一个时调用函数自己设置好缓冲区和长度,然后通过形参和指针传过去
void Flash_ReadNHalfword(uint32_t faddr,uint16_t *buffer,uint16_t len_halfword)
{
   ...
    *buffer = data;
      buffer ++;
   ...
   return;
}
void work_fun(void)
{
    uint16_t buffer[64];
    uint16_t len_halfword;
    len_halfword = 64;
    Flash_ReadNHalfword(0,(uint16_t *)buffer, len_halfword);
    ...
}
/****************************************/
另一种是直接在全局变量定义一个缓冲区
uint16_t buffer[64];
void Flash_ReadNHalfword(uint32_t faddr,uint16_t len_halfword)
{
   uint16_t *buffer_ptr = buffer;
   ...
    *buffer_ptr = data;
      buffer_ptr ++;
   ...
   return;
}

uint16_t buffer[64]; // 如果不在同一文件,需要声明一下
void work_fun(void)
{
    uint16_t len_halfword;
    len_halfword = 64;
    Flash_ReadNHalfword(0, len_halfword);
    // 这里就可以直接使用全局变量buffer[]中的数据了
    ...
}

使用特权

评论回复
14
kingkits| | 2017-6-15 09:31 | 只看该作者
应该声明成外部变量
extern uint16_t buffer[64]; // 如果不在同一文件,需要声明一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

410

帖子

1

粉丝