在我不应该的情况下在没有警告的情况下获得分配?
Getting assignment without cast warning when I shouldn't?
我正在写一个字符串拆分函数。
所以,函数正在执行它的工作。至少对于我所做的测试。
但是在编译过程中我得到
user/user_main.c:53:7: warning: assignment makes pointer from integer
without a cast [enabled by default] splt = str_split(&length,
pokusaj, ' ');
我不明白这是什么问题。稍后在我的代码中,我像往常一样使用 splt/length 并获得所需的结果。那么,为什么我会收到此警告?
如果我转换它,警告就会消失(很明显),但我不想转换它,函数 returns 它是什么 returns 所以我不需要转换结果。
代码:
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], '[=10=]', (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! "
我故意没说出问题的名字
warning: assignment makes pointer from integer without a cast [enabled
by default]
因为已经有很多了。如果这是一个问题,请说出来,我会相应地进行编辑。
此外,我主要对收到警告的原因感兴趣。感谢所有关于代码的建议(当然),但不是必需的。
P.S。我通常不会 post 这个问题(简单的解决方案),但这让我很烦,我想我遗漏了一些关键的东西!
函数调用和函数内容的类型确实匹配 returns。
所以,我认为出现该警告消息的原因是您没有为 str_split()
函数提供原型或声明。或者,至少当您调用 str_split()
.
时它不可用
因此,编译器假定 str_split()
returns int
(这是一个过时的约定。隐式函数声明 无效在 C 中自 C99).
在源文件顶部添加原型:
uint8_t** str_split(uint32_t* length, uint8_t* toSplit, uint8_t delimiter);
或者,您可以制作一个 header file 并将其包含在您的源文件中。如果函数 str_split()
在多个源文件中是 used/called,这是首选。
我正在写一个字符串拆分函数。
所以,函数正在执行它的工作。至少对于我所做的测试。
但是在编译过程中我得到
user/user_main.c:53:7: warning: assignment makes pointer from integer without a cast [enabled by default] splt = str_split(&length, pokusaj, ' ');
我不明白这是什么问题。稍后在我的代码中,我像往常一样使用 splt/length 并获得所需的结果。那么,为什么我会收到此警告? 如果我转换它,警告就会消失(很明显),但我不想转换它,函数 returns 它是什么 returns 所以我不需要转换结果。
代码:
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], '[=10=]', (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! "
我故意没说出问题的名字
warning: assignment makes pointer from integer without a cast [enabled by default]
因为已经有很多了。如果这是一个问题,请说出来,我会相应地进行编辑。
此外,我主要对收到警告的原因感兴趣。感谢所有关于代码的建议(当然),但不是必需的。
P.S。我通常不会 post 这个问题(简单的解决方案),但这让我很烦,我想我遗漏了一些关键的东西!
函数调用和函数内容的类型确实匹配 returns。
所以,我认为出现该警告消息的原因是您没有为 str_split()
函数提供原型或声明。或者,至少当您调用 str_split()
.
因此,编译器假定 str_split()
returns int
(这是一个过时的约定。隐式函数声明 无效在 C 中自 C99).
在源文件顶部添加原型:
uint8_t** str_split(uint32_t* length, uint8_t* toSplit, uint8_t delimiter);
或者,您可以制作一个 header file 并将其包含在您的源文件中。如果函数 str_split()
在多个源文件中是 used/called,这是首选。