我最近参加了一次关于C语言的考试,因为我考得不好,有一个练习我想请你们帮忙.整个测试围绕两个 struct "point"和"Polygon"展开:point的x和y坐标有两个双精度值,Polygon的点个数有一个int值,点列表有一个指向指针的指针.

typedef struct Punto{
double x;
double y;
}punto;
punto origine = {.x =0, .y =0};

typedef struct Poligono{
int numeroPunti;   //numbers of points
punto *punti;
}poligono;
poligono poligonoNullo = {.numeroPunti = 0, .punti = NULL};

然后我被要求创建各种函数来解决不同的任务,其中一个是"aggiungiPto"(添加一个点),它将一个点和一个多边形作为输入,并将给定的点添加到"Polygon.Punti"中.我try 创建此函数的步骤如下

void aggiungipunto(punto p, poligono poli){

punto *prova;
prova = calloc(poli.numeroPunti +1, sizeof(punto));
for(int i=0; i<poli.numeroPunti;i++){
    prova[i]=poli.punti[i];
}
poli.numeroPunti++;
prova[poli.numeroPunti -1] = p;
poli.punti = &prova[0];
}

...不起作用:如果我试图打印函数内部的多边形(我有一个"StamPapopolono",printPolygon函数,它只是列出了所有的点并正常工作),我会看到 代码做了我想要做的,但是如果我try 在我的main函数中打印多边形,它就像什么都没有追加一样.我相信这与c中的函数如何获取参数的副本有关,但我不知道如何解决这个问题.

为了了解更多上下文,这里是主要函数以及我是如何测试的:

int main(){

punto a = {.x =1, .y = 2};  
punto b = {.x = -1, .y = 2};

punto arraystatico[] = {origine, a, b}; 

poligono prova = poligonoNullo;
    prova.numeroPunti = 3;
    prova.punti = (punto *)calloc(prova.numeroPunti, sizeof(punto));

    for(int i=0;i < prova.numeroPunti ;i++){
        prova.punti[i] = arraystatico[i];
    }

printf("Poligono iniziale:\n");
stampapoligono(prova);

punto c = {.x = 12, .y =3};
aggiungipunto(c, prova);

printf("Stampa esterna: \n");
stampapoligono(prova);
free(prova.punti);
return 0;
}

这就是StamPapopolono是如何工作的

void stampapunto(punto p){
   printf("Coordinata x: %lf\tCoordinata y: %lf\n", p.x, p.y);
}

void stampapoligono(poligono poli){
   if (poli.numeroPunti ==0){
       printf("Il poligono non ha punti\n");
   }
   else{
      for(int i=0; i<poli.numeroPunti;i++){
        stampapunto((poli.punti)[i]);
        printf("\n");
      }
   }
}

编辑:我也try 了这个代码,它使用realloc来处理aggiungiputo,但结果是一样的:

void aggiungipunto(punto p, poligono poli){

punto *prova;
prova = calloc(poli.numeroPunti, sizeof(punto));
for(int i=0; i<poli.numeroPunti;i++){
    prova[i]=poli.punti[i];
}

poli.punti = (punto *)realloc(poli.punti, poli.numeroPunti+1);
for(int i=0; i<poli.numeroPunti;i++){
    poli.punti[i]=prova[i];
}

(poli.punti)[poli.numeroPunti] = p;
poli.numeroPunti++;
}

推荐答案

函数aggiungipunto将通过指向原始对象prova的指针引用来访问该原始对象prova.否则,该函数将处理原始对象的副本并更改副本.原始对象将保持不变.

此外,该函数还应向调用者报告成功添加新点的位置.

并且第一个参数的类型应为poligono *.

因此,函数声明应该如下所示

int aggiungipunto( poligono *poli, punto p );

因为点数的内存是动态分配的,所以你应该使用函数realloc.

该函数可能如下所示

int aggiungipunto( poligono *poli, punto p )
{
    punto *tmp = realloc( poli->punti, ( poli->numeroPunti + 1 ) * sizeof( punto ) );

    int success = tmp != NULL;

    if ( success )
    {
        poli->punti = tmp;
        poli->punti[poli->numeroPunti++] = p;
    }

    return success;
}

并且该函数被称为LIKE

aggiungipunto( &prova, c );

if ( !aggiungipunto( &prova, c ) )
{
    puts( "Err或. No enough mem或y." );
}

此外,函数stampapoligono应该声明如下

void stampapoligono( const poligono *poli );

that is the 或iginal object should be passed by reference as a constant object through a pointer to it.

And my advice use English w或ds f或 identifier names.

C++相关问答推荐

GCC:try 使用—WError或—pedantic using pragmas

不同到达时间的轮询实现

exit(EXIT_FAILURE):Tcl C API类似功能

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

在C++中访问双指针

如何编写一个for循环来计算C中各项的总和?

I2C外设在单次交易后出现故障

使用nmake for程序比Hello World稍微复杂一些

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

我可以创建适用于不同endian的 colored颜色 struct 吗?

将非连续物理内存映射到用户空间

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

C编译和运行

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

生成的头文件不包括用户定义的文件

C中2个数字的加法 - 简单的人类方法

C simd _m128 晶圆厂

当 a 是代码块时使用逗号运算符 (a, b)