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

[复制链接]
2259|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 放到函数外
函数中的局部变量,调用完成后就没了,返回指针是没有意义的
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) ...

对的
moyanming2013 发表于 2017-6-13 14:51 | 显示全部楼层
宇容创行 发表于 2017-6-13 13:40
把 buffer 放到函数外
函数中的局部变量,调用完成后就没了,返回指针是没有意义的 ...

局部的变量修饰为static既静态的也可以起到“全局变量”的作用域。
 楼主| viseng 发表于 2017-6-13 15:16 | 显示全部楼层
moyanming2013 发表于 2017-6-13 14:51
局部的变量修饰为static既静态的也可以起到“全局变量”的作用域。

这个还是不行,声明为static,如果多次调用,每次要读取的长度不同就不行了,static只在第一次调用时初始化
 楼主| viseng 发表于 2017-6-13 15:20 | 显示全部楼层
回头再看看指针这块的东西,这块看来得吃透才行
moyanming2013 发表于 2017-6-14 12:27 | 显示全部楼层
viseng 发表于 2017-6-13 15:16
这个还是不行,声明为static,如果多次调用,每次要读取的长度不同就不行了,static只在第一次调用时初始 ...

我去,你全局的当然也不会返回长度啊。
全局和静态的只是提供了一个返回数组的方式,至于你到底怎么用看自己的需要。
你是既想返回数组又想返回数组的有效数据长度,那么可以通过形参传入指针(数组和长度都需要指针形式);或者把这2个数据封装成一个结构体也行。
烦人的凡人 发表于 2017-6-14 13:34 | 显示全部楼层
函数里面定义的非静态局部变量都是放在栈上,返回了就无效了,可以用全局数组或者设为静态局部数组每次读之前清空。
 楼主| viseng 发表于 2017-6-14 15:31 | 显示全部楼层
还是通过形参传数组指针好点,至少用起来会灵活很多
戈卫东 发表于 2017-6-14 20:43 | 显示全部楼层
有动态存储管理,用malloc获得的buffer才可以这样返回。
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[]中的数据了
    ...
}

kingkits 发表于 2017-6-15 09:31 | 显示全部楼层
应该声明成外部变量
extern uint16_t buffer[64]; // 如果不在同一文件,需要声明一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

410

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部