错误:二进制文件的操作数无效*

时间:2015-07-29 13:18:25

标签: c

#include <stdio.h>
#include <string.h>
#include <math.h>
int main ()
{
  char buf[] ="14:15:43";
  int i;
  char *p;
  int *array[3];
  i = 0;
   p = strtok (buf,":");  
  while (p != NULL)
  {
   array[i++] = p;
    p = strtok (NULL, ":");
  }
  for (i=0;i<3; ++i) {
    //printf("%s\n", array[i]);
    array[i] = array[i] * 2;
 } 
return 0;
}

当我编译上面的代码时,我收到此错误:

split.c: In function ‘main’:
split.c:16:16: warning: assignment from incompatible pointer type
     array[i++] = p;
                ^
split.c:21:25: error: invalid operands to binary * (have ‘int *’ and ‘int’)
     array[i] = array[i] * 2;
                         ^

3 个答案:

答案 0 :(得分:3)

关于error

在您的代码中,array[i]的类型为int *,不能用作乘法运算符的操作数。

引用标准,章节§6.5.5,乘法运算符

  

每个操作数都应具有算术类型。

~~~~ 见注释 ~~~~~

关于warning

那就是说,

 array[i++] = p;

看起来非常错误。 array[n]的类型为int *p的类型为char *,且它们不是兼容的类型。你可能想再次检查你的逻辑。

<强>解决方案

看起来,您希望对字符串内容的 numeric 值执行算术运算。仅供参考,只需将char *转换为int *,就不会将的字符串内容显示为 int

为此,您需要先将字符串转换为算术类型,例如intlongstrtol()可能是你的帮助。

[注]

算术类型:

引用C11,章节§6.2.5,

  

整数和浮点类型统称为算术类型。

答案 1 :(得分:1)

这里有一些错误:

您将数组定义为int *array[3],即int *数组,但您可能想要的是int array[3],即int数组。< / p>

接下来,如其他地方所述,array[i++] = p无效,因为您尝试将char *分配给int *(或int,如果您是第一个应用第一个修复),这是无效的。您希望使用atoi将字符串转换为整数array[i++] = atoi(p)

最后,printf循环中注释掉的for应该使用%d作为格式说明符而不是%s,因为数组包含int 。您可能还希望在array[i] = array[i] * 2之后将其向下移动一行。

通过以上更改,您现在拥有:

#include <stdio.h>
#include <string.h>
#include <math.h>
int main ()
{
  char buf[] ="14:15:43";
  int i;
  char *p;
  int array[3];
  i = 0;
   p = strtok (buf,":");
  while (p != NULL)
  {
   array[i++] = atoi(p);
    p = strtok (NULL, ":");
  }
  for (i=0;i<3; ++i) {
    array[i] = array[i] * 2;
    printf("%d\n", array[i]);
 }
return 0;
}

哪个输出:

28
30
86

答案 2 :(得分:0)

这也可能意味着完全不同的东西。考虑“无效操作数”的含义。我在

上获得它
fftout[lochead][i][0] * fftout[lochead][i][0]

当我忘记[i]条款时。我有10个缓冲区,每个缓冲区有4096个元素,每个缓冲区有2个元素。我没有足够的索引。

是的,我只是对数字求平方。它是平方和解调步骤平方根的一部分。