c - 害怕覆盖结构中的引用数据
问题描述
我有一个关于数据缓冲区指针的问题,我不知道如何在 Google 上搜索这个问题,因为我不知道它可能被称为什么。所以...
我有一个函数,它采用结构 PCA9745 并使用函数输入配置它的一些参数,如下所示。我关心的是数组指针......当函数_PCA9745_Configure()完成时,数组(到缓冲区)是否在函数返回后被释放,从而使数组指针变得无用,因为它可能会被覆盖?
我想要一种创建数组引用的方法,一旦函数返回就不会过时,而无需在main.c中声明数组以隐藏一些丑陋并使其更加用户友好。
PCA9745_io.c
void _PCA9745_Configure(PCA9745 *p, float r_ext, uint16_t num_dev){
p->r_ext = r_ext;
p->num_dev = num_dev;
uint8_t instr_buffer[num_dev];
uint8_t data_buffer[num_dev];
uint8_t rx_buffer[num_dev];
p->instr_buffer = &instr_buffer;
p->data_buffer = &data_buffer;
p->rx_buffer = &rx_buffer;
}
PCA9745 结构
typedef struct {
SPI_HandleTypeDef *hspi;
GPIO_TypeDef *gpio_port_nCS;
uint16_t gpio_pin_nCS;
GPIO_TypeDef *gpio_port_nOE;
uint16_t gpio_pin_nOE;
//Must include for PCA9745.c to compile
float r_ext; //External Resistor value
uint16_t num_dev; //number of devices
uint8_t *instr_buffer[];
uint8_t *data_buffer[];
uint8_t *rx_buffer[];
} PCA9745;
主程序
PCA9745 p = Init_PCA9745(&hspi1, nCS_GPIO_Port, nCS_Pin, nOE_GPIO_Port, nOE_Pin);
_PCA9745_Configure(&p, 3600.0f, 1);
解决方案
我会亲自去做这样的事情,但如果你想变得花哨,你可以从 init 返回一个结构。
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#define PCA9745_BUF_SIZE 512
typedef struct {
//SPI_HandleTypeDef *hspi; // I dont have these types :)
//GPIO_TypeDef *gpio_port_nCS;
//GPIO_TypeDef *gpio_port_nOE;
uint16_t gpio_pin_nOE;
uint16_t gpio_pin_nCS;
uint16_t num_dev; //number of devices
float r_ext; //External Resistor value
uint8_t *instr_buffer;
uint8_t *data_buffer;
uint8_t *rx_buffer;
} PCA9745_t;
static uint8_t instr_buf[PCA9745_BUF_SIZE];
static uint8_t data_buf[PCA9745_BUF_SIZE];
static uint8_t rx_buf[PCA9745_BUF_SIZE];
void _PCA9745_init(PCA9745_t *p);
int main(void)
{
PCA9745_t PCA9745 =
{
//.hspi = &spi1,
//.gpio_port_nCS = my_favorite_gpio,
//...,
.instr_buffer = instr_buf,
.data_buffer = data_buf,
.rx_buffer = rx_buf
};
_PCA9745_init(&PCA9745);
// Just for test :)
for(int i = 0; i < PCA9745_BUF_SIZE; i++){
printf("%d",*(PCA9745.rx_buffer+i));
}
return 0;
}
void _PCA9745_init(PCA9745_t *p){
memset(p->instr_buffer,0,PCA9745_BUF_SIZE);
memset(p->data_buffer,0,PCA9745_BUF_SIZE);
memset(p->rx_buffer,9,PCA9745_BUF_SIZE); // fill it with something known
//.....
p->r_ext = 1;
p->num_dev = 1;
}
推荐阅读
- android - 在理解此 ANR 报告时需要帮助
- android - 列表项上的 Android Swipe 菜单无法处理父宽度更改
- node.js - 如何使用 Electron 的内置 Node 实例来运行任务?
- r - 防止 renderUI 更新所有输入
- php - 只有第一列被回显,而不是全部
- vue.js - 如何在 VueJS 中使用 for 循环对属性中的数据进行分组
- java - Java Stream中的forEach方法可以将Function函数接口作为参数吗
- loops - 如何遍历 ansible playbook 输出?
- c - 我声明的结构中缺少什么
- security - 标头 x-core-session-id