我最近参加了一次关于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++;
}