数据类型问题导致值无法“分配”。可能出现指针问题?

时间:2018-08-07 20:00:40

标签: c pointers types variable-assignment

我再也不能在这个混杂的错误上浪费一天了。你能帮忙吗?这是代码。有些细节可能会误入歧途,但是,在解决此错误之前,我无法进行编译。

int main(int argc, string argv[])
{
    string note = argv[1];

    int frequency(string note);
    int duration(string fraction);

    if (argc == 2)
    {
       // create new string with last 3 chars in string note

        string fraction = note + strlen(note) - 3;
        printf("(%.3s)\n", fraction);

        // transform char into integer.. poof!

        int x = atoi(&fraction[0]);
        int y = atoi(&fraction[-1]);

       // calculate integer from x & y values

        duration = x * (8 / y);
        printf("%i\n", duration);


    }
    else
    {
        printf("Two (2) arguments!\n");
        return 1;
    }


}

和错误消息..

duration.c:61:18: error: non-object type 'int (string)' (aka 'int (char *)') is not assignable
        duration = x * (8 / y);

        ~~~~~~~~ ^
duration.c:62:24: error: format specifies type 'int' but the argument has type 'int (*)(string)' (aka 'int (*)(char *)') [-Werror,-Wformat]
        printf("%i\n", duration);

1 个答案:

答案 0 :(得分:2)

您已将duration声明为函数,该函数接受一个stringchar *)参数并返回一个int

int duration(string fraction);

函数表达式确实不可分配-函数不能成为=运算符的目标,因此

上的错误
duration = x * (8 / y);

如果您希望duration只是一个整数变量,请将其声明为

int duration;

<无偿之声>

string标头中的cs50.h typedef是一个错误,当考虑C语言中的字符串操作时,它会会使误入歧途。它使C语言中的字符串操作看起来比实际的更高级。

C中的

A string 是字符值的序列,后跟一个0值的终止符。字符串存储在char的数组中。在大多数情况下,类型为“ T的数组的表达式将被转换(“衰变”)为类型为“指向T的指针”的表达式,因此,当我们处理字符串时,通常会处理类型为char *表达式,但是char *不是字符串 char * 可以指向字符串中的第一个字符,或者可以指向不是字符串的序列中的第一个字符,或者可以指向单个字符不是更大序列的一部分。

C字符串操作极其很低。 string typedef显然是对其中一部分进行抽象的尝试,但这充其量只是一个薄弱,漏水的抽象,而在最坏的情况下,它是积极学习C中适当的字符串处理技术的障碍。使用时请务必确实。

编辑

然后看起来您想要执行的操作是这样的:

/**
 * Define the duration function to compute x * 8/y
 */
int duration( char *frac )
{
  int x = atoi( frac );
  int y = atoi( frac - 1 );

  return x * (8 / y);
}

int main( int argc, char **argv )
{
  // yadda yadda yadda

    char *fraction = note + strlen(note) - 3;
    printf("(%.3s)\n", fraction);

    printf("%i\n", duration( fraction ) ); // call duration with
                                           // fraction as an argument
  // yadda yadda yadda
}