首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个结构指针和数组中,为结构指针的成员赋值

在多个结构指针和数组中,为结构指针的成员赋值
EN

Stack Overflow用户
提问于 2018-05-22 23:25:22
回答 1查看 60关注 0票数 0

详细标题。但这正是我遇到的问题。这可能是对struct指针如何工作的误解,或者是使用正确格式的问题。我将下面的结构类型定义组合在一个大的“盒子”中,以便在配置中传递。

代码语言:javascript
复制
typedef struct NTC_network{
     unsigned char NET_ID;      
     unsigned char DEV_ADDR;        
}NTC_network;

typedef struct NTC_io_trx_link{
  enum NTC_IO_LINK own_io;
  unsigned char ADDR;
  enum NTC_IO_LINK trx_io;
}NTC_io_trx_link;

//struct to hold status of I/O. 0==OFF 1==ON
typedef struct NTC_config_stpio{
    unsigned char L1:1;
    unsigned char L2:1;
    unsigned char L3:1;
    unsigned char L4:1;
    unsigned char E1:1;
    unsigned char E2:1;
    unsigned char T1:1;
    unsigned char T2:1;
}NTC_config_stpio;

typedef struct NTC_header {
    unsigned char NET_ID;   
    unsigned char DST;      //destination address
    unsigned char SRC;      //source address
    unsigned char PCKT;             
}NTC_header;

typedef struct NTC_default_setup{
    unsigned char DEFAULT_SETUP:1;
}NTC_default_setup;    

typedef struct NTC_data{    
    unsigned char E1;       //resistor value to emulate on E1
    unsigned char E2;       //resistor value to emulate on E2
    unsigned char T1;       //resistor value of temperature sensor on T1
    unsigned char T2;       //resistor value of temperature sensor on T2
    unsigned char D1;       //230VAC detection circuit on/off
    unsigned char D2;       //230VAC detection circuit on/off       
    unsigned char ALRM;     //alarm on off 0xFF=alarm on, 0x00=alarm off            
}NTC_data;

typedef struct NTC_ack{
    unsigned char ACK;      //ACK field 0x00=no ack 0xFF= ack
}NTC_ack;

typedef struct NTC_config {
    NTC_default_setup *DEFAULT_STP;
    NTC_config_stpio *STPIO;
    NTC_config_network *NETWORK;
    NTC_io_trx_link *NTC_link_io;               
}NTC_config;

//struct for payload to send via LoRa
typedef struct NTC_payload{
    NTC_header *Header;
    enum NTC_dc DC; 
    NTC_config *Config;
    NTC_data *Data;
    NTC_ack *Ack;   
}NTC_payload;

typedef struct NTC_runtime_data{
    NTC_payload *pPayload;  
}NTC_runtime_data; 

并在运行时按如下方式分配整个内容:

代码语言:javascript
复制
NTC_runtime_data* init_struct_runtime_data(void){   

    NTC_runtime_data *DATA = calloc(1, sizeof(NTC_runtime_data));   

    DATA->pPayload = calloc(2, sizeof(NTC_payload));
    for(int i = 0 ; i < 2; i++){
        DATA->pPayload[i].Header = calloc(1, sizeof(NTC_header));
        DATA->pPayload[i].DC = NONE; 
        DATA->pPayload[i].Config = calloc(1, sizeof(NTC_config));
        DATA->pPayload[i].Config->DEFAULT_STP = calloc(1, sizeof(NTC_default_setup));
        DATA->pPayload[i].Config->STPIO = calloc(1, sizeof(NTC_config_stpio));      
        DATA->pPayload[i].Config->NETWORK = calloc(1, sizeof(NTC_config_network));
        DATA->pPayload[i].Config->NETWORK->NTC_NETWORK = calloc(1, sizeof(NTC_network));
        DATA->pPayload[i].Config->NTC_link_io = calloc(11, sizeof(NTC_io_trx_link));
        for(int j = 0; j < 11; j++){
            DATA->pPayload[i].Config->NTC_link_io[j].own_io = j + 1;
        }           
        DATA->pPayload[i].Data = calloc(1, sizeof(NTC_data));
        DATA->pPayload[i].Ack = calloc(1, sizeof(NTC_ack));
    }
    return DATA;
}

我正在分配2个pPayload。一个用于TX数据,另一个用于RX。所有这些都运行得很好,所以像这样赋值是没有问题的:

代码语言:javascript
复制
    NTC_runtime_data *pDATA;
    pDATA = init_struct_runtime_data();

然后,在我可能传递这个结构的任何地方,我可以像下面这样赋值:

代码语言:javascript
复制
pData->pPayload[0].Header->NET_ID = 0x20;

但我在尝试从包含数组作为缓冲区的结构中赋值时遇到了问题,如下所示:

代码语言:javascript
复制
typedef struct TRX_buffer{
    size_t used;
    size_t size;
    unsigned char *array;
}TRX_buffer;

并这样初始化和重新分配:

代码语言:javascript
复制
TRX_buffer* init_struct_trx_buffer(void){
    TRX_buffer *trx_buffer = malloc(sizeof(TRX_buffer));
    trx_buffer->array = malloc(4 * sizeof(unsigned char));
    trx_buffer->size = 4;
    trx_buffer->used = 0;
    return trx_buffer;
}
//inserts a byte of data in the buffer and dynamically allocates the buffer
void insert_array(TRX_buffer *trxbuffer, unsigned char data){
    if(trxbuffer->used == trxbuffer->size){
        trxbuffer->size *= 2;
        trxbuffer[0].array = realloc(trxbuffer[0].array, trxbuffer->size * sizeof(unsigned char));
    }
    trxbuffer[0].array[trxbuffer->used] = data;
    trxbuffer->used++;
}

所以问题是,在我的程序中的一些地方,在一个函数中,我创建了一个新的buffer实例,并从无线电中加载数据,我可以在调试时看到,我想将它加载到我的结构中,我这样做

代码语言:javascript
复制
NTC_payload* get_payload(NTC_payload *pPayload){    
    TRX_buffer *rx_buffer;
    rx_buffer = init_struct_trx_buffer();

    r_FIFO(rx_buffer);

    pDATA->pPayload[1].Header->NET_ID = trx_buffer->array[0];

正确的数据在我的r_FIFO()函数之后的trx_buffer中。但这不管用。我尝试过不同的方法。但是不能让它从我的buffer中获取值并将其分配给我的struct。

怎么啦??

EN

回答 1

Stack Overflow用户

发布于 2018-05-23 08:51:01

您没有从init_struct_runtime_data()返回任何内容,所以pDATA = init_struct_runtime_data();获取返回寄存器中发生的任何事情。

任何像样的编译器都应该标记这一点,如果你的编译器不帮你自己的忙,就把它卸载掉。

ps:在这里的某个地方有一个faq,它谈到了发布完整的程序,这样人们就可以用他们的工具尝试它们。这是一个好主意,因为简单地将问题简化为一个可发布的版本就可以揭示问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50471356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档