有什么方法可以用C巧妙地制作一个函数,使其在不同的参数值中执行不同的功能?

?

我必须创建2个结构,即矩形和椭圆形,其中矩形结构包含其长度和宽度,而椭圆形结构包含其半短轴和半长轴的长度。然后,我必须创建一个具有上述两个结构作为其成员的联合Shape。然后,我必须创建一个公共函数'area',该函数计算并集的面积(根据传递给该函数的参数,是矩形还是椭圆形)。我目前使用菜单驱动的方法和切换用例(问题后面的代码)处理了上述问题。

我想创建一个将联合作为参数并根据联合中存储的结构计算面积的智能函数。

代码

typedef struct rect{
    int l,b;
}r;
typedef struct oval{
    int x,y;
}o;
union shape{
    r r1;
    o o1;
}sh;
void area(int a);
void main()
{
    int ch;
    int a;
    printf(" 1.Area of rect\n 2.Area of oval\n 3.EXIT");
    while(1){
        printf("\nEnter your choice: ");
        scanf("%d",&ch);
        switch(ch)
        {
            case 1:a=0;
                area(a);
                break;
            case 2:a=1;
                area(a);
                break;
            default:printf("BYE\n");
                return;
        }
    }
}
void area(int a)
{
    if(a==0){
        printf("Enter Length and Breadth: ");
        scanf("%d %d",&sh.r1.l,&sh.r1.b);
        int ar=sh.r1.l*sh.r1.b;
        printf("%d",ar);
    }
    else if(a==1){
        printf("Enter x and y of Oval: ");
        scanf("%d %d",&sh.o1.x,&sh.o1.y);
        float ar=sh.o1.x*sh.o1.y;
        printf("%.2f",ar*3.14);
    }
}

提前谢谢!

z376769188 回答:有什么方法可以用C巧妙地制作一个函数,使其在不同的参数值中执行不同的功能?

作为有风险的(不是类型安全的)替代方法,并假设必须具有此功能,请考虑使用Type-Generic _Generic宏,该宏将允许您根据类型调度单个呼叫。

我必须承认,在10多年的C语言开发中,我从来没有遇到过证明使用此结构合理的情况-使用对多态性有适当支持的语言(c ++,Java)始终是首选。 / p>

#define area(shape) _Generic((shape),struct oval: oval_area,struct rect: rect_area)

typedef struct rect{
    int l,b;
}r;
typedef struct oval{
    int x,y;
}o;

int rect_area(struct rect v) {
        return v.l *  v.b ;
}

int oval_area(struct oval v) {
        return v.x * v.y * 2 ;
}

void main(void)
{
        struct rect r ;
        struct oval o ;

        area(r) ;
        area(o) ;
}
,

user3386109通过其他文章的链接描述了最安全的解决方案。
我非常建议使用这种方法。

但是,还有另一种选择,基于跟踪隐式表示哪种类型的联合中的哪种类型。 (我已经在这里How to verify if a void pointer (void *) is one of two data types?中描述了这个概念)。

联合基本上告诉编译器,它可能是这种类型,或者明确地表明,此变量/类型的编译器并不比程序员了解得更好(否则通常是这种情况)。因此,如果程序员指示编译器访问该联合成员或该联合成员,则编译器将相信它与最后写入的内容匹配。

在这种情况下,程序员必须比编译器更了解。
即这与程序员很容易误解联合的相反,而不是“我不需要知道那里的类型”。这意味着“我必须在每个点都知道其中有什么,因为我需要告诉编译器。”

现在使用变量的另一部分来跟踪存储的内容(由user3386109进行描述)的概念使该职责非常容易承担。
但是,如果您不遵循这种方法,那么知识可以而且必须仍然存在于其他地方。
例如,您可以将所有椭圆形存储在一个数组中,并将所有矩形存储在另一个数组中。从语法上讲,两者是相同的,但您只会用椭圆形阵列做椭圆形的事情,而只能用矩形阵列进行椭圆形的事情。
我之所以选择这个示例是因为它非常简单易懂,但我承认它并没有太多实际意义,因为那样的话,为这两个类型使用并集类型没有任何好处。
但是,它的确说明了类型信息在某处但隐式存在并且以某种形式存储的可能性在执行时间和内存消耗方面可能更有效率的可能性。

稍微复杂一些的数据结构(包含您的形状结构)可能更有意义。例如,用于气球的结构将以某种形状包含几何信息,并且永远不会质疑它是椭圆形(旋转椭圆形)还是矩形(方形框),也不会描述壁中的某些部分毫无疑问,需要纸张的房间。

本文链接:https://www.f2er.com/3091202.html

大家都在问