3

次のように関数を宣言して定義します。

unsigned int doSomething(unsigned int *x, int y)
{
    if(1) //works
    if(y) //reports the error given below

    //I use any one of the ifs above, and not both at a time

    return ((*x) + y); //works fine when if(1) is used, not otherwise
}

次のように main() から関数を呼び出します。

unsigned int x = 10;
doSomething(&x, 1);

コンパイラは、次のようにエラーと警告を報告します。

passing argument 1 of 'doSomething' makes pointer from integer without a cast [enabled by default]|

note: expected 'unsigned int *' but argument is of type 'int'|

関数の戻り値の型、関数呼び出し、および引数の型について、考えられるすべての組み合わせを使用してみました。どこが間違っていますか?

完全なコード:

unsigned int addTwo(unsigned int *x, int y)
{
    if(y)
        return ((*x) + y);
}
int main()
{
    unsigned int operand = 10;
    printf("%u", addTwo(&operand, 1));
    return 0;
}
4

3 に答える 3

2

main()で明示的に宣言してみてください

適切に宣言されていない場合、コンパイラはデフォルトでintを返すと見なします

于 2013-02-25T10:12:26.023 に答える
1

Windowsでもgcc 4.4.3を使用しました。
このプログラムは正常にコンパイルされ、出力 "11" が生成されます。

#include <stdio.h>

unsigned int doSomething(unsigned int *x, int y);

int main()
{
    unsigned int res = 0;
    unsigned int x = 10;

    res = doSomething(&x, 1);

    printf("Result: %d\n", res);

    return 0;
}

unsigned int doSomething(unsigned int *x, int y)
{
    if(y)
    {
        printf("y is ok\n");
    }

    if(1)
    {
        printf("1 is ok\n");
    }

    return ((*x) + y); 
}

これが機能するかどうかを確認してから、プログラムと比較してください。
関数が適切に宣言されていることを確認してください。

于 2013-02-25T10:14:21.527 に答える
1

署名unsigned intされた (y) に追加された (x)を返しています。2 番目のオペランド (y) をキャストしないと、この関数でのみ返す場合、未定義の動作が発生する可能性があります。intintunsigned int

于 2013-02-25T10:16:38.803 に答える