C Struct问题

时间:2010-11-03 18:21:02

标签: c

我一直在寻找这个问题的答案,但无法弄明白。

我有一个结构:

typedef struct  {
    BYTE  hour;      
    BYTE  minute;    
    BYTE  second;   
    BYTE  dom;     
    BYTE month;
    BYTE year;      
} t_time_date ;

串口接收功能:

g_curr_td.year = g_rx_buffer[3];
g_curr_td.month = g_rx_buffer[4];
g_curr_td.dom = g_rx_buffer[5];
g_curr_td.hour = g_rx_buffer[6];
g_curr_td.minute = g_rx_buffer[7];
g_curr_td.second = g_rx_buffer[8];

我已验证g_rx_buffer是否正确且包含数据。如果我硬编码一个数字到变量它的工作原理:

g_curr_td.year = 10;  /* this works */

但是,运行实时数据会崩溃并且似乎在内存中的其他位置写入数据。任何人都可以在我的设置中看到错误吗?

感谢。

6 个答案:

答案 0 :(得分:1)

g_rx_buffer是否至少有9个BYTE数据?

答案 1 :(得分:1)

虽然我可能不会直接回答您的问题,但这可能有助于您获得更清晰的代码:

有传入数据格式的结构:

typedef struct  {
    BYTE  year;      
    BYTE  month;    
    BYTE  dom;   
    BYTE  hour;     
    BYTE  minute;
    BYTE  second;      
} t_time_input_date __attribute__((packed));


// First you can make sure the data is received in its whole
assert(g_rx_length >= sizeof(t_time_input_date) + 3);

t_time_input_date *in_date = (t_time_input_date *)(g_rx_buffer+3);

g_curr_td.year = in_date->year;
g_curr_td.month = in_date->month;
g_curr_td.dom = in_date->dom;
g_curr_td.hour = in_date->hour;
g_curr_td.minute = in_date->minute;
g_curr_td.second = in_date->second;

这样你的代码就会更干净,并且会在3个月内帮助你。

答案 2 :(得分:1)

出于调试目的,您可以尝试创建一个为所有结构成员提取参数的函数,例如:

/* Assumes g_curr_td is a global variable. */
void FillStruct( BYTE hour, BYTE minute, BYTE second, BYTE dom, BYTE month, BYTE year )
{ 
    g_curr_td.year = year;
    g_curr_td.month = month;
    g_curr_td.dom = dom;
    g_curr_td.hour = hour;
    g_curr_td.minute = minute;
    g_curr_td.second = second;
}

使用这样的函数应该使汇编代码相同,无论您是使用缓冲区中的值还是常量表达式。如果它仍然崩溃,它可能与你的缓冲区有关,即使你似乎已经检查了我能想到处理缓冲区的所有角度。

您可以将此函数称为FillStruct( g_rx_buffer[3], g_rx_buffer[4], g_rx_buffer[5], g_rx_buffer[6], g_rx_buffer[7], g_rx_buffer[8] ),如果崩溃,请将其称为FillStruct( a, b, c, d, e, f ),其中a,b,c,d,e和f是原始参数或新常量参数。尝试一次更换一个参数,看看它是否只是一个失败的特定字段,或者是否是任何失败的字段。

编辑:此外,typedef类型的#defineBYTE究竟是什么,您使用的编译器和操作系统是什么,并且您使用的是任何编译指示,例如将结构打包为字节对齐?

答案 3 :(得分:0)

您是否有任何系统可以通过串口获取数据?你怎么保证g_rx_buffer [3]真的是g_curr_td.year?

答案 4 :(得分:0)

我在这里看到的唯一错误来源是g_rx_buffer上的访问权限。 g_rx_buffer中的数组是否足够大?

也许你可以循环遍历g_rx_buffer并向我们展示这个数组的内容。

答案 5 :(得分:0)

什么是g_rx_buffer?如果它不是BYTE数组而不是指向BYTE的指针,则g_rx_buffer[3]((BYTE*)g_rx_buffer)[3]不同。

相关问题