2016-08-19 34 views
0

我有混淆问题。我从来没有面对过它。 我正在使用Eclipse CDT。 我读了不同的解决方案,但我无法找到合适的解决方案。警告!解引用打字指针会打破严格别名规则[-Wstrict-aliasing]

我警告

提领型punned指针将打破严格走样规则[-Wstrict走样]

所以,我有以下的代码和平:

timestamp = st0 % 100000000; 

for (std::list<struct trace *>::iterator it = frame_list.begin(); 
    it != frame_list.end(); 
    ++it) { 
    struct my_rtppacket *packet = NULL; 
    packet = new struct my_rtppacket; 

    packet->ts = (int32_t)((*it)->time * 1000000); 
    packet->seq = count_seq; 

    //In the following two strings I have the warnings :(

    *(uint16_t*) (packet->buf + 2) = htons(packet->seq); 
    *(int32_t*) (packet->buf + 4) = htonl(packet->ts + timestamp); 

    insert_data_to_list(packet); // This function inserts packets to list} 
} 

结果在packet->buf + 2packet->buf + 4中存在错误的值。

请!帮我解决这个问题!

编辑 我想知道什么是错的...结构my_rtppacket是这样定义的:

{ 
struct my_rtppacket 
{ 
public: 
    my_rtppacket():dump_ts(0), payloadlen(0),packetlen(0),ts(0), seq(0), seq_fr(0), frame_number(0), 
    erase(NUM, INIT), path(NUM, INIT), create_time(0), alloc_time(0), before_create(0), sent_flag(0){} 
    uint32_t dump_ts; /*timestamp of RTP dump. It is similar to timestamp of packet generation from the application*/ 
    int payloadlen; 
    int packetlen; 
    int32_t ts;   /*timestamp in RTP file*/ 
    uint16_t seq;  /* Sequеnce number in video sequence*/ 
    int seq_fr;   /* Sequеnce number in a frame*/ 
    int frame_number; 
    char buf[1600]; 
    std::vector <path_t> erase; 
    std::vector <path_t> path;  //Declare a vector of path_type elements 
    char frame_type[10]; 
    int64_t create_time; 
    int64_t alloc_time; 
    int64_t before_create; 
    int sent_flag; 

}; 

} 
+3

那个指针算术,重新解释演员等肯定看起来阴暗。但是,您需要向我们提供“struct my_rptpacket”的定义。 –

+0

我不知道一个压缩结构(或2为endianess)会更好。或者可能创建一个函数来填充结构数据中的缓冲区... –

+0

顺便说一句,你如何看待这些值是错误的? –

回答

1

你应该使用类似下面要不要打破严格走样规则:

const uint16_t nseq = htons(packet->seq); 
const uint32_t nts = htonl(packet->ts + timestamp); 
memcpy(packet->buf + 2, &nseq, 2); 
memcpy(packet->buf + 4, &nts, 4); 
+0

这个解决方案没问题,但是可以检查写入packet-> buf + 2的内容吗? –

+0

@EkaterinaPakulova如果你仍然想测试写入'packet-> buf'的方法,使用建议的方法来回读并验证:'memcpy(&nseq_test_var,packet-> buf + 2,2);' –

相关问题