簡體   English   中英

返回指向函數錯誤的指針

[英]Return Pointer to Function Errors

我被要求編寫一個代碼,該代碼將使用指針將3個輸入的整數重新排列為升/降序。

我需要使用函數order()返回指向函數ascending3()descending()的指針,具體取決於輸入的'e'值。

我在readInts()函數中指定的行上不斷收到錯誤,並且不確定如何解決它。

錯誤

lvalue required as unary ‘&’ operand" --  The error  for `ptr = &(order(e))`

warning: assignment makes pointer from integer without a cast -- The error for `ptr=order(e)`

指針代碼

void readInts(){

int *a,*b,*c;
char e;
int (*ptr1)(int*,int*,int*);
int result;

    printf("Enter Integer 1:");
    scanf("%d", a);
    printf("Enter Integer 2:");
    scanf("%d", b);
    printf("Enter Integer 3:");
    scanf("%d", c);
    printf("Enter either A or D:");
    scanf(" %c", &e);

    ptr1 = &(order(e));        /*ERROR HERE*/
    result  = (*ptr1)(a,b,c);

    printf("%d %d %d", a, b, c);
    }

職能

int ascending3(int* x, int* y, int* z)
{

/*removed sorting code for the sake of shortening the question*/

*x=smallest;
*y=middle;
*z=largest;

}

int descending(int* x, int* y, int* z)
{
int swap;

ascending3(x,y,z);

swap=*x;
*x=*z;
*z=swap;
}

int (*order(char e))(int*x ,int*y,int*z)
{ 

if(e=='a')
{
    return ascending3;
}
else if(e =='d')
{
    return descending;
}
return;
}

函數不能返回函數。 因此,您不能將運算符( & )的address of應用於函數的結果(以檢索地址)。 但是函數可以返回指向函數的指針。

C語言中的函數名稱(由&運算符添加或未添加前綴)始終設置為該函數的地址,即該函數的指針。

正確的代碼是:

int ascending3(int *x, int *y, int *z);
int descending(int *x, int *y, int *z);

typedef int (*fn)(int *x, int *y, int *z);

fn order(char e)
{

    if (e == 'a')
    {
        return ascending3;
    }
    else if (e == 'd')
    {
        return descending;
    }
    return NULL;
}

void readInts(void)
{

    int *a, *b, *c;
    char e;
    fn ptr1;
    int result;

    printf("Enter Integer 1:");
    scanf("%d", a);
    printf("Enter Integer 2:");
    scanf("%d", b);
    printf("Enter Integer 3:");
    scanf("%d", c);
    printf("Enter either A or D:");
    scanf(" %c", &e);

    ptr1 = order(e);
    result = (*ptr1) (a, b, c);

    printf("%p %p %p", a, b, c);
}

我在哪里使用typedef聲明函數指針的類型(還有2個用於排序函數的原型)。

如果您希望使用星號更好地顯示我們類型的指針性質,則可以將fn定義為函數(而不是指向函數的指針):

typedef int (fn)(int *x, int *y, int *z);

因此,您可以使用星號表示法:

typedef int fn(int *x, int *y, int *z);

fn *order(char e)
{

    if (e == 'a')
    {
        return ascending3;
    }
    else if (e == 'd')
    {
        return descending;
    }
    return NULL;
}

void readInts(void)
{

    int *a, *b, *c;
    char e;
    fn *ptr1;
    int result;

    printf("Enter Integer 1:");
    scanf("%d", a);
    printf("Enter Integer 2:");
    scanf("%d", b);
    printf("Enter Integer 3:");
    scanf("%d", c);
    printf("Enter either A or D:");
    scanf(" %c", &e);

    ptr1 = order(e);
    result = (*ptr1) (a, b, c);

    printf("%p %p %p", a, b, c);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM