害怕覆盖结构中的引用数据

问题描述

我有一个关于数据缓冲区指针的问题,我不知道如何在 Google 上搜索这个问题,因为我不知道它可能叫什么。所以...

我有一个函数,它采用结构 PCA9745 并使用函数输入配置其中的一些参数,如下所示。我关心的是数组指针......当函数 _PCA9745_Configure() 完成时,函数返回后是否释放数组(到缓冲区),从而使数组指针变得无用,因为它可能会得到写完了?

我想要一种创建数组引用的方法,该引用在函数返回后不会过时,而无需在 ma​​in.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;

ma​​in.c

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,PCA9745_BUF_SIZE);
    memset(p->data_buffer,PCA9745_BUF_SIZE);
    memset(p->rx_buffer,9,PCA9745_BUF_SIZE); // fill it with something known
    //.....
    p->r_ext = 1;
    p->num_dev = 1;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...