我正在为我的学期项目创建一个程序,它采用.pbm格式的位图图像,通过贝塞尔曲线简化它,并以.eps格式输出结果。大学建议我们使用可变大小数组进行项目,并且已经给出了声明。
二次贝兹器的可变大小数组的结构是:
typedef struct TTV_Bezier2_
{
UINT nb;
UINT cap;
UINT taille_elt;
Bezier2 * tab;
}TTV_Bezier2;UINT是一种来自大学的声明,Bezier2是我创建的一种类型。它是二次Bezier在我的程序中由它的三个控制点定义的表示:
typedef struct Bezier_q
{
Point C0;
Point C1;
Point C2;
}Bezier2;Point是另一个ty胡枝子结构:
typedef struct Point_ {
double x,y;
} Point;下面是我的问题: Bezier2的可变大小数组是在名为TTV_Bezier.h的文件中定义的,而Bezier2类型是在名为bezier.h的文件中定义的。我已经将文件彼此包含在一起,因为它们每个文件都使用来自另一个文件的这些类型。但是,在编译时会出现以下错误:
gcc -c -g -O2 -Wall -I。test_simplification_bezier2.c文件包含在TTV_Bezier2.h:8中,来自test_simplification_bezier2.c:8: bezier.h:91:1: bezier.h:91:1: error:未知类型名称‘TTV_Bezier2 2’;您的意思是‘Bezier2 2’吗?simplification_douglas_peucker_bezier2(TTV_Point CONT,int j1,int j2,double d);
有人告诉我,Makefile内部的我的家属有问题,但我不这么认为,因为我已经将它们包含在正确的文件中。你能帮帮我吗?
文件:
TTV_Bezier2.h:
#ifndef _TTV_BEZIER2_H_
#define _TTV_BEZIER2_H_
#include <stdio.h>
#include <stdlib.h>
#include "types_macros.h"
#include "bezier.h"
typedef struct TTV_Bezier2_
{
UINT nb;
UINT cap;
UINT taille_elt;
Bezier2 * tab;
}TTV_Bezier2;
TTV_Bezier2 * creer_TTV_Bezier2_vide();
Bezier2 element_TTV_Bezier2(TTV_Bezier2 T, UINT i);
UINT nb_elements_TTV_Bezier2(TTV_Bezier2 * T);
TTV_Bezier2 * ajouter_element_TTV_Bezier2(TTV_Bezier2 * T, Bezier2 e);
TTV_Bezier2 * concatener_TTV_Bezier2(TTV_Bezier2 * T1, TTV_Bezier2 * T2);
void supprimer_TTV_Bezier2(TTV_Bezier2 *ptr_T);
#endif贝齐耶
#ifndef _BEZIER_H_
#define _BEZIER_H_
#include "TTV_Bezier2.h"
#include "TTV_Point.h"
#include "geom2d.h"
//Definition du type Bezier2
typedef struct Bezier_q
{
Point C0;
Point C1;
Point C2;
}Bezier2;
//Definition du type Bezier3
typedef struct Bezier_s
{
Point C0;
Point C1;
Point C2;
Point C3;
}Bezier3;
//Fonction qui calcule le point de la Bezier quadratique C(t) au parametre t
Point calculate_bezier_2(Bezier2 b, double t);
//Fonction qui calcule le point de la Bezier cubique C(t) au parametre t
Point calculate_bezier_3(Bezier3 b, double t);
//Fonction qui calcule la distance entre un point et une bezier quadratique
double distance_point_bezier2(Point P, Bezier2 B, double t);
//Fonction qui calcule la distance entre un point et une bezier cubique
double distance_point_bezier3(Point P, Bezier3 B, double t);
//Fonction qui calcule le factoriel d'un nombre
double factorial (int i);
//Fonction qui prend une Bezier quadratique et la transforme en Bezier cubique
Bezier3 convert_bezier2_to_3(Bezier2 b);
//Fonction qui calcule la base bernstein B(i,d,t)
double calculate_bernstein_base(int i, int d, double t);
//Fonction qui calcule γ(k)
double calculate_gamma(int i, int n);
//Fonction qui approxime la sequence de points CONT par une Bezier quadratique
Bezier2 approx_bezier2(Point * tab, int j1, int j2);
//Fonction qui approxime la sequence de points CONT par une Bezier cubique
Bezier3 approx_bezier3(Point * tab, int j1, int j2);
//Fonction qui simplifie le contour avec une Bezier cubique
Bezier3_t * simplification_douglas_peucker_bezier3(Point * CONT, int j1, int j2, double d);
//Fonction qui simplifie le contour avec une Bezier quadratique
TTV_Bezier2 * simplification_douglas_peucker_bezier2(TTV_Point CONT, int j1, int j2, double d);
#endif /* _BEZIER_H_ */test_simplification_bezier2.c:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "image_pbm.h"
#include "geom2d.h"
#include "TTV_Point.h"
#include "TTV_Bezier2.h"
#include "calcul_contours_multiples.h"
int main(int argc, char * argv[])
{
if (argc != 4)
{
printf("Usage: ./test_simplification_bezier <source.pbm> <destination.eps> <distance_seuil>\n");
return 0;
}
FILE * f;
double distance_seuil;
int i = 0;
Image M, P;
Point init;
TTV_Point contour;
TTV_Bezier2 * L;
L = creer_TTV_Bezier2_vide();
contour = creer_TTV_Point_vide();
f = fopen(argv[2], "w");
distance_seuil = atof(argv[3]);
//Lecture de l'image
M = lire_fichier_image(argv[1]);
//Creation de l'image masque
P = create_mask_image(M);
fprintf(f, "%%!PS-Adobe-3.0 EPSF-3.0\n%%%%BoundingBox: 0 0 %d %d\n0 setlinewidth\n", M.L, M.H);
while(is_empty(P) == -1)
{
init = trouver_point_init(P);
contour = trouver_pixel_depart_TTV(M,P,init);
while(i < nb_elements_TTV_Point(contour))
{
contour.tab[i].y = fabs((double) M.H - contour.tab[i].y);
i++;
}
i = 0;
L = simplification_douglas_peucker_bezier2(contour, 0, nb_elements_TTV_Point(contour) - 1, distance_seuil);
write_to_file_bezier2(L,f);
}
fprintf(f, "\nfill\nshowpage");
fclose(f);
return 0;
}发布于 2019-04-18 17:50:44
在bezier.h和TTV_Bezier2.h之间有一个循环依赖关系。
如果您认为prepocessor #include函数只是简单地将源代码简化为编译器的一个巨大文件,从main.c开始:
如果您想象编译器内存中扁平的预处理器输出,那么在提到TTV_Bezier之前就会出现bezier.h的内容,因此您将看到所看到的错误。
要解决这个问题,您可以:
TTV_Bezier2 * simplification_douglas_peucker_bezier2原型移动到TTV_Bezier2.h发布于 2019-04-18 17:50:35
在TTV_Bezier2.h中包含bezier.h,在bezier.h中包含TTV_Bezier2.h,这是问题的根源
但是在bezier.h中,您不需要知道TTV_Bezier2的确切定义,因为您只通过指针引用它,所以在bezier.h中:
#include "TTV_Bezier2.h"struct TTV_Bezier2_;simplification_douglas_peucker_bezier2的返回类型替换为struct TTV_Bezier2_ *并在需要时将#include "TTV_Bezier2.h"添加到源中
https://stackoverflow.com/questions/55750932
复制相似问题