2017-03-16 54 views
2

我在写一个字符串分割函数。我不应该在没有施放警告的情况下获得分配?

因此,功能做的工作。至少在我做的测试中。

但在编译过程中,我得到

用户/ user_main.c:53:7:警告:赋值时将整数 指针,未作铸造SPLT = str_split(&长度[默认启用], pokusaj,'');

我不明白是什么问题。后来在我的代码中,我通常会使用splt/length并获得所需的结果。那么,为什么我会收到此警告? 如果我投它,警告消失(明显),但我不想丢,函数返回它返回什么,所以我不应该需要转换的结果。

代码:

uint8_t** str_split(uint32_t* length, uint8_t* toSplit, uint8_t delimiter){ 
    uint8_t* curr = toSplit; 
    uint8_t** poses = (uint8_t**) os_malloc(sizeof(uint8_t*)*STRTOK_MAX_LEN); 
    uint32_t pos = 0; 
    uint32_t len; 
    uint8_t** dst; 

    os_printf("String:--%s--\n", toSplit); 

    while(pos < STRTOK_MAX_LEN) poses[pos++] = NULL; 

    pos = 0; 
    poses[pos++] = curr; 
    curr++; 
    while((curr = os_strchr(curr, delimiter)) != NULL && pos < STRTOK_MAX_LEN){ 
     poses[pos++] = curr; 
     curr++; 
    } 

    if(pos == 0) return 0; 
    dst = (uint8_t**) os_malloc(sizeof(uint8_t*) * (pos)); 

    pos = 0; 
    while(pos < STRTOK_MAX_LEN-1 && poses[pos] != NULL){ 
     if(poses[pos+1] != NULL){ 
      len = (poses[pos+1] - poses[pos]); 
      if(poses[pos][0] == delimiter) 
       len -= 1; 
     } 
     else{ 
      len = os_strlen(toSplit) - (poses[pos]-toSplit) - 1;  
     } 

     if(len > 1){ 
      dst[pos] = (uint8_t*) os_malloc(len+1); 
      os_memset(dst[pos], '\0', (len+1)); 
      if(poses[pos][0] == delimiter) 
       os_memcpy(dst[pos], poses[pos]+1, len); 
      else 
       os_memcpy(dst[pos], poses[pos], len); 
      os_printf("Length:%d\n", len); 
      os_printf("Item:--%s--\n", dst[pos]); 
     } 
     else{ 
      dst[pos] = NULL; 
     } 

     pos++; 
    } 

    *length = pos; 

    return dst; 
} 

我打电话这样说:

uint32_t length = 0; 
uint8_t** splt; 
splt = str_split(&length, pokusaj, ' '); 

os_printf("len=%d\n", length); 
os_printf("splt=%u\n", splt); 
uint32_t i; 
for(i=0; i<length; i++){ 
    os_printf("printing %d\n", i); 
    if(splt[i] != NULL) os_printf("splt[%d]=%s\n", i, splt[i]); 
} 

pokusaj:

#define pokusaj "NEKI string Koji je Maximalno Random! " 

我故意没名字的问题

警告:赋值时将整数指针没有施放[默认启用 ]

因为那里已经有很多人。如果这是一个问题,请说,我会相应地编辑它。

而且,我在为什么我得到警告感兴趣。所有关于代码的建议都受到赞赏(当然),但并非必要。

P.S.我不会正常地发布这个问题(简单的解决方案),但是这使我很害怕,我想我错过了一些关键的东西!

+0

这是一个非常复杂的*分裂*功能,你应该考虑重写它。 –

+0

还有其他警告吗? –

+0

@IharobAlAsimi我知道,但没多少时间考虑它。没有其他警告。试图找到它的源代码,但不能。我没有大部分C函数(在espressif上工作)。这样做的工作,并不会经常这么叫,所以我想这没关系。只有时间会告诉。 –

回答

7

类型不匹配的函数调用,什么都函数返回。 所以,我相信,该警告消息的原因是你没有为str_split()功能提供原型或声明。或者,至少在拨打电话str_split()时不可用。

其结果,编译器假定str_split()返回int(这是一个过时的约定。隐函数声明无效用C自C99)。

在源文件的顶部添加了一个原型:

uint8_t** str_split(uint32_t* length, uint8_t* toSplit, uint8_t delimiter); 

或者,你可以做一个header file并将其包含在你的源文件。如果在多个源文件中使用/调用功能str_split(),这是首选。

+0

就是这样。我忘了包含标题S:愚蠢的我。谢谢。 –

+1

用'-Werror-implicit-function-declaration'编译器选项添加(GCC)来检测这样的错误更容易 - 我从不编译C代码... – Aconcagua

+0

好点。我有空的时候会看到它。打破所有截止日期): –

相关问题